本帖最后由 乔青山 于 2014-2-27 11:53 编辑
刚才看到一同学问道下面这种写法可不可以:class Single {
private Single(){}
public static Single a = new Single();
}
第一反应感觉这种写法每次调用a的时候都会实例化一个新的对象。于是写了个小程序测试:
class TestSingle{
public static void main(String[] args){
System.out.println(Single.a);
System.out.println(Single.a);
}
}
class Single {
private Single(){}
public static Single a = new Single();
}
结果发现,输出的地址是一样。于是就凌乱了。。。百度谷歌一番,又思索了一番后:
感觉其实public static Single a = new Single();就和public static int num = 1;一样。
在执行这句代码的时候内存已经把a的引用确定了,所以之后的每次调用都不会再实例化了。
然而~百度谷歌中发现了这个http://callmegod.iteye.com/blog/1474441
这里面讲到了这么一个写法:
public class MaYun {
private MaYun(){}
public static final MaYun instance = new MaYun();
}
发现和上面写法差不多,唯一的区别是这个用final修饰了对象,有一番百度谷歌后查阅到:
final修饰的对象,引用不变,但是引用的内容仍然可变。个人理解就是只能指向一个空间,空间里的内容可变。
那问题来了:
不加final的时候测试对象就是一个,那这个final岂不是加的有些浪费?
不可以给instance重新定义对象?构造器是私有的,类外本来就不可能再定义对象了,怎么还给给instance重新定义呢?
保证每次调用的是同一个对象?不加final每次调用的也是同一个对象,同样可以保证
final的作用体现在什么地方?
|