第五章 初始化与清理

1.初始化,变量初始化优先于方法,静态类型与非静态类型初始化的差别在于,前者发生在类加载阶段,而后者发生在创建对象的阶段。

2.数组初始化三种方法:

  (1)int[] a = {1, 2, 3}; 只能用于定义时初始化,这种方法不够灵活

  (2)int[] a = new int[]{ 1, 2 ,3}; 数组大小由{}中元素个数决定

  (3)int[] a = new a[10]; 数组大小可以指定。

3.实际上可变参数列表的实现就是数组,当你指定参数,编译器会为你填充数组

4.初始化顺序

示例:

class A {
    A(int mark) {
        System.out.println("Create A(" + mark + ")");
    }
}

class B {
    B(int mark) {
        System.out.println("Create B(" + mark + ")");
    }
}
class Sup {
    static A a1 = new A(1);
    static A a2;
    static {
        a2 = new A(2);
        System.out.println("a2 Initialized");
    }
    A a3 = new A(3);
    A a4;
    {
        a4 = new A(4);
        System.out.println("a4 Initiallized");
    }
    Sup() {
        System.out.println("Creating Sup");
    }
}

class Sub extends Sup{
    static B b1 = new B(1);
    B b2 = new B(2);
    Sub() {
        super();
        System.out.println("Sub Creating");
    }
}

public class Initialization {

    public static void main(String[] args) {
        
        new Sub();
    }

}

 

输出结果:

Create A(1)
Create A(2)
a2 Initialized
Create B(1)
Create A(3)
Create A(4)
a4 Initiallized
Creating Sup
Create B(2)
Sub Creating

结果说明:(注意输出的红色部分)

创建对象的初始化步骤

(1)有基类先对基类进行加载,在对基类加载的过程中会初始化类变量以及static {}域。

(2)然后对子类进行加载,初始化类变量以及static域

(3)初始化基类常规变量(在同一个类中,域一定在构造方法执行之前初始化)

(4)注意 执行基类构造器 (尽管基类构造器是在子类构造器中被调用的)

(5)初始化子类实例变量

(6)执行子类构造器

有些东西真的是搞不清楚为什么的,蓝瘦。

posted @ 2019-08-18 23:05  卑微芒果  Views(142)  Comments(0Edit  收藏  举报