执行流程的分析结果:D2 A2 A1 C3 A2 A3 D1 B2 D
public class CodeDemo {
public static void main(String[] args) {
new SB();
}
}
class SA {
D d;
static {
System.out.println("D2");
}
{
System.out.println("C3");
d = new D();
}
public SA() {
System.out.println("D1");
}
}
class SB extends SA {
static C c = new C();
static {
System.out.println("A1");
}
{
System.out.println("B2");
}
public SB() {
System.out.println("D");
}
}
class C {
public C() {
System.out.println("A2");
}
}
class D extends C {
public D() {
System.out.println("A3");
}
}
分析:当创建子类对象时,静态信息优先加载,所以需要先加载父类的静态信息,子类的静态信息,父类对象级别信息,子类对象级别信息。
1. 父类静态信息只有静态代码块,所以先加载静态代码块
2. 子类静态属性包括静态属性和静态代码块,所以加载的顺序是依次进行加载的
3. 静态属性常见:static C c = new C();和其他静态资源是同一级别需要进行顺序执行,静态方法不一样,方法必须要进行调用才会加载到栈中进行执行
4. 对象级别主要是构造代码块和构造方法,其中构造代码块优先于构造方法执行,构造代码块一般用来初始化成员变量和其他资源,所以在创建对象之前要保证其他属性均被初始化。
- 操作执行类的资源解释:bad good
interface B {
void f();
}
class C implements B {
public void f() {
System.out.print("good ");
}
public void g(B b) {
b.f();
}
}
class A implements B {
public void f() {
System.out.print("bad ");
}
<