第五章 初始化与清理
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)执行子类构造器
有些东西真的是搞不清楚为什么的,蓝瘦。