求Java大神,小神,新手看看面试题

专业打酱油 发布于 2013/07/23 15:51
阅读 455
收藏 0
public class D {

	private byte[] b = new byte[1024 * 1024 * 50];
	private static D _instance ;
	private D() {
		System.out.println("init");
	}
	
	public static D getInstance(){
		if(null == _instance){
			_instance = new D();
		}
		return _instance;
	}
	
	public static void main(String[] args) {
		D.getInstance();
	}
}

问题1:

为啥每执行一次main方法,都有一次init?

问题2:

main方法中执行多次D.getInstance();仅有1次init?

请问为什么?

加载中
1
卖切糕大叔
卖切糕大叔
每个main方法都会启动一个单独的进程,内存里各个进程式各自独立的,不能互相调用变量;
另外,内存的进程结束后运行中生成的对象和类(持久化的除外)都会被释放掉,以后都不能再找到了;
所以即便是单例模式,你每次调用main运行都要init
0
z
zjwzcnjsy
public class D {

	private byte[] b = new byte[1024 * 1024 * 50];
	private static D _instance ;
	private D() {
		System.out.println("init");
	}
	
	public static D getInstance(){
		if(null == _instance){
			_instance = new D();
		}
		return _instance;
	}
	
	public static void main(String[] args) {
		D.getInstance();
		D.getInstance();
		D.getInstance();
		D.getInstance();
	}
}
专业打酱油
专业打酱油
Up!
0
loki_lan
loki_lan
构造器在NEW的时候才会执行,你这个是单例。
专业打酱油
专业打酱油
回复 @铂金小猫 : 嗯,说的不错。我更喜欢直接的!
loki_lan
loki_lan
回复 @专业打酱油 : 额,有些东西如果自己亲自去找原因印象更深刻,比起别人直接给你答案,自己要更多地主动去根据别人的提示去找。
专业打酱油
专业打酱油
回复 @铂金小猫 : 看看 @伊万 @卖切糕大叔 的回复,简单明了。
loki_lan
loki_lan
回复 @专业打酱油 : 你应该去了解一下main方法,他不只是你想的简单的一个方法。
专业打酱油
专业打酱油
回复 @铂金小猫 : 静态变量呢?为什么每次执行都有新对象生成?
下一页
0
云想衣裳花想容
云想衣裳花想容

因为你的mian方法调用的是构造函数的_instance属性,虽然程序每次都是走的D构造函数,你不论调用多次,程序都是走最后一个D.getInstance(),然后打印_instance的值,这个问题不需要问,不明白自己调试就OK了。

0
专业打酱油
专业打酱油

引用来自“Edsondi”的答案

因为你的mian方法调用的是构造函数的_instance属性,虽然程序每次都是走的D构造函数,你不论调用多次,程序都是走最后一个D.getInstance(),然后打印_instance的值,这个问题不需要问,不明白自己调试就OK了。

构造函数的_instance属性?点解
0
伊万
伊万

1、main()方法结束后,主线程结束,虚拟机结束。每次都执行 _instance =newD();所以,main中只有一个D.getInstance();时每次都打印“init”。

2、这是一个典型的单例,main方法中有多个D.getInstance();时,只有第一次调用D.getInstance();时方才执行 _instance =newD();,此后,因为_instance已被实例化,每次直接返回_instance,不再执行new。所以,打印一次“init”。main执行完后,虚拟机停止。

0
tawnie
tawnie
D是单例
返回顶部
顶部