静态数据的初始化

本文详细分析了Java中静态数据的初始化顺序,包括静态对象、非静态对象的初始化时机,以及类内部变量的初始化顺序。通过示例展示了类加载过程,强调静态初始化仅在Class对象首次加载时执行一次,并探讨了静态域与非静态域的初始化行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静态数据的初始化


java编程思想中用这段代码来展示静态数据的初始化过程,一开始没看懂,现在来仔细分析一遍吧。

class Bowl{
	Bowl(int marker) {
		// TODO Auto-generated constructor stub
		System.out.println("Bowl("+marker+")");
	}
	void f1(int marker) {
		System.out.println("f1("+marker+")");
	}
}
class Tabel{
	static Bowl bowl=new Bowl(1);
	Tabel() {
		System.out.println("Tabel()");
		bowl2.f1(1);
	}
	void f2(int marker) {
		System.out.println("f2("+marker+")");
	}
	static Bowl bowl2=new Bowl(2);
}
class Cupboard{
	Bowl bowl3=new Bowl(3);
	static Bowl bowl4=new Bowl(4);
	Cupboard() {
		System.out.println("Cupboard()");
		bowl4.f1(2);
	}
	void f3(int marker) {
		System.out.println("f3("+marker+")");
	}
	static Bowl bowl5=new Bowl(5);
}
public class StaticInitialization {
	public static void main(String args[]) {
		System.out.println("Creating new Cupboard() in main");
		new Cupboard();
		System.out.println("Creating new Cupboard() in main");
		new Cupboard();
		table.f2(1);
		cupboard.f3(1);
	}
	static Tabel table=new Tabel();
	static Cupboard cupboard=new Cupboard();
}

下面是运行结果

Bowl(1)
Bowl(2)
Tabel()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)

分析结果前你要知道的:
(1) 初始化顺序是 先静态对象,而后是非静态对象
(2) 静态初始化只在Class对象首次加载的时候进行一次
(3) 类的内部,变量定义的先后顺序决定了初始化的顺序。变量会在任何方法(包括构造器)被调用之前得到初始化。

程序首先进入main方法,初始化StaticInitialization,StaticInitialization有两个静态域 table,cupboard,随后这两个静态域对应的类也被加载,由于这两个类包含静态对象Bowl对象,所以Bowl也被加载。

初始化Tabel:先初始化bowl1,bowl2 输出 Bowl(1) Bowl(2)
调用构造器Tabel() 输出 Tabel() f1(1)

初始化Cupboard:初始化静态对象 bowl4,bowl5,接着按照顺序初始化第一个非静态对象 bowl3,调用构造器Cupboard() 输出Bowl(4), Bowl(5), Bowl(3), Cupboard(), f1(2)

两个类初始化完毕,进入main
输出 Creating new Cupboard() in main
接着又初始化一遍Cupboard,这一次静态对象不会被初始化(因为静态对象只会初始化一次),其他与上面所说一样,输出 Bowl(3) Cupboard() f1(2)

紧接着又来一遍输出
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)

最后调用table,cupboard的f2, f3方法,输出 f2(1) f3(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值