构造函数及其成员变量初始化顺序详解

来源:互联网 发布:王小波的书 知乎 编辑:程序博客网 时间:2024/05/16 09:30
package demo;/** *  * @author Administrator *think in java the forth edition *  */public class ConstractInit extends PortableLunch{private Meal m=new Meal();private Cheese cheese=new Cheese();private Bread b=new Bread();public ConstractInit(){/*                  *  1.在任何事物发生之前,将分配给对象的存储空间初始化成二进制的0 *  2.调用构造方法时,默认会调用父类的构造方法,此时成员变量还未初始化,此步骤会一直递归调用父类的构造方法, *    直到根基类(Bread)没有父类(所有的成员变量均为初始化) *  3. 到达根基类后,然后开始初始化成员变量,成员变量初始化完成之后,执行构造器主体, *    主体调用完成之后然后递归开始(与第一步相反方向)初始化其子类的成员变量,直到最底层的子类(此示例为ConstractInit) *  4    最底层的子类(ConstractInit)成员变量初始化完成之后,开始执行自身构造器主体 */System.out.println("ConstractInit");}public static void main(String[] args){new ConstractInit();}}class Meal{private int a=initMeal();Meal(){System.out.println("Meal");}private int initMeal(){System.out.println("Meal attribute initazlized");return 1;}}class Bread{private int b=initBread();public Bread(){System.out.println("Bread");}private int initBread(){System.out.println("Bread attribute initazlized");return 1;}}class Cheese{private int c=initCheese();public Cheese(){System.out.println("Cheese");}private int initCheese(){System.out.println("Cheese attribute initazlized");return 1;}}class Lettuce{public Lettuce(){System.out.println("Lettuce");}}class Lunch extends Meal{private int d=initLunch();public Lunch(){System.out.println("Lunch");}public int initLunch(){System.out.println("Lunch attribute initazlized");return 1;}}class PortableLunch extends Lunch{private int e=initPortableLunch();PortableLunch(){System.out.println("PortableLunch");}public int initPortableLunch(){System.out.println("PortableLunch attribute initazlized");return 1;}}

最后打印结构为:

Meal attribute initazlized
Meal
Lunch attribute initazlized
Lunch
PortableLunch attribute initazlized
PortableLunch
Meal attribute initazlized
Meal
Cheese attribute initazlized
Cheese
Bread attribute initazlized
Bread
ConstractInit





原创粉丝点击