类加载+子类new的过程
执行顺序
父类>子类
静态变量定义>静态变量赋值=静态代码块 (到这类加载结束,类加载就是弄的static这些东西)
成员变量=构造代码块>构造方法 (new结束)
举例子
package inherit
public class A extends B {
static {
System.out.println("static2");
}
C c = new C();
public A(){
System.out.println("obj3");
}
static A e = new A();
public static void main(String[] args) {
A a = new A();
}
}
class B {
{
System.out.println("构造");
}
D d = new D();
static {
System.out.println("static1");
}
public B() {
System.out.println("B");
}
}
class C {
public C() {
System.out.println("C");
}
}
class D {
public D() {
System.out.println("D");
}
}
加载过程:加载A类 发现有父类,停止加载 --->加载父类 将写入堆中静态变量和静态代码块(两者同优先级,谁在前谁先执行)。 ---->加载子类 将写入堆中静态变量和静态代码块 (加载完毕!!!)
new对象过程: 新建一个A类的对象 在构造方法中的第一行隐藏了一个super(); 方法将我们引向所对应的父类,在父类中我们按照 成员变量=构造代码块(这两个同样优先级,谁在前谁先执行)、构造方法 的顺序执行。 --->回到子类 同样按照 成员变量=构造代码块、构造方法 的顺序执行 (new对象结束)