`
cakin24
  • 浏览: 1334357 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

初始化块和构造器的执行顺序问题

    博客分类:
  • java
阅读更多

一 初始化块和构造器的执行顺序问题一般性规定

1 初始化块总在构造器之前执行,初始化块不能接受形参。

2 用static修饰的初始化块为静态初始化块,由于是静态的,所以是属于类,当类加载时,就执行静态初始化块,但执行一个子类时,最先执行其顶层父类的静态初始化。

3 如果初始化块是属于实例的,只要创建一次对象,初始化块就执行一次。

 

二 初始化块和构造器综合应用

1 代码示例

class Root
{
	static{
		System.out.println("Root的静态初始化块");
	}
	{
		System.out.println("Root的普通初始化块");
	}
	public Root()
	{
		System.out.println("Root的无参数的构造器");
	}
}
class Mid extends Root
{
	static{
		System.out.println("Mid的静态初始化块");
	}
	{
		System.out.println("Mid的普通初始化块");
	}
	public Mid()
	{
		System.out.println("Mid的无参数的构造器");
	}
	public Mid(String msg)
	{
		// 通过this调用同一类中重载的构造器
		this();
		System.out.println("Mid的带参数构造器,其参数值:"
			+ msg);
	}
}
class Leaf extends Mid
{
	static{
		System.out.println("Leaf的静态初始化块");
	}
	{
		System.out.println("Leaf的普通初始化块");
	}
	public Leaf()
	{
		// 通过super调用父类中有一个字符串参数的构造器
		super("软件秘笈");
		System.out.println("执行Leaf的构造器");
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new Leaf();
		new Leaf();
	}
}

 2 运行结果

Root的静态初始化块

Mid的静态初始化块

Leaf的静态初始化块

Root的普通初始化块

Root的无参数的构造器

Mid的普通初始化块

Mid的无参数的构造器

Mid的带参数构造器,其参数值:软件秘笈

Leaf的普通初始化块

执行Leaf的构造器

Root的普通初始化块

Root的无参数的构造器

Mid的普通初始化块

Mid的无参数的构造器

Mid的带参数构造器,其参数值:软件秘笈

Leaf的普通初始化块

执行Leaf的构造器

3 结果分析

3.1 第一次创建第一个Leaf对象时,因为系统中还不存在Leaf类,因此需要先加载并初始化Leaf类,初始化Leaf类时会先执行其顶层父类静态初始化,再执行其直接父类的静态初始化块,最后才执行Leaf本身静态初始化块。

3.2 一旦Leaf类初始化成功后,Leaf类在该虛拟机中将一直存在,因此,当第二次创建Leaf实例时无须再对Leaf类进行初始化。

3.3普通初始化块和构造顺序与前面介绍的一致,每次创建一个Leaf对象时,都需先执行最顶层父类的初始化,构造器,然后执行其父类初始化,构造器…最后才执行Leaf类的初始化块和构造器。

 

三 静态初始化块与指定初始化值的静态成员执行顺序问题

1 代码示例

public class StaticInitTest
{
	// 先执行静态初始化块将a静态成员变量赋值为6
	static
	{
		a = 6;
	}
	// 再将a静态成员变量赋值为9
	static int a = 9;
	public static void main(String[] args)
	{
		// 下面代码将输出9
		System.out.println(StaticInitTest.a);
	}
}

2 运行结果

9

3 结果分析

当JVM第一次主动使用某个类时,系统会在类准备阶段为该类所有静态成员分配内存,在初始化阶段则负责初始化这些静态成员变量,初始化静态成员变量就是执行类初始化代码或声明类成员变量时的初始值,它们的执行顺序与源代码中的排列顺序相同。

0
0
分享到:
评论

相关推荐

    深入理解java构造器机理

    java构造方法是java类中最重要的一个概念,这篇文档涵盖了,java对象初始化过程中构造器调用的顺序,及作用。

    杰普学习corejava总结笔记

    2.构造器执行顺序 1.类加载,同时初始化类中静态的属性(赋默认值) 2.执行静态代码块 3.分配内存空间,同时初始化非静态的属性(赋默认值) 4.调用父类构造器(注意调用父类构造器之前已经给父类的非静态的属性显示...

    c#构造初始化的顺序浅析

     public Base() { System.Console.WriteLine(“我是基类构造器”); } }  class Program { static void Main(string[] args) { Base d = new Base(); } }对于上面的代码。是先执行构

    关于JVM的总结

    初始化:在准备阶段已经赋过一个系统要求的初始值,而在初始化阶段则通过程序制定的主管计划去初始化变量和其他资源,从另一个角度理解就是 执行类构造器的()方法 .()方法是由编译器自动收集类中的所有变量的复制动作和...

    编程思想下篇

    5.1 用构造器确保初始化 5.2 方法重载 5.2.1 区分重载方法 5.2.2 涉及基本类型的重载 5.2.3 以返回值区分重载方法 5.3 缺省构造器 5.4 this关键字 5.4.1 在构造器中调用构造器 5.4.2 static的含义 5.5 清理:终结...

    Thinking in java4(中文高清版)-java的'圣经'

    5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...

    突破程序员基本功的16课.part2

    5.8.3 静态初始化块启动新线程执行初始化 5.8.4 注意多线程执行环境 5.9 小结 第6课 流程控制的陷阱 6.1 switch语句陷阱 6.1.1 default分支永远会执行吗 6.1.2 break的重要性 6.1.3 switch表达式的类型 6.2...

    疯狂JAVA讲义

    5.5.1 使用构造器执行初始化 141 学生提问:构造器是创建Java对象的途径,是不是说构造器完全负责创建Java对象? 141 5.5.2 构造器的重载 142 学生提问:为什么要用this来调用另一个重载的构造器?我把另一个构造...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    conman:ConMan容器初始化器

    骗子ConMan是一个容器初始化程序,它使用环境变量,命令行参数和配置文件来呈现模板,设置环境变量并执行二进制文件。 它旨在用作容器的init,以避免编写某种形式的bash脚本来为您完成所有繁琐的工作。手术ConMan...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    17.2.3 使用构造器来初始化特性 484 17.2.4 System.AttributeUsage-Attribute 488 17.2.5 命名参数 488 17.3 使用动态对象进行编程 498 17.3.1 使用dynamic调用反射 499 17.3.2 dynamic的...

    链接器和加载器linkers and loaders

    保证在程序主体执行之前使成百个C源文件中的初始化例程可以执行,程序员不得 不做的那堆事情)。有了功能更强大的链接器的支持,未来的语言将更加自动化而 不仅限于程序范畴内的常规任务。由于链接是编译过程中将...

    java深入解析

    143 话题24 一词多义——方法重载的详细说明 150 话题25 踵事增华——方法重写的真正条件 166 话题26 一叶障目——方法与成员变量的隐藏 177 话题27 发轫之始——执行初始化的构造器 182 话题28 殊途同归——成员...

    C#与.NET技术平台实战演练.part2

    initializer10-5初始化只读数据10-6在构造器中使用out与ref10-7struct构造器10-7-1struct构造器的限制10-8static构造器10-8-1使用static构造器初始化静态成员10-8-2static构造器的限制10-9对象与内存10-9-l对象的...

    C#与.NET技术平台实战演练.part1

    initializer10-5初始化只读数据10-6在构造器中使用out与ref10-7struct构造器10-7-1struct构造器的限制10-8static构造器10-8-1使用static构造器初始化静态成员10-8-2static构造器的限制10-9对象与内存10-9-l对象的...

    JAVA基础课程讲义

    构造器(或者叫做构造方法,constructor) 60 垃圾回收机制(Garbage Collection) 63 方法的重载(overload),构造方法的重载 63 this关键字 65 static 关键字 66 静态初始化块(经常用来初始化类,加载类信息时执行!) ...

    Java设计中的Builder模式的介绍

    相同的方法,不同的执行顺序,产生不同的事件结果 多个部件或零件,都可以装配到一个对象中,但产生的运行结果又不相同时 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用 当初始化一个对象特别复杂...

    传智播客扫地僧视频讲义源码

    05_课堂答疑对象的初始化和对象的赋值是两个不同的概念 06_为什么需要构造和析构函数 07_copy构造函数的调用时机1和2 08_课堂答疑 09_copy构造函数调用时机3_传智扫地僧 10_copy构造函数调用时机4_函数返回值是匿名...

Global site tag (gtag.js) - Google Analytics