先看程序: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))请问为什么?
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))请问为什么?
“静态”对象(如果它们尚未因前面的对象创建过程而被初始化),而后是“非静态”对象”
不如这样:把静态对象该为静态成员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就是一个坏名:(
祝好运
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
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类的对象则//######这行运行。
请问是吗?