1.本例子借用thinkingInJava第4版中文版P163中PolyConstructors.java例子修改后,说明一定问题:
该类中包含:静态属性、静态代码块、成员变量、普通代码块、父子类关系、子类重写父类方法
package com.iteye.bobby.base;
import static net.mindview.util.Print.*;
class Glyph {
private static String baseStr = "static String field";
static {
System.out.println("baseStr = " + baseStr);
System.out.println("Glyph.enclosing_method(static)");
}
{
System.out.println("Glyph.enclosing_method(noraml)");
}
Glyph() {
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
void draw() {
print("Glyph.draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
private Glyph glyph = new Glyph();//成员变量赋值时创建对象
static {
System.out.println("RoundGlyph.enclosing_method(static)");
}
{
System.out.println("RoundGlyph.enclosing_method(noraml)");
System.out.println(" radius = " + radius);
System.out.println("new glyph() = " + glyph);
}
RoundGlyph(int r) {
radius = r;
print("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
print("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
Result:
baseStr = static String field
Glyph.enclosing_method(static)
RoundGlyph.enclosing_method(static)
Glyph.enclosing_method(noraml)
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
Glyph.enclosing_method(noraml)
Glyph() before draw()
Glyph.draw()
Glyph() after draw()
RoundGlyph.enclosing_method(noraml)
radius = 1
new glyph() = com.iteye.bobby.base.Glyph@61de33
RoundGlyph.RoundGlyph(), radius = 5
2.总结类的初始化顺序
1)类的初始化
a.初始化类属性、初始化类静态代码块(先父后子,按书写顺序执行)
2)对象的创建
a.所有的成员变量—包括该类,及它的父类中的成员变量--被分配内存空间,并赋予默认值。
b.为父类的成员变量赋值,并执行父类的普通代码块(按书写顺序执行)
c.执行父类构造函数
d.为子类的成员变量赋值,并执行子类普通的代码块(如果成员变量赋值时创建对象,则先父后子执行普通代码块和构造方法,然后在往下走)
e.执行子类构造函数
分享到:
相关推荐
同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...
要了解这些配置如何被内核使用,需要从boot.img文件开始探究,因为boot.img包含了内核初始化过程中的所有必要信息。 boot.img的结构包括kernel、ramdisk、secondstage等部分,其中还有一个称为boot header...
Startup类相信大家都比较熟悉,在我们使用ASP.NET Core开发过程中经常用到的类,我们通常使用它进行IOC服务注册,配置中间件信息等。虽然它不是必须的,但是将这些操作统一在Startup中做处理,会在实际开发中带来许多...
根据提供的文档信息,本次实验主要聚焦于理解和验证Java虚拟机(JVM)在执行程序时的一系列过程,包括类的加载、初始化以及实例化等关键步骤。以下是对这些知识点的详细阐述: ### 实验五:JVM执行程序的过程 #### ...
1. 记忆优势:现代自动化仪表能记忆多项操作状态,为生产过程设定初始值后,能够自动进行加减乘除、MIN/MAX等运算,保障生产过程的准确性和安全性。 2. 数据处理优势:自动化仪表能够处理庞大的数据量和参数,提高...
此过程通常包括初始化通信、擦除旧固件、写入新固件等一系列精细步骤。USB烧录工具便是为简化这一过程而设计的软件,它能够与USB端口配合,通过特定的指令集与设备进行通信,从而实现固件的烧录。 接下来,我们来...
5. **内核初始化**:操作系统内核加载后,会进行初始化工作,设置硬件环境,初始化驱动程序,以及进行其他必要的系统设置。 6. **用户界面**:一旦内核初始化完成,系统会启动用户界面,如图形化桌面环境(如...
类加载分为加载、连接(验证、准备、解析)和初始化四个阶段。加载是查找并加载类的二进制数据,连接确保类的正确性,准备阶段为静态变量分配内存并初始化为默认值,解析阶段将符号引用转换为直接引用。类加载器有...
2. **初始化硬件资源**:在ResetHandler函数中完成核心资源的初始化,如时钟配置、外设初始化等。 3. **跳转至`main()`函数**:初始化完成后,跳转至用户定义的`main()`函数,开始执行用户程序。 #### 结论 通过对...
### 从“k倍动态减法游戏”出发探究一类组合游戏问题 #### 一、引言 ##### 1.1 组合游戏的定义 在本文中,我们首先明确组合游戏的基本定义及其特点: 1. **双人游戏**:双方轮流进行操作。 2. **确定性操作**:...
操作系统引导过程是计算机启动时的关键步骤,涉及到计算机硬件初始化、BIOS(基本输入输出系统)功能、引导程序的加载以及操作系统内核的加载等多个环节。以下是详细的解释: 1. **计算机启动流程**: - 当计算机...
6. **初始化内核**:内核开始初始化,识别和配置硬件设备,加载驱动程序,设置内存管理,建立中断处理机制等。在这一阶段,操作系统开始接管硬件控制。 7. **启动用户空间**:内核初始化完成后,会启动第一个用户...
在数据初始化阶段,开发者易忽略以下几个问题,导致应用启动时的运行效率低下: * 非必要逻辑占用初始化主线程执行时间长。 * 数据库读写操作占用大量时间。 * 不合理的资源加载和释放。 * 无效的日志记录和查询。 ...
《软件测试自动化探究》 在当今的信息化社会中,软件质量的重要性不言而喻,而软件测试作为确保软件质量的关键环节,其效率和准确性直接影响着软件产品的发布速度和稳定性。随着技术的飞速发展,软件测试自动化已经...
- 类的生命周期包括加载、验证、准备、初始化和卸载五个阶段。 - 双亲委派模型:类加载器在加载类时,会将任务委托给父类加载器,直到Bootstrap ClassLoader。 3. **内存区域**: - 程序计数器:记录当前线程...
操作系统引导过程是计算机启动的关键步骤,它涉及到从硬件初始化到加载操作系统内核的过程。本文将深入探讨这个主题,主要基于一个名为pyos的实验性操作系统引导程序的开发视角。 首先,计算机从按下电源按钮开始,...
文章中提到的关键词,包括非特定人语音识别、隐马尔可夫模型和初始化算法,进一步强调了研究中改进HMM模型初始化算法的主旨。研究的理论与实证成果不仅适用于语音机器人系统,还可以为语音识别领域的其他应用提供...
在实际进行工作过程中,类装载器依据相应的流程进行操作,先检索与装载再链接,最后初始化。类装载器可以将class文件字节码显示过程图,有效优化传统类装载器数据显示中的不足。 运行时数据区是Java虚拟机在执行...
在算法可视化技术中,算法初始化、中间结果和算法与界面映射层这三个基本功能共同作用,以完成可视化数据挖掘算法的任务。数据挖掘算法可视化的常见应用范围包括科学研究、计算机程序调试和教学等领域。 文章最后...
initng能够并行启动服务,提高系统初始化的效率,而upstart则基于依赖关系启动服务,从而快速完成初始化工作。 文章最后提到,虽然OCR扫描导致部分文字识别错误,但整篇文章的通顺性以及核心知识点的表达并未受到...