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 ...
随机推荐
- socket进阶
socketserver(在Python2.*中的是SocketServer模块)是标准库中一个高级别的模块.用于简化网络客户与服务器的实现(在前面使用socket的过程中,我们先设置了socket的 ...
- JavaScript知识架构学习路径(一)- 变量篇
[摘要]本文是专为JavaScript入门者而总结的,总体上将JavaScript的基础部分分成了九大块,分别是变量.运算符.数组.流程控制结构.字符串函数.函数基础.DOM操作基础.文档对象模型DO ...
- jsf2.0 tomcat 修改页面后无法立马看到页面修改效果
转载于 http://stackoverflow.com/questions/12203657/jsf2-myfaces-xhtml-modifications-do-not-affect-unti ...
- Dynamic CRM 2013学习笔记(十四)复制/克隆记录
经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...
- protobuf-net 与 C#中几种序列化的比较
C#中几种序列化的比较,此次比较只是比较了 序列化的耗时和序列后文件的大小. 几种序列化分别是: 1. XmlSerializer 2. BinaryFormatter 3. DataContract ...
- Apache Mina(一)
原文链接:http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应 ...
- Book Review: PowerShell 3.0 Advanced Administration Handbook
Recently I read a book, PowerShell 3.0 Advanced Administration Handbook, which I found really worthy ...
- thinkphp支持大小写url地址访问,不产生下划线
from:http://www.111cn.net/phper/thinkPhp/57748.htm 一.在配置文件中开启了thinkphp的大小写识别功能,使链接大小写都可以正常访问: ‘URL_C ...
- [stm32] Systick
(一) 背景介绍在传统的嵌入式系统软件按中通常实现 Delay(N) 函数的方法为:for(i=0;i<=x;i++); x--: 对应于N毫秒的循环值对于STM32系列微 ...
- paip.spring 获取bean getBean 没有beanid的情况下
paip.spring 获取bean getBean 没有beanid的情况下 spring能自动扫描带有注解的bean文件.. 作者Attilax 艾龙, EMAIL:1466519819@q ...