转自: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值后,父类构造器才执行结束返回,根本还没轮到子类的初始化工作和子类构造器的执行。)
分享到:
相关推荐
Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...
### Mapbox资源请求流程梳理 #### 一、资源请求框架概览 Mapbox是一个功能强大的地图服务工具包,它提供了丰富的API和SDK供开发者使用。本文档将对Mapbox资源请求流程进行深入分析,尤其关注样式(style)加载过程中...
初始化流程复杂,需要精确地按照 Ceph RGW 的设计来进行各项组件的初始化和配置,以确保系统能正确、高效地工作。 在梳理代码流程时,需要关注每个组件的依赖关系、初始化时机、配置参数等关键细节。同时,文档中...
构造方法是一种特殊的方法,用于初始化对象的状态。 - **无参构造**:默认构造方法。 - **带参数构造**:如`public MyClass(int id) { this.id = id; }`。 ##### 3.6 static关键字 `static`关键字用于修饰成员...
构造方法用于初始化新创建的对象的状态。 2. **字符串操作**: - 选项A正确。`String s = "你好"; int i = 3; s += i;` - 这段代码中,字符串`s`最初被赋值为"你好",然后通过`+=`运算符将整数`i`的值添加到字符...
11. **属性窗口**:允许查看和编辑对象的属性,如窗体或控件的初始设置。 总结来说,这个文档详细介绍了算法的基础概念,程序设计语言的发展,特别是VB语言的使用方法和VB 6.0集成开发环境的组成部分及操作,为初学...
在程序启动时,首先会创建`theApp`对象,并通过其初始化函数`InitInstance()`来进行应用程序的初始化工作。 ##### 2. **WinMain()** `WinMain()`是所有Windows应用程序的入口点,但在MFC中,这个函数通常被`...
10.Spring的Bean定义解析全流程梳理.mp40o*y1U(d#P3J:b.? 11.Spring的Bean加载流程与缓存过程详解.mp4 12.Spring的Bean获取流程深入解读.mp4 13.Spring的Bean创建策略分析.mp4 14.Spring单例Bean的初始化与缓存流程...
Java虚拟机(JVM)是Java程序...- 解释一下类加载机制,包括加载、验证、准备、解析和初始化阶段? 掌握这些JVM核心知识点对于Java开发者来说至关重要,它们不仅帮助理解程序运行机制,还能解决性能问题和优化代码。
以上知识点总结了《Java编程思想》前几章的主要内容,涵盖了对象的创建与存储、类的定义、函数参数和返回值、运算符与流程控制以及初始化等方面的基础知识,对于初学者理解和掌握Java语言的基本概念非常有帮助。
UED团队的设计流程管理项目 ...UED团队的设计流程管理项目是一个系统化的设计流程,它需要考虑多个方面的因素,例如用户体验、交互设计、产品应用分析、概念设计、设计原则等,以确保设计的执行顺畅、效率高、质量好。
信息系统项目管理师考点梳理 信息系统项目管理是信息系统开发的关键环节,...CMMI 是能力成熟度模型集成,它将软件开发能力分为五个级别:初始级、可重复级、已定义级、已管理级、优化级。CMMI 是软件开发的国际标准。
备战软考时梳理的一些错题和常考题 案例题: 一、软件结构设计 (一)软件质量属性 (二)风险,敏感点,权衡点 二、结构化软件系统建模 (一)流程图和数据流图 (二)实体和类的区别 (三)Essential Use Cases和...
#### 二、Hadoop的初始化与配置 在首次部署Hadoop时,需要对namenode进行格式化操作,以创建初始的元数据目录结构。 **namenode格式化命令**:使用`bin/hdfs namenode -format`命令可以完成这一过程。这一步骤至关...
### 信息系统项目管理师考点梳理知识点详解 #### 一、信息系统生命周期 信息系统生命周期是指一个信息系统从构思、设计、实现到最终被废弃所经历的过程。这一周期可以分为四个主要阶段: 1. **信息系统的规划阶段...
- 初始化:数组的静态初始化与动态初始化。 - 数组操作:如长度获取、元素访问等基本操作。 #### 三、面向对象(上) - **面向对象概念**: - 面向过程:传统的程序设计方法,侧重于函数的组合。 - 面向对象:...
- **数组声明与初始化**:演示如何声明和初始化数组,包括一维数组和多维数组。 - **数组操作**:讲解数组的常见操作,如遍历、排序、查找等。 - **数组拷贝**:探讨数组复制的方法,包括浅拷贝和深拷贝的区别。 ...