单例模式和类加载的实际案例分析(java)

类加载的步骤包括加载、准备、验证、解析、初始化、使用等过程,本文主要分析实例代码,一步步分析得出输出结果。要分析的实例代码如下:

public class Singleton {
	private static Singleton instance = new Singleton(); 
	public static int counter1;
	public static int counter2 = 0;
	
	private Singleton() {
		counter1++;
		counter2++;
	}
	
	public static Singleton getInstance() {
		return instance;
	}
	
	public static void main(String[] args) {
		MyMain.main(args);
	}
}

class MyMain {
	public static void main(String[] args) {
		Singleton obj = Singleton.getInstance();
		System.out.println("counter1 == " + obj.counter1);
		System.out.println("counter2 == " + obj.counter2);
	}
}
代码在不运行的情况下能够通过分析,得出结果么?我们一步步分析一下。(代码中两个类两个main方法,只因为想在测试类MyMain里对Singleton类进行测试,但是eclipse运行时找不到选项,才在Singleton类中main方法中调用了MyMain类的main方法。)


在程序启动时,程序会寻找包含main方法的类,这里我指定Singleton类中的main方法作为首先启动项,Singleton类会被加载。在准备阶段,instance静态字段会被赋值为null,counter1和counter2字段会被赋值为0;在初始化阶段,发现Singleton类含有静态字段,会为Singleton类生成clinit方法,该方法包含了所有静态字段的赋值操作,且顺序为静态字段声明的顺序。所以,初始化一开始,instance会使用new关键字新建一个Singleton对象。使用new关键字是,Singleton类的私有构造器会被调用,所以counter1 = 1, counter2 = 1; clinit方法继续执行,counter2因为有赋值操作,所以在clinit中它会被赋值counter2 = 0。


Singleton类的加载结束了,进入MyMain的main方法中,由于Singleton类已经被加载,所以直接返回instance对象,打印的值为:

counter1 = 1
counter2 = 0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值