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

比如这个:classSingle{publicstaticSinglea=newSingle();}我在看单例模式的时候看到在类中这么实例化该类的:publicstati... 比如这个:
class Single {

public static Single a = new Single();
}
我在看单例模式的时候看到在类中这么实例化该类的:
public static final Single a = new Single();
然后查阅了一下用final来修饰对象,作用是对该对象的引用不变(我理解就是每次都是操作一个对象)。
那么我想问一下:不用final修饰的话,每次调用a的时候都是一个新的对象么?有没有什么小程序能检验一下?
展开
 我来答
love爱有缘
2014-02-27 · TA获得超过1041个赞
知道小有建树答主
回答量:789
采纳率:0%
帮助的人:695万
展开全部

这个不是你说的

第一: 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一个对象
 }
}
xiao1596377
2014-02-27 · TA获得超过552个赞
知道答主
回答量:194
采纳率:0%
帮助的人:121万
展开全部
单例模式 构造器应是私有(private)的 。
class Single {
private Single(){};
public static Single a = new Single();
}

判断就直接 判断两个对象实例的内存地址是否一样就OK
追问
就是Single.a==Single.a呗?
追答
可以    

也可 直接 输出 2个对象看其内存地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
尉坚6h
2014-02-27 · 超过10用户采纳过TA的回答
知道答主
回答量:28
采纳率:0%
帮助的人:15.3万
展开全部
public static 静态公有化一个对象所以他在创建时就存在了
final只是修饰它固定
一是用于该对象现有东西已经够使用的情况下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hfktv
推荐于2017-10-13
知道答主
回答量:12
采纳率:0%
帮助的人:14.9万
展开全部
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的内部调用
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-02-27
展开全部
你可以实例化,比如名字什么的,测试一下调用的是不是同一个
追问
判断之后发现是一样的,所以就不懂了,不明白这个final的作用体现在哪
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式