牛客上的一道题
class
C {
C() {
System.out.print(
"C"
);
}
}
class
A {
C c =
new
C();
A() {
this
(
"A"
);
System.out.print(
"A"
);
}
A(String s) {
System.out.print(s);
}
}
class
Test
extends
A {
Test() {
super
(
"B"
);
System.out.print(
"B"
);
}
public
static
void
main(String[] args) {
new
Test();
}
}
答案是CBB
注意类的普通成员变量和代码块在构造方法之前执行!!!!!!!
初始化的过程
1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化;
3.其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法;
(1)初始化父类的普通成员变量和代码块,执行 C c = new C(); 输出C
(2)super("B"); 表示调用父类的构造方法,不调用父类的无参构造函数,输出B
(3) System.out.print("B");