java中在类中实例化该类,那每次调用该对象的时候是一个对象还是每次都重新实例化

比如这个:
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 {
 public static Single a = new Single();
 public synchronized static  Single  getInstance(){
  return a ;
 }
}
public class Test{
 public static void main(String[] args){
  Single   s  = Single.getInstance();
  Single   s1 = Single.getInstance();
  System.out.println(s==s1);  //返回true 一个对象 ,  返回false 每次都new一个对象
 }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-27
单例模式 构造器应是私有(private)的 。
class Single {
private Single(){};
public static Single a = new Single();
}

判断就直接 判断两个对象实例的内存地址是否一样就OK追问

就是Single.a==Single.a呗?

追答

可以

也可 直接 输出 2个对象看其内存地址

第2个回答  2014-02-27
public static 静态公有化一个对象所以他在创建时就存在了
final只是修饰它固定
一是用于该对象现有东西已经够使用的情况下
第3个回答  推荐于2017-10-13
final修饰符的作用是定义常量。包括2个方面的含义:
1、用final修饰符修饰的变量,必须初始化;
2、用final修饰符修饰的变量,初始化后,其值在运行期间不能被改变,也就是不能再次给这个变量赋值了。

final变量的初始化:
1、定义时初始化,public static final Single a = new Single();
2、定义时不初始化,如果是成员变量在构造函数中初始化;如果是静态变量(如你提问的例子),可在静态代码块中初始化;

验证是否同一个对象,使用“==”号,表示变量引用的对象在同一地址。
Single b = Single.a;//调用一次
Single c = Single.a;//调用第二次
System.out.println(b==c); //是否为true

验证final修饰符
public static final Single a = new Single();
public static void main(String[] args){
a = new new Single();//编译时出错,a不能在被赋予新的值
}

或者在其他类中

Single.a = new Single();//编译时也出错,a不能在被赋予新的值追问

好详细,最后问一句,地一种写法中没加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的内部调用

本回答被提问者采纳
第4个回答  2014-02-27
你可以实例化,比如名字什么的,测试一下调用的是不是同一个追问

判断之后发现是一样的,所以就不懂了,不明白这个final的作用体现在哪

相似回答