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(),为什么?

解决方案 »

  1.   

    static是静态的,永久在内存的
    去掉之后,类没有实例化前是不能调用的
      

  2.   

    必须先实例化才能调用非static静态方法。
    而你用在另外的static方法是行不通的,必须实例化。
    假如在一个类中非static方法(当然不可能是main方法了)中这样样调用是合理的得,是因为创建类的时候已经实例化了该对象。我也写得不清楚,反正就是不能在静态方法中调用非静态方法。一个需要实例化,而一个不需要显然不合理。
      

  3.   

    我给你解释一下啊,如果一个方法前面加了static修饰符的话,那么说明该方法是静态的方法,所以不实例化类就直接可以调用,如果去掉的话就必须实例化类,然后才能引用
      

  4.   

    public class Animal 

    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.方法名()
      

  5.   

    static是静态的,永久在内存的
    去掉之后,类没有实例化前是不能调用的
      

  6.   

    首先在构造的时候,对象还没产生,没有产生的时候非静态的方法是不可用的,所以把static 去掉的话,在构造的时候就不能用这个方法了...
      

  7.   

    如果去掉static  那么makeRandomName方法就变成了一个实例方法,
    也就是说他只能被该类的实例调用。所以会编译错误。
      

  8.   

    道理就和:
    int b = a;
    int a =10;一样简单...
      

  9.   

    1. 在构造函数执行完之前说明对象还没创建完,所以无法调用对象的实例方法
            构造方法没调用完前可以调用实例方法,如下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,但带来的问题是代码可读性非常差(而带来的性能提升完全可忽略不计)。