为了写个实习日志,我还专门写代码测试了下对象的创建过程,囧。。。
首先看看测试的代码:
package com.test;
public class GrandFather {
static {
System.out.println("GrandFather's Static Block!");
}
private String grandFather = "This is grandFather!";
{
System.out.println("GrandFather's non Static Block!");
System.out.println(this.grandFather);
}
GrandFather() {
System.out.println("GrandFather's Constructor!");
}
}
package com.test;
public class Father extends GrandFather {
static {
System.out.println("Father's Static Block!");
}
private String father = "This is father!";
{
System.out.println("Father's non Static Block!");
System.out.println(this.father);
}
Father() {
System.out.println("Father's Constructor!");
}
}
package com.test;
public class Son extends Father {
static {
System.out.println("Son's Static Block!");
}
{
System.out.println("Son's non Static Block!");
System.out.println(this.son);
}
private String son = "This is son!";
Son() {
System.out.println("Son's Constructor!");
}
public static void main(String[] agrs) {
new Son();
}
}
三个类,从上到下依次继承上一个类。
再让我们来看下运行结果:
GrandFather's Static Block!
Father's Static Block!
Son's Static Block!
GrandFather's non Static Block!
This is grandFather!
GrandFather's Constructor!
Father's non Static Block!
This is father!
Father's Constructor!
Son's non Static Block!
null
Son's Constructor!
分析:
GrandFather's Static Block!
Father's Static Block!
Son's Static Block!
从Son类的main方法开始运行,虚拟机查找Son.class文件,发现它有个父类,于是查找Father.class,又发现Father.class有父类,于是继续查找。终于找到了最上层的父类GrandFather.class。于是从顶到底依次执行其静态成员变量和静态块,此时类加载已经完成,对象已经创建,接下来要做的就是实例化了。
..........
GrandFather's non Static Block!
This is grandFather!
GrandFather's Constructor!
Father's non Static Block!
This is father!
Father's Constructor!
Son's non Static Block!
null
Son's Constructor!
从最上层父类到最底层子类依次执行一下几个步骤:
1、在堆中给对象分配存储空间。
2、给成员变量赋予初始值(0,false,null)。
3、按顺序依次执行非静态数据成员的赋予初始值和非静态块。
4、执行构造函数。
........
Father's non Static Block!
This is father!
........
Son's non Static Block!
null
........
Son中为什么会输出为null呢?
因为我把非静态块和赋予非静态成员变量的的顺序对换了。非静态块在前。
我这样做有两个原因:
1、证明了在调用非静态块以前和非静态成员变量赋予初始值以前,非静态成员变量已经存在,并且赋予了默认值
2、证明了调用非静态块和非静态成员变量赋予初始值是同一优先级别的
总结:
对象创建过程应该是这样的:
1、即将装载某个类的时候,寻找这个类的class文件,如果有父类的话,就在寻找其父类的class文件,一直找到最顶层的父类。
2、从最顶层父类到最底层子类依次产生对象,执行对象中所有的静态成员变量和静态块
3、从最顶层父类到最底层子类依次执行如下步骤:
3.1 在堆上为类分配足够的存储空间
3.2 将该对象中所有数据设为默认值
3.3 按顺序执行该对象中非静态成员变量赋予初始值和非静态块
3.4 执行构造函数
PS:新手发帖,可能有误,如果有误,请拍板砖。
分享到:
相关推荐
"对象创建失败"是一个常见的编程或运行时错误,它可能出现在任何使用对象模型的系统中,包括大漠插件的使用过程中。下面我们将深入探讨这个问题以及可能的解决方案。 首先,我们要理解什么是对象创建。在面向对象...
在ATL中,对象创建过程通常由对象工厂(`CComObjectFactory`)完成。当调用`CoCreateInstance`时,会触发对象工厂创建对象。对象工厂负责实例化对象,并初始化其引用计数。 **4.2 内存分配** 虽然我们在代码中没有...
Java中创建对象主要有四种显式的方式,分别是使用new关键字、反射机制、克隆克隆方法...在实际开发中,选择合适的对象创建方式能够提高程序的效率和性能,同时也要注意对象创建过程中可能出现的内存泄漏和性能问题。
VB 代码创建数据库 VB 代码创建数据库是指使用 VB 编程语言来创建 Access 数据库的过程。...VB 代码创建数据库是一个复杂的过程,需要对 VB 编程语言、ADOX 和 ADODB 对象、数据库结构和设计有深入的了解。
本文将深入探讨如何创建和使用权限对象,并通过ABAP编程举例来展示其实现过程。 首先,创建一个权限对象需要在SAP的后台系统中进行。在交易代码SEAC(Authorization Objects Maintenance)中,你可以新建一个对象,...
在C++ Builder中实现G代码解释程序,开发者可以利用C++的面向对象特性,封装不同的G代码处理逻辑为独立的类。同时,C++ Builder的事件驱动模型使得与用户交互变得简单。通过这种方式,G代码解释程序不仅可以作为独立...
这些代码可能涉及到上述的UML图元素的编程实现,例如创建类来表示流程图中的节点、连接线和各种关系,以及处理对象间的交互逻辑。 在压缩包文件“liuchengtu”中,很可能包含了用于生成流程图的源代码文件。学习和...
你需要创建一个MFC应用程序框架,设计用户界面,允许用户加载G代码文件,并显示执行过程。 5. **命令执行引擎**:解析后的G代码指令需要被一个引擎执行。这个引擎会根据指令内容模拟或控制实际的CNC设备。这可能...
#### 一、Java对象、引用及创建过程 在Java中,对象是程序的基本单位,它包含了属性(成员变量)和行为(方法)。对象是由类创建出来的实例,而类则是一组具有相同属性和行为的对象的模板。 ##### 1. 对象创建与...
在本示例中,"C#简单流程图代码"是一个利用C#实现的程序,它允许用户创建和操作流程图。流程图是表示算法、工作流程或系统操作的图形表示,通常用于软件设计、项目管理等领域。 该程序的核心功能包括序列化和文件...
整个Java对象创建过程涉及到内存的动态分配、类的加载、字段的初始化、构造函数的调用等多个步骤,这些都是Java运行时系统的核心部分。了解这些机制对于编写高效且稳定的Java应用程序至关重要。通过本文,读者可以更...
《C++面向对象程序设计》是一本深入探讨C++编程技术,特别是面向对象设计的教材。本书第二版可能对原有的内容进行了更新...在学习过程中,建议结合书中的解释和练习,对代码进行修改和扩展,以增强自己的编程实践能力。
在Oracle数据库管理中,对象创建是数据库管理员和开发人员日常工作中不可或缺的一部分。Oracle对象包括触发器(Trigger)、存储过程(Stored Procedure)以及其他多种数据库组件,它们对于实现业务逻辑、数据验证...
- **注释**:良好的注释能够提高代码可读性,解释代码的功能、用途以及逻辑流程。 - **代码结构**:合理使用空格、缩进,使代码看起来整洁;遵循SRP(单一职责原则),每个类或方法只做一件事。 - **异常处理**:...
在本主题中,“使用对象创建快捷方式”指的是利用易语言的对象编程机制来创建Windows系统中的快捷方式文件(.lnk文件)。 创建快捷方式涉及到以下几个关键知识点: 1. **对象模型**:在易语言中,通过类库可以创建...
首先,我们来了解一下编译期的`String`对象创建,这通常与字符串字面量有关。在Java源代码中,当使用双引号定义一个字符串,例如`"hello"`,Java编译器会将这些字面量字符串存储在常量池中。这种方式创建的`String`...
在IT行业中,编程语言是构建软件和应用的基础...这些示例代码可以作为学习易语言的宝贵资源,帮助初学者理解对象创建和用户交互的基本原理。在实际编程过程中,可以根据需求修改和扩展这些代码,以适应不同的应用场景。
每个"lesson"可能包括具体的Java代码示例,解释如何运用这些面向对象的特性。例如,"lesson02"可能讲解类和对象的基础,"lesson18"可能涉及继承的实现,"lesson26"可能是关于多态的案例,而"lesson27"可能探讨封装的...
对于初次接触VBA的新手来说,一个优秀的VBA代码解释器是非常宝贵的资源,它能帮助理解并调试代码,从而提升学习效率。 标题中的“VBA代码解释器”很可能是一款专门用于帮助用户理解和执行VBA代码的工具。这样的解释...