在创建阶段系统通过下面的几个步骤来完成对象的创建过程

  • 为对象分配存储空间
  • 开始构造对象
  • 从超类到子类对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对象创建阶段的代码调用顺序的更多相关文章

  1. 深入学习Java对象创建的过程:类的初始化与实例化

    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...

  2. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  3. 2.Java对象创建

    1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类 ...

  4. Java对象创建过程补遗

    一.static修饰的东东是属于这个类的,是所有的该类的实例共享的,因此它们的初始化先于实例对象的初始化. 二.Java中没有静态构造方法,但是有静态代码块.当类中同时存在静态代码块和静态成员变量声明 ...

  5. Java虚拟机4:Java对象创建和对象访问

    1.对象创建 Java是一门面向对象的语言,Java程序运行过程中无时无刻都有对象被创建出来.在语言层面上,创建对象(克隆.反序列化)就是一个new关键字而已,但是虚拟机层面上却不是如此.看一下在虚拟 ...

  6. Java对象创建模式

    创建Java对象时,对于可为空的属性,创建对象的时候有3种模式:重叠构造器模式.JavaBeans模式.Builder模式(推荐).Stream模式(推荐).                     ...

  7. Java对象创建的过程及对象的内存布局与访问定位

    这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符 ...

  8. 深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式

    内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的 ...

  9. JVM(2)--深入理解java对象创建始终

    java对象探秘 java是一门面向对象的语言,我们无时无刻不在创建对象和使用对象,那么java虚拟机是如何创建对象的?又是如何访问对象的?java对象中究竟存储了什么运行时所必需的数据?在学习了ja ...

随机推荐

  1. 搭建Openstack云平台

    实验室需要做一个大数据平台项目,临时接下需要部署实验室云平台的任务,由于之前没有接触过相关技术,仅以此篇作为纪录文,记录一下我的openstack的初步学习以及搭建过程. 1.openstcak及其组 ...

  2. mongodb(一) NoSQL简介

    NoSQL简介   写在前面,本文就是学习的记录笔记,大部分内容都属于参考,分享给大家 关系与非关系数据库      那么应该了解下影响关系数据库性能的主要原因: 在关系型数据库中,导致性能欠佳的最主 ...

  3. Linux下的NFS配置(转)

    http://rubyer.me/blog/1682/ 遇到的问题: 1.reason given by server: Permission denied 在服务器的/etc/export配置文件中 ...

  4. Unexpected namespace prefix "xmlns" found for tag Linear Layout

    原文地址http://blog.csdn.net/taxuexumei/article/details/41523419 今天遇到的问题,,,保存到博客里,下回遇到找博客就行了,,,,,, 今天在制作 ...

  5. atitit.二进制数据无损转字符串网络传输

    atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1  (推荐) 2 4. utf-8 ...

  6. java集合——题4,6

    4.(List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.add(“Hel ...

  7. iOS开发---集成百度地图

    由于iOS MapKit框架很多情况并不能满足我们的需求,我们可以选择集成百度地图,那该如何操作呢? 申请Key 登录百度API管理中心申请Key http://lbsyun.baidu.com/ap ...

  8. 【关于新版Cocos2dx/Cocos2d-JS】安装包和使用方式的变化

    最近有读者反馈说,最新的Cocos2dx或者说2d-JS下载之后跟书本说的安装方式相差很大. 刚下载最新版3.9试了一下,其实用法还是没有变的. 新版把cocos2dx和cocos2d-js合并了,这 ...

  9. bzoj 3399: [Usaco2009 Mar]Sand Castle城堡

    3399: [Usaco2009 Mar]Sand Castle城堡 Time Limit: 3 Sec  Memory Limit: 128 MB Description 约翰用沙子建了一座城堡.正 ...

  10. iOS中dyld缓存的实现原理是怎样的?

    在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...