public class Animal {
String name;
Animal(String name){
this.name=name;
}
Animal() {
this(makeRandomName());
}
static String makeRandomName(){ // satic
int x=(int)(Math.random()*5);
String name=new String[]{"Fluffy","Fido","Rover","Spike","Gigi"}[x];
return name;
}
public static void main(String args[]) {
Animal a=new Animal();
System.out.println(a.name);
Animal b=new Animal("Zeus");
System.out.println(b.name);
}
}
请问如果把makeRandomName()的static去掉,编译错误,说在调用超类构造函数前无法调用makeRandomName(),为什么?
String name;
Animal(String name){
this.name=name;
}
Animal() {
this(makeRandomName());
}
static String makeRandomName(){ // satic
int x=(int)(Math.random()*5);
String name=new String[]{"Fluffy","Fido","Rover","Spike","Gigi"}[x];
return name;
}
public static void main(String args[]) {
Animal a=new Animal();
System.out.println(a.name);
Animal b=new Animal("Zeus");
System.out.println(b.name);
}
}
请问如果把makeRandomName()的static去掉,编译错误,说在调用超类构造函数前无法调用makeRandomName(),为什么?
去掉之后,类没有实例化前是不能调用的
而你用在另外的static方法是行不通的,必须实例化。
假如在一个类中非static方法(当然不可能是main方法了)中这样样调用是合理的得,是因为创建类的时候已经实例化了该对象。我也写得不清楚,反正就是不能在静态方法中调用非静态方法。一个需要实例化,而一个不需要显然不合理。
{
String name;
Animal(String name)
{
this.name=name;
}
Animal()
{
this.makeRandomName();
}
String makeRandomName()
{ // satic
int x=(int)(Math.random()*5);
String name=new String[]{"Fluffy","Fido","Rover","Spike","Gigi"}[x];
return name;
}
public static void main(String args[]) {
Animal a=new Animal();
System.out.println(a.name);
Animal b=new Animal("Zeus");
System.out.println(b.name);
}
}
就算没有了static 看我那个无参数的构造器的修改是this.方法名()
去掉之后,类没有实例化前是不能调用的
也就是说他只能被该类的实例调用。所以会编译错误。
int b = a;
int a =10;一样简单...
构造方法没调用完前可以调用实例方法,如下public class Test {
public Test() {
demo(); //或 this.demo();
//Do something
}
public demo() {
//Do something
}
}2. static是静态的,永久在内存的
Java的一个特点是动态加载,即除核心类例如 String 外其它类都是在需要用其创建实例时才加载(将class文件中的字节码读取到内存中的过程),加载后静态域才创建(才占用内存空间)此后静态方法就可以调用了,当然此过程是JVM自动完成的,所以我们在使用时没感觉到它的执行过程。
3. 不能在静态方法中调用非静态方法
可以在静态方法中调用实例方法(非静态方法),但得指定调用的是哪个实例(对象)的实例方法。例如public class Test {
public demo() {
//Do something
}
public static void test() {
Test t = new Test();
t.demo();
}
}4. 你的无参数构造函数得到的返回值赋给谁?
他是想说明“构造方法没调用完前可以调用实例方法”见 1。另外说明一下
String name=new String[]{"Fluffy","Fido","Rover","Spike","Gigi"}[x];
相当于 String[] names = new String[] {"Fluffy", "Fido", "Rover", "Spike", "Gigi"};
String name = names[x]; 最好不要这样用,当然这么做可节省一个对象变量 names,但带来的问题是代码可读性非常差(而带来的性能提升完全可忽略不计)。