比如这个:
class Single {
public static Single a = new Single();
}
我在看单例模式的时候看到在类中这么实例化该类的:
public static final Single a = new Single();
然后查阅了一下用final来修饰对象,作用是对该对象的引用不变(我理解就是每次都是操作一个对象)。
那么我想问一下:不用final修饰的话,每次调用a的时候都是一个新的对象么?有没有什么小程序能检验一下?
这个不是你说的
第一: final 修饰属性,只是代表该属性的引用在使用的过程不可以发生改变。 及 a 只能指向 new Single()这个对象
第二: static修饰属性,该属性就和对象脱离的关系,不在依赖对象,只和类有关系。
所以 public static Single a = new Single(); 这么写后, 当虚拟机第一次加载 Single的时候,初始化 对象并赋值给 变量 a (引用不可更改啦)
以后访问 Single的时候,均不在实例化a
想要判断是否是一个对象的方法
class Single {就是Single.a==Single.a呗?
追答可以
也可 直接 输出 2个对象看其内存地址
好详细,最后问一句,地一种写法中没加final,为什么测试出的两个地址仍然一样?
追答这个和final就没有关系了,你可以体会下下面这段代码
public static Single a = new Single(); //注意这里没有使用final
public class Test{
public static void main(String[] args){
Single b = Single.a;
Single.a = new Single(); //注意这里,给Single.a赋予了新的对象;
Single c = Single.a;
System.out.println(b==c); //这里应该打印出false
}
}
看完了不要困惑;
变量是否改变引用,是你自己编写的代码决定的,你的代码里如果没有明确的给变量赋值,那变量的引用是不会改变的。
我觉得你的困惑可能是对static关键字不理解,或单例模式不清楚
static的作用是使变量成为类级别,在运行期间,类是不能有多个实例的,类中的static变量也就保持唯一;
单例模式中,的关键是构造函数私有,这样Single.a = new Single(); 在Single类外面的调用就不成立。因为new Single()是私有的只能在Single的内部调用
判断之后发现是一样的,所以就不懂了,不明白这个final的作用体现在哪