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 ...
随机推荐
- nginx安装启动
参考:http://network.51cto.com/art/201005/198198_4.htm 下载nginx tar.gz安装包下载pcre tar.gz安装包 安装pcretar zxvf ...
- sql命令查看,清楚mysql bin日志
查看二进制日志文件 mysql> SHOW BINLOG EVENTS \G; mysql> SHOW MASTER LOGS; 清除二进制日志文件 mysql> PURGE { M ...
- Semantic-UI和其他几个前端框架
本来是想介绍Semantic-UI的,但如果只介绍这个框架,没什么内容,框架相关feature站点上有不需要说,所以干脆列出自己常用的几个前端框架,算是做个阶段性总结. 本文的核心是侧重于HTML/C ...
- WP8:在Cocos2d-x中使用OpenXLive
一. Cocos2d-x for Windows Phone 到2013年底,几大手游引擎都陆续支持WP8了,特别是Unity3D和Cocos2d-x.有过游戏开发经验的朋友们应该对这两个引擎不 ...
- Win32 多线程学习笔记
学到的API函数 一.线程 创建线程.结束线程.获取线程的结束码 CreateThread ExitThread GetExitCodeThread 二.线程结束时触发 创建线程之后,等待线程的结束之 ...
- Nutz Dao实体中索引注解的使用(@TableIndexes@Index)
Nutz是一组轻便小型的框架的集合, 各个部分可以被独立使用,把SSH的精华封装在一个1M左右的jar包中,Nutz不对其他任何第三方库产生依赖,如果不考虑数据库链接和日志的话,创建完美的Web应用只 ...
- FreeIconMaker - 在线创建免费和时尚的图标
在设计一个网站或 Web 应用程序时,你不能否认网页设计工具的重要性,这些工具有助于简化您的任务和完成您的项目.FreeIconMaker.com 是一个免费的在线图标制作工具,您也可以创建自己的模板 ...
- Kafka重复消费和丢失数据研究
Kafka重复消费原因 底层根本原因:已经消费了数据,但是offset没提交. 原因1:强行kill线程,导致消费后的数据,offset没有提交. 原因2:设置offset为自动提交,关闭kafka时 ...
- paip.java 注解的详细使用代码
paip.java 注解的详细使用代码 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/att ...
- Linux初学 - java环境安装
http://www.oracle.com/technetwork/java/javase/downloads/index.html 找到对应版本的jak的安装包 我这边下载的是64_rpm 下载完成 ...