转自:http://www.blogjava.net/cheneyfree/archive/2008/05/24/202643.html
类Person和子类Son,体现对象初始化流程的代码:
public class Person {
Bow b1 = new Bow(1);
static {
System.out.println("Person staticstatic块1");
}
{
System.out.println("Person hello非static块1");
}
Bow b2 = new Bow(2);
static Bow b3 = new Bow(3);
Person() {
System.out.println("PersonPerson类的构造器");
}
{
System.out.println("Person hello非static块2");
}
static {
System.out.println("Person staticstatic块2");
}
}
class Son extends Person {
Bow b4 = new Bow(4);
static {
System.out.println("Test staticstatic块1");
}
{
System.out.println("Test hello1非static块1");
}
Bow b5 = new Bow(5);
static Bow b6 = new Bow(6);
Son() {
System.out.println("TestTest类的构造器");
}
{
System.out.println("Test hello2非static块2");
}
static {
System.out.println("Test static2static块2");
}
public static void main(String[] args) {
System.out.println("main");
new Son();
}
}
class Bow {
Bow(int m) {
System.out.println("Bow(" + m + ")");
}
}
执行结果:
Person static...static块1
Bow(3)
Person static...static块2
Test static...static块1
Bow(6)
Test static2...static块2
main...
Bow(1)
Person hello...非static块1
Bow(2)
Person hello...非static块2
Person...Person类的构造器
Bow(4)
Test hello1...非static块1
Bow(5)
Test hello2...非static块2
Test...Test类的构造器
从上面结果,可以总结出JAVA对象初始化的流程:
【1】父类static块和父类static属性(两者的执行先后顺序依据它们在类中具体位置由上至下)
【2】子类static块和子类static属性(两者的执行先后顺序依据它们在类中具体位置由上至下)
【3】执行main方法中new关键字之前的代码块
【4】父类非static块执行和父类非static属性(两者的执行先后顺序依据它们在类中具体位置由上至下,如果属性为实例类型,则执行该实例所在类的非static块和非static属性,再执行该类的构造器,即[4][5]步骤)
【5】父类构造器(完成非static属性初始值的设置)
【6】子类非static块执行和子类非static属性(两者的执行先后顺序依据它们在类中具体位置由上至下,如果属性为实例类型,则执行该实例所在类的非static块和非static属性,再执行该类的构造器,即[6][7]步骤)
【7】子类构造器(完成非static属性初始值设置,如果在子类构造器执行前就返回该非static属性,则该非static属值为属性默认值)
注:针对第【7】点“子类构造器执行前就返回该非static属性”,具体可以见下例:
public class ParentObjectInit {
public void test() {
}
public ParentObjectInit() {
test();
}
}
class ChildObjectInit extends ParentObjectInit {
private int instanceValue = 20;
public void test() {
System.out.println("instance1 value : " + instanceValue);
}
public static void main(String[] args) {
new ChildObjectInit();
}
}
这段代码的执行结果:
instance1 value is: 0 因为new 子类ChildObjectInit时,会先初始化父类ParentObjectInit,继而调用父来构造器器,接着执行此构造器中的test()方法,基于多态性,会转而调用子类的test()方法执行子类test()方法代码体,打印出instanceValue的属性默认值。(因为此时打印instanceValue值后,父类构造器才执行结束返回,根本还没轮到子类的初始化工作和子类构造器的执行。)
分享到:
相关推荐
对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理
对象初始化器_1对象初始化器_1对象初始化器_1对象初始化器_1
金蝶K3系统初始化流程,如何初始化流程
Spring Bean创建初始化流程
DDR 初始化 流程 标准流程 状态机形势
SIM900A模块连接示意及初始化流程,及调试流程
sd卡初始化流程的撒撒打算打算打算打算大美女‘;的;啊打算;阿三;的撒
描述了android初始化流程,对各个初始化进程做了简要的分析说明.
selinux初始化流程
本文档是自己通过辛苦阅读DRM英文手册,反复理解DRM内核架构与模块之间的关系,写出来的...后面还重点介绍了DRM平台子模块GEM,KMS组件中的CRTC、ENCODER、CONNECOTR、CMA等重要结构的初始化流程,便于对DRM架构的理解。
linux系统的初始化流程linux系统的初始化流程linux系统的初始化流程
SIM800Series_900Series初始化检测及TCP流程图
USB驱动初始化流程及数据收发流程,包含USB host及device驱动初始化。
SD卡初始化流程,简单说明了SD卡初始化的指令与步骤。本人是基于FPGA写的。对SD卡初始化的指令作了说明。
RDA8955开机初始化流程RDA8955开机初始化流程RDA8955开机初始化流程RDA8955开机初始化流程
k3cloud初始化上线七个步骤 第一步 安装部署实施篇,傻瓜式的按照文档步骤一步步学习k3cloud初始化;
《Java程序设计基础教程》按内容分成五篇:Java 语言入门篇、面向对象篇、数据流应用篇、Java GUI编程篇和高级应用篇,共有二十四讲组成。
文章:【手写 Vue2.x 源码】第二篇 - Vue 的初始化流程 链接:https://blog.csdn.net/ABAP_Brave/article/details/128555243 内容:第二篇 - Vue 的初始化流程;本篇主要介绍了 Vue 数据的初始化流程,核心点: 1,...
GPRS模块初始化流程,帮助有需要的人快速调试GPRS模块,快速上手
注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。 什么时候初始化 ... static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero init