Java对象创建阶段的代码调用顺序
在创建阶段系统通过下面的几个步骤来完成对象的创建过程
- 为对象分配存储空间
 - 开始构造对象
 - 从超类到子类对static成员进行初始化
 - 超类成员变量按顺序初始化,递归调用超类的构造方法
 - 子类成员变量按顺序初始化,子类构造方法调用
 
本文重点演示第三步到第五步:
Grandpa类
 package com.xinye.test;
 public class Grandpa {
     {
         System.out.println("执行Grandpa的普通块");
     }
     static {
         System.out.println("执行Grandpa的静态快");
     }
     public Grandpa(){
         System.out.println("执行Parent的构造方法");
     }
     static{
         System.out.println("执行Grandpa的静态快222222");
     }
     {
         System.out.println("执行Grandpa的普通快222222");
     }
 }
Parent类
 package com.xinye.test;
 public class Parent extends Grandpa{
     protected int a = 111;
     {
         System.out.println("执行Parent的普通块");
     }
     static {
         System.out.println("执行Parent的静态快");
     }
     public Parent(){
         System.out.println("执行Parent的构造方法");
     }
     public Parent(int a){
         this.a = a ;
         System.out.println("执行Parent的构造方法:InitParent(int a)");
     }
     static{
         System.out.println("执行Parent的静态快222222");
     }
     {
         System.out.println("执行Parent的普通快222222");
     }
 }
Child类
 package com.xinye.test;
 public class Child extends Parent {
     {
         System.out.println("执行Child的普通块");
     }
     static {
         System.out.println("执行Child的静态快");
     }
     public Child(){
         super(222);
         System.out.println("a = " + a);
         System.out.println("执行Child的构造方法");
     }
     static{
         System.out.println("执行Child的静态快222222");
     }
     {
         System.out.println("执行Child的普通快222222");
     }
 }
测试类
 package com.xinye.test;
 public class Test {
     public static void main(String[] args) {
         /**
          *
          *  第一步:
          *      Grandpa如果有静态块,按照Grandpa的静态块声明顺序依次执行
          *      Parent中如果有静态块,按照Parent中的静态块声明顺序依次执行
          *      Child中如果有静态块,按照Child中的静态块声明顺序依次执行
          *  第二部:
          *      如果Grandpa中有普通块,按照Grandpa的普通块声明顺序依次执行
          *          执行完毕后,执行被调用的构造方法(如果Parent调用了Grandpa中的特定构造;如果没有则调用默认构造)
          *      如果Parent中有普通块,按照Parent的普通块的声明顺序依次执行
          *          执行完毕后,执行被调用的构造方法(如果Child调用了Parent的特定构造;如果没有则调用默认构造)
          *         如果Child中有普通块,按照Child的普通块的声明顺序依次执行
          *             执行完毕后,执行被客户端调用的特定构造方法
          */
         new Child();
     }
 }
执行结果
执行Grandpa的静态快
执行Grandpa的静态快222222
执行Parent的静态快
执行Parent的静态快222222
执行Child的静态快
执行Child的静态快222222
执行Grandpa的普通块
执行Grandpa的普通快222222
执行Parent的构造方法
执行Parent的普通块
执行Parent的普通快222222
执行Parent的构造方法:InitParent(int a)
执行Child的普通块
执行Child的普通快222222
a = 222
执行Child的构造方法
Java对象创建阶段的代码调用顺序的更多相关文章
- 深入学习Java对象创建的过程:类的初始化与实例化
		
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...
 - C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
		
Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...
 - 2.Java对象创建
		
1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类 ...
 - Java对象创建过程补遗
		
一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...
 - Java虚拟机4:Java对象创建和对象访问
		
1.对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.看一下在虚拟 ...
 - Java对象创建模式
		
创建Java对象时,对于可为空的属性,创建对象的时候有3种模式:重叠构造器模式.JavaBeans模式.Builder模式(推荐).Stream模式(推荐). ...
 - Java对象创建的过程及对象的内存布局与访问定位
		
这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符 ...
 - 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式
		
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...
 - JVM(2)--深入理解java对象创建始终
		
java对象探秘 java是一门面向对象的语言,我们无时无刻不在创建对象和使用对象,那么java虚拟机是如何创建对象的?又是如何访问对象的?java对象中究竟存储了什么运行时所必需的数据?在学习了ja ...
 
随机推荐
- 如何防止鼠标移出移入子元素触发mouseout和mouseover事件
			
js代码: function isMouseLeaveOrEnter(e, handler) { var reltg=e.relatedTarget?e.relatedTarget:e.type==' ...
 - 用dom4j解析xml 报java.lang.NoClassDefFoundError:org/jaxen/JaxenException
			
转自:http://www.myexception.cn/java%20exception/95.html 源码如下: import java.io.File; import java.util.Li ...
 - Makecert.exe(证书创建工具)
			
Makecert.exe(证书创建工具) .NET Framework 4.5 其他版本 2(共 3)对本文的评价是有帮助 - 评价此主题 证书创建工具生成仅用于测试目的的 X.509 证 ...
 - 腾讯DBA官方博客开通了
			
腾讯DBA官方博客开通了,欢迎交流哈.. http://tencentdba.com 腾讯互娱游戏DBA团队一直致力于为游戏提供稳定.高效的DB运营服务,这是我们团队的使命. 过去DBA团 ...
 - 工资低的.Net程序员,活该你工资低
			
这两天博客园上关于“.Net工资低”的讨论挺多的,让我不禁想起一句话“拉不出屎来怪地球没引力”. 那些抱怨“做.Net工作三年了月薪才6千,我的同学做Java现在都一万二”的哥们,你问问自己“我会什么 ...
 - [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)
			
描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...
 - c++如何遍历删除map/vector里面的元素
			
新技能Get! 问题 对于c++里面的容器, 我们可以使用iterator进行方便的遍历. 但是当我们通过iterator对vector/map等进行修改时, 我们就要小心了, 因为操作往往会导致it ...
 - SignalR初体验
			
简介 ASP .NET SignalR[1] 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以 ...
 - maven nexus 3  third party 构件上传
			
mvn -e deploy:deploy-file -DgroupId=com.oracle -DartifactId=JDBCDriver -Dversion=12.0.1 -Dpackaging= ...
 - duilib进阶教程 -- 响应windows原生消息和自定义消息(13)
			
一.windows原生消息 同样,入门教程只是给出了响应windows原生消息的方法,并没给出例子,这里以自适应屏幕分辨率为例.迅雷播放器虽然可以在启动的时候自动调整窗口大小,但是当屏幕分辨率实时改变 ...