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 ...
随机推荐
- UIPageControl页控制器
一.基本知识 #import "ViewController.h"@interface ViewController ()<UIScrollViewDelegate>{ ...
- SQL Server优化器特性-隐式谓词
我们都知道,一条SQL语句提交给优化器会产生相应的执行计划然后执行输出结果,但他的执行计划是如何产生的呢?这可能是关系型数据库最复杂的部分了.这里我为大家介绍一个有关SQL Server优化器的特性- ...
- qooxdoo 3.0 发布,JavaScript 的 GUI 框架
qooxdoo 3.0 是一个主要的版本,包含很多新特性和内部的改动,qooxdoo 3.0 是一个通用的 JS 框架,主要改进体现在 qx.Desktop, qx.Mobile, 和 qx.Webs ...
- 使用ODP.NET查询数据参数顺序问题及莫名ORA-01722错误提示
最近由于项目需要,必须使用C#配合Oracle来进行开发,在开发的过程中,发现有些查询无法正确获取数据.例如: Select * From tabParam Where ParamCode = :Pa ...
- MongoDB安装及shell简介
MongoDB安装 MongoDB具有跨平台的优良特性,提供了对主流的操作系统支持,我们可以根据自己使用的操作系统,选择下载对应的安装包. 图 1. MongoDB支持各个版本的操作系统 MongoD ...
- 虚拟机Ubuntu14/15启用root用户登录
1. 为root用户设置密码 sudo passwd root 需要先输入一次当前用户的登陆密码,然后输入两次root用户的密码(自己设置). 2. 切换至root用户 sudo -s 3. 编辑登陆 ...
- 在 .NET 4.5 中反射机制的变更
反射机制(Reflection)通常会涉及到3中场景: 运行时反射 场景:可以检索已加载程序集.类型.对象.实例和方法调用的元数据(Metadata). .NET 支持情况:支持 仅供静态分析的反射 ...
- LoadTest内存和线程Troubleshooting实战
在端午节放假的三天中,我对正在开发的 Service 进行了 LoadTest,尝试在增大压力的条件下发现问题. 该 Service 为独立进程的 WCF 服务,宿主于 WindowsService, ...
- 带你看懂Dictionary的内部实现
了解Dictionary的开发人员都了解,和List相比,字典添加会慢,但是查找会比较快,那么Dictionary是如何实现的呢? Dictionary的构造 下面的代码我看看Dictionary在构 ...
- Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2
Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...