`

类初始化顺序探究

阅读更多

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的ClassLoader机制和类变量初始化顺序是提升Java编程...

    linux内存初始化

    要了解这些配置如何被内核使用,需要从boot.img文件开始探究,因为boot.img包含了内核初始化过程中的所有必要信息。 boot.img的结构包括kernel、ramdisk、secondstage等部分,其中还有一个称为boot header...

    深入探究ASP.NET Core Startup初始化问题

    Startup类相信大家都比较熟悉,在我们使用ASP.NET Core开发过程中经常用到的类,我们通常使用它进行IOC服务注册,配置中间件信息等。虽然它不是必须的,但是将这些操作统一在Startup中做处理,会在实际开发中带来许多...

    实验五.docx————电子版_docx版

    根据提供的文档信息,本次实验主要聚焦于理解和验证Java虚拟机(JVM)在执行程序时的一系列过程,包括类的加载、初始化以及实例化等关键步骤。以下是对这些知识点的详细阐述: ### 实验五:JVM执行程序的过程 #### ...

    硫酸厂化工生产控制自动化仪表探究.pdf

    1. 记忆优势:现代自动化仪表能记忆多项操作状态,为生产过程设定初始值后,能够自动进行加减乘除、MIN/MAX等运算,保障生产过程的准确性和安全性。 2. 数据处理优势:自动化仪表能够处理庞大的数据量和参数,提高...

    操作系统引导探究.rar

    5. **内核初始化**:操作系统内核加载后,会进行初始化工作,设置硬件环境,初始化驱动程序,以及进行其他必要的系统设置。 6. **用户界面**:一旦内核初始化完成,系统会启动用户界面,如图形化桌面环境(如...

    33、JVM探究.pdf

    类加载分为加载、连接(验证、准备、解析)和初始化四个阶段。加载是查找并加载类的二进制数据,连接确保类的正确性,准备阶段为静态变量分配内存并初始化为默认值,解析阶段将符号引用转换为直接引用。类加载器有...

    ARM启动代码的探究(绝对值得一看)

    2. **初始化硬件资源**:在ResetHandler函数中完成核心资源的初始化,如时钟配置、外设初始化等。 3. **跳转至`main()`函数**:初始化完成后,跳转至用户定义的`main()`函数,开始执行用户程序。 #### 结论 通过对...

    从“k倍动态减法游戏”出发探究一类组合游戏问题

    ### 从“k倍动态减法游戏”出发探究一类组合游戏问题 #### 一、引言 ##### 1.1 组合游戏的定义 在本文中,我们首先明确组合游戏的基本定义及其特点: 1. **双人游戏**:双方轮流进行操作。 2. **确定性操作**:...

    操作系统引导探究操作系统引导探究

    操作系统引导过程是计算机启动时的关键步骤,涉及到计算机硬件初始化、BIOS(基本输入输出系统)功能、引导程序的加载以及操作系统内核的加载等多个环节。以下是详细的解释: 1. **计算机启动流程**: - 当计算机...

    操作系统引导探究(简单讲解开机后如何引入操作系统)

    6. **初始化内核**:内核开始初始化,识别和配置硬件设备,加载驱动程序,设置内存管理,建立中断处理机制等。在这一阶段,操作系统开始接管硬件控制。 7. **启动用户空间**:内核初始化完成后,会启动第一个用户...

    Android应用启动速度优化策略研究.pdf

    在数据初始化阶段,开发者易忽略以下几个问题,导致应用启动时的运行效率低下: * 非必要逻辑占用初始化主线程执行时间长。 * 数据库读写操作占用大量时间。 * 不合理的资源加载和释放。 * 无效的日志记录和查询。 ...

    软件测试自动化探究.rar

    《软件测试自动化探究》 在当今的信息化社会中,软件质量的重要性不言而喻,而软件测试作为确保软件质量的关键环节,其效率和准确性直接影响着软件产品的发布速度和稳定性。随着技术的飞速发展,软件测试自动化已经...

    狂神说JVM探究.rar

    - 类的生命周期包括加载、验证、准备、初始化和卸载五个阶段。 - 双亲委派模型:类加载器在加载类时,会将任务委托给父类加载器,直到Bootstrap ClassLoader。 3. **内存区域**: - 程序计数器:记录当前线程...

    操作系统引导探究--非常好的参考资料

    操作系统引导过程是计算机启动的关键步骤,它涉及到从硬件初始化到加载操作系统内核的过程。本文将深入探讨这个主题,主要基于一个名为pyos的实验性操作系统引导程序的开发视角。 首先,计算机从按下电源按钮开始,...

    语音机器人隐马尔可夫算法探究.pdf

    文章中提到的关键词,包括非特定人语音识别、隐马尔可夫模型和初始化算法,进一步强调了研究中改进HMM模型初始化算法的主旨。研究的理论与实证成果不仅适用于语音机器人系统,还可以为语音识别领域的其他应用提供...

    Java视域下虚拟机技术运用探究.pdf

    在实际进行工作过程中,类装载器依据相应的流程进行操作,先检索与装载再链接,最后初始化。类装载器可以将class文件字节码显示过程图,有效优化传统类装载器数据显示中的不足。 运行时数据区是Java虚拟机在执行...

    可视化数据挖掘方法与技术探究.pdf

    在算法可视化技术中,算法初始化、中间结果和算法与界面映射层这三个基本功能共同作用,以完成可视化数据挖掘算法的任务。数据挖掘算法可视化的常见应用范围包括科学研究、计算机程序调试和教学等领域。 文章最后...

    嵌入式Linux快速启动技术探究.pdf

    initng能够并行启动服务,提高系统初始化的效率,而upstart则基于依赖关系启动服务,从而快速完成初始化工作。 文章最后提到,虽然OCR扫描导致部分文字识别错误,但整篇文章的通顺性以及核心知识点的表达并未受到...

    互联网时代企业信息化评价指标体系探究.docx

    ### 互联网时代企业信息化评价指标体系探究 #### 一、互联网时代背景下的企业信息化评价体系研究 ##### (一)企业信息化评价的相关指标 在互联网时代背景下,企业信息化是指企业运用现代信息技术开发信息资源,...

Global site tag (gtag.js) - Google Analytics