我在java中并不是新手,但我有一个让我感到困惑的例子。 这里是:初始化的整理顺序
class A {
public A() { System.out.print("O"); }
}
class B {
{ System.out.print("A"); }
public B() { System.out.print("D"); }
}
class C {
static { System.out.print("3"); }
public C() { System.out.print("P"); }
}
public class D extends C {
private A objA = new A();
private static B objB = new B();
public D() { System.out.print("T"); }
public static void main(String[] args){
new D();
}
}
那么system.out中的结果是什么? 我们知道静态成员是第一个,因此“3”将首先打印,因为它在超类中,并且private static B objB = new B();
将在其之后(实例初始化程序和构造函数)初始化。
我们在控制台中得到3AD
。
然后主要方法运行并创建一个D类的新实例,它的确定。
但是因为该步骤的顺序是奇怪:
的超public C() { System.out.print("P"); }
在控制台3ADP
构造函数。
然后字段D.class private A objA = new A();
3ADPO
在控制台中。
而D.class的构造函数是最后,所以:
控制台3ADPOT
。
所以问题是:为什么超类构造函数在子类的字段之前运行?我认为建设者的优先级最低。任何人都可以在文档PLZ上分享链接?
我明白了,谢谢兄弟) – DontPanic