//类名:A.java
public class A {
public static void main(String[] args) {
new D();
new D();
}
}
class B {
static {
System.out.println("b1");
}
B() {
System.out.println("b2");
}
}
class C extends B {
static {
System.out.println("c1");
}
C() {
System.out.println("c2");
}
}
class D extends C {
static {
System.out.println("d1");
}
D() {
System.out.println("d2");
}
}
执行结果:
b1
c1
d1
b2
c2
d2
b2
c2
d2
说明问题:
1. 先执行静态代码块
2. 先执行父类,再交叉执行
3. 如果实例化两次,静态块只执行一次
//类名:A.java
public class A {
public static void main(String[] args) {
B b=new C();
b.exec();
}
}
class B {
void exec() {
System.out.println("1");
}
}
class C extends B {
void exec() {
System.out.println("2");
}
}
执行结果:
2
//A.java
public class A {
public static void main(String[] args) {
new C();
}
}
class B{
E e=new E();
static{
System.out.println("b static");
}
B(){
System.out.println("b");
}
}
class C extends B{
D d=new D();
static{
System.out.println("c static");
}
C(){
System.out.println("c");
}
}
class D{
D(){
System.out.println("d");
}
}
class E{
E(){
System.out.println("e");
}
}
执行结果:
b static
c static
e
b
d
c
说明问题:
1. 先执行static,再执行父类的构造函数,再初始化属性,再执行子类的构造函数。