java中在类中实例化该类,那每次调用该对象的时候是一个对象还是每次都重新实例化
比如这个:classSingle{publicstaticSinglea=newSingle();}我在看单例模式的时候看到在类中这么实例化该类的:publicstati...
比如这个:
class Single {
public static Single a = new Single();
}
我在看单例模式的时候看到在类中这么实例化该类的:
public static final Single a = new Single();
然后查阅了一下用final来修饰对象,作用是对该对象的引用不变(我理解就是每次都是操作一个对象)。
那么我想问一下:不用final修饰的话,每次调用a的时候都是一个新的对象么?有没有什么小程序能检验一下? 展开
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一个对象
}
}
展开全部
单例模式 构老键册造器应是私有(private)的 。
class Single {
private Single(){};
public static Single a = new Single();
}
判断就直接 判侍宏断两个对象实例的内存地址是亮念否一样就OK
class Single {
private Single(){};
public static Single a = new Single();
}
判断就直接 判侍宏断两个对象实例的内存地址是亮念否一样就OK
追问
就是Single.a==Single.a呗?
追答
可以
也可 直接 输出 2个对象看其内存地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public static 静态公有化一个对象所以他在创建时就存在键森了
final只是修饰它固定
一是用于该对象现有东慧缺西已前亮辩经够使用的情况下
final只是修饰它固定
一是用于该对象现有东慧缺西已前亮辩经够使用的情况下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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不能在被赋予新的值
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的作用体现在哪
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询