| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 755 人关注过本帖
标题:求大神解释下面代码为什么是true,单例类又是什么
只看楼主 加入收藏
名尾
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:7
专家分:100
注 册:2015-2-21
结帖率:0
收藏
已结贴  问题点数:10 回复次数:7 
求大神解释下面代码为什么是true,单例类又是什么
class Singleton
{
        private static Singleton instance;
        private Singleton(){}
        public static Singleton getInstance()
        {
                if(instance == null)
                {
                        instance = new Singleton();
                }
                return instance;
        }
        public static void main(String[] args)
        {
                Singleton s1 = Singleton.getInstance();
                Singleton s2 = Singleton.getInstance();
                System.out.println(s1 == s2);
        }
}
搜索更多相关主题的帖子: private public return null 
2015-03-02 15:50
名尾
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:7
专家分:100
注 册:2015-2-21
收藏
得分:0 
大神在哪里
2015-03-02 15:55
keithorbit
Rank: 1
等 级:新手上路
帖 子:2
专家分:3
注 册:2014-11-19
收藏
得分:3 
这个是单例啊。先是S1创建一个对象,然后S2来了,先判断这个类是不是存在一个对象,存在了S1对象了,那么就不创建了直接把S1指向对象赋值给S2,所以S1==S2
2015-03-02 16:24
名尾
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:7
专家分:100
注 册:2015-2-21
收藏
得分:0 
回复 3楼 keithorbit
S1和S2难道不是new出来的吗,new出来的就不相等了啊
2015-03-02 17:59
编号1016
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:46
专家分:188
注 册:2014-5-8
收藏
得分:3 
s1的值跟s2的值是相等的,你的输出当然是对的,换句话说就是true了

相互学习,让自己变得更强大!
2015-03-03 14:49
samkakk
Rank: 2
等 级:论坛游民
帖 子:2
专家分:10
注 册:2014-5-17
收藏
得分:3 
小弟 拙见:
== 不仅是字面上的值要相等 比如 1==1,而且其两边指向对象的内存地址也要相同。
按步骤看,s1 实例化的时候 instance 是null吧。然后进了if,此时Singleton类 实例化一个对象 ,暂且这个对象叫A,然后赋给静态变量instance。
判断结束返回实例instance,此时s1指向的是A,instance也是指向A。
然后s2 开始实例化了,发现Singleton 类里的变量instance 的值不是null,而是指向A,此时判断过不去,返回instance。
此时instance还是指向A,s2当然也指向A了。
至于第二次instance为什么不是null,那是因为GC 垃圾回收器没有回收,因为instance有值。

[ 本帖最后由 samkakk 于 2015-3-4 16:54 编辑 ]
2015-03-04 16:53
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:3 
单例是一种设计模式,下面的帖子里有一些简介,可以参考一下
https://bbs.bccn.net/thread-438043-1-1.html

s1和s2不是new出来的,而是通过调用Singleton.getInstance()生成的

下面是你的代码:
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();

第一次对s1来讲,走if分支;第二次对s2来讲,由于instance不为null,所以直接就返回instance
if(instance == null) {
    instance = new Singleton(); // s1走这里
}
return instance; // s2不进if语句直接走这里

正是由于s1和s2都指向instance,所以用==判断它们也是完全相等的

如果是new出来的,就是下面这样的代码了
Singleton s1 = new Singleton();
Singleton s2 = new Singleton();

本来,对于一般的类这么写是没有问题的,和你的想法也一样,这个时候由于指向不同的new出来的对象,==返回的应该为false

但是,对于单例模式来讲,比较特殊
是由于下面这条语句:
private Singleton(){}
这条语句叫做:私有的构造方法,嗯,不允许类外边new对象出来,非那么写,会得到一个编译错误

如果还有疑问,可以参考我推荐给你的帖子
2015-03-04 21:15
xi1006965415
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-3-10
收藏
得分:0 
因为是单例模式
    public static Singleton getInstance()
         {
                 if(instance == null)//如果instance 对象为 null  就 new 一个 否则 就直接返回  已创建的对象
                 {
                         instance = new Singleton();
                 }
                 return instance;
         }
所以s1和s2 是同一个对象
2015-03-10 11:04
快速回复:求大神解释下面代码为什么是true,单例类又是什么
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015370 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved