先看程序:class A{
A(int i){
System.out.println("A("+i+")");
}
}
class B{
static A a1 = new A(1); // 1
B(int i){
System.out.println("B("+i+")");
}
A a2 = new A(3); //3,5
static A a3 = new A(2); //2
}
class C{
B b1 = new B(2); //6
C(int i){
System.out.println("C("+i+")");
}
static B b2 = new B(1); //4
}
public class temp {
public static void main(String[] args) {
System.out.println("public static void main(String[] args)"); //8
}
C c1 = new C(2); //here
static C c2 = new C(1); //7
}注释的数字是输出的顺序。初始化的顺序是先“静态”对象(如果它们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象。
这是书上的原话,可是//here这行到最后根本没有初始化啊?(结果中没有C(2))请问为什么?

解决方案 »

  1.   

    C(2)不是静态对象,你没创建temp对象,当然不会初始化C(2)了
      

  2.   

    好麻烦的对象树, 你说的很好 
     “静态”对象(如果它们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象” 
    不如这样:把静态对象该为静态成员static field, 非静态对象改为实例instance field成员。 static field只在类加载的时候初始化一次且仅一次,
      类加载的意思就是把类装入内存的中,就像dll一样,classpath中的每个类不是在java启动的时候就加载,只有在运行时class loader: java.lang.ClassLoader中没有这个类的时候,就会在 classpath中寻找这个类,并加载到class loader中,就像jdbc中的class.forName一样,如果你对class loader有兴趣,请确保你的兴趣有多大,如果很大的话可以参考《java安全》宫力写的,他是中国人,而且是sun的java安全的负责人,就像rosifox(下着鱼的天)  yzxlyd(刘懿东大猪头) 说的那样,你的C c1 = new C(2);就不是static field,所以不会被new,建议你把程序写成这样class A{
    A(String s){
    System.out.println(s);
    }
    }
    class B{
    static A a1 = new A("B static field: static A a1 = new A");
    B(String s){
    System.out.println(s);
    }
    A a2 = new A("B instance field: A a2 = new A");
    static A a3 = new A("B static field: static A a3 = new A");
    }
    class C{
    B b1 = new B("C instance field: B b1 = new B");
    C(String s){
    System.out.println(s);
    }
    static B b2 = new B("C static field: static B b2 = new B");
    }
    public class Temp { public static void main(String[] args) {
    System.out.println("public static void main(String[] args)");
    C c2 = new C("Temp static field: static C c3 = new C");
    } C c1 = new C("temp instance field: C c1 = new C");
    static C c2 = new C("Temp static field: static C c2 = new C");

    }这样输出的更能说明问题,令:请继续保持的你命名规范:一定要把Class的名字写成大写。temp就是一个坏名:( 
    祝好运
      

  3.   

    另附运行结果
    B static field: static A a1 = new A
    B static field: static A a3 = new A
    B instance field: A a2 = new A
    C static field: static B b2 = new B
    B instance field: A a2 = new A
    C instance field: B b1 = new B
    temp static field: static C c2 = new C
    public static void main(String[] args)
    B instance field: A a2 = new A // static field只在类加载的时候初始化一次且仅一次
    C instance field: B b1 = new B
    temp static field: static C c3 = new C
      

  4.   

    //here一行根本就没有运行,当然就没什么结果了,大括号打错地方拉!
      

  5.   

    public class Temp { public static void main(String[] args) {
    System.out.println("public static void main(String[] args)");
    C c2 = new C("Temp static field: static C c3 = new C");
    } C c1 = new C("temp instance field: C c1 = new C"); //######
    static C c2 = new C("Temp static field: static C c2 = new C");

    }
    这是j_now(j_now) 给的程序中的一段,我想请问一下,注释//###### 这行是不是因为没有创建Temp类的对象而没有运行,如果创建了Temp类的对象则//######这行运行。
    请问是吗?