首页 > 代码库 > Java对象创建阶段的代码调用顺序
Java对象创建阶段的代码调用顺序
在创建阶段系统通过下面的几个步骤来完成对象的创建过程
- 为对象分配存储空间
- 开始构造对象
- 从超类到子类对static成员进行初始化
- 超类成员变量按顺序初始化,递归调用超类的构造方法
- 子类成员变量按顺序初始化,子类构造方法调用
本文重点演示第三步到第五步:
Grandpa类
1 package com.xinye.test; 2 3 public class Grandpa { 4 { 5 System.out.println("执行Grandpa的普通块"); 6 } 7 static { 8 System.out.println("执行Grandpa的静态快"); 9 }10 public Grandpa(){11 System.out.println("执行Parent的构造方法");12 }13 static{14 System.out.println("执行Grandpa的静态快222222");15 }16 {17 System.out.println("执行Grandpa的普通快222222");18 }19 }
Parent类
1 package com.xinye.test; 2 3 public class Parent extends Grandpa{ 4 protected int a = 111; 5 { 6 System.out.println("执行Parent的普通块"); 7 } 8 static { 9 System.out.println("执行Parent的静态快");10 }11 public Parent(){12 System.out.println("执行Parent的构造方法");13 }14 public Parent(int a){15 this.a = a ;16 System.out.println("执行Parent的构造方法:InitParent(int a)");17 }18 static{19 System.out.println("执行Parent的静态快222222");20 }21 {22 System.out.println("执行Parent的普通快222222");23 }24 }
Child类
1 package com.xinye.test; 2 3 public class Child extends Parent { 4 { 5 System.out.println("执行Child的普通块"); 6 } 7 static { 8 System.out.println("执行Child的静态快"); 9 }10 public Child(){11 super(222);12 System.out.println("a = " + a);13 System.out.println("执行Child的构造方法");14 }15 static{16 System.out.println("执行Child的静态快222222");17 }18 {19 System.out.println("执行Child的普通快222222");20 }21 }
测试类
1 package com.xinye.test; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 /** 7 * 8 * 第一步: 9 * Grandpa如果有静态块,按照Grandpa的静态块声明顺序依次执行10 * Parent中如果有静态块,按照Parent中的静态块声明顺序依次执行11 * Child中如果有静态块,按照Child中的静态块声明顺序依次执行12 * 第二部:13 * 如果Grandpa中有普通块,按照Grandpa的普通块声明顺序依次执行14 * 执行完毕后,执行被调用的构造方法(如果Parent调用了Grandpa中的特定构造;如果没有则调用默认构造)15 * 如果Parent中有普通块,按照Parent的普通块的声明顺序依次执行16 * 执行完毕后,执行被调用的构造方法(如果Child调用了Parent的特定构造;如果没有则调用默认构造)17 * 如果Child中有普通块,按照Child的普通块的声明顺序依次执行18 * 执行完毕后,执行被客户端调用的特定构造方法19 */20 21 new Child();22 }23 }
执行结果
1 执行Grandpa的静态快 2 执行Grandpa的静态快222222 3 执行Parent的静态快 4 执行Parent的静态快222222 5 执行Child的静态快 6 执行Child的静态快222222 7 执行Grandpa的普通块 8 执行Grandpa的普通快222222 9 执行Parent的构造方法10 执行Parent的普通块11 执行Parent的普通快22222212 执行Parent的构造方法:InitParent(int a)13 执行Child的普通块14 执行Child的普通快22222215 a = 22216 执行Child的构造方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。