黑马程序员技术交流社区

标题: 关于单例设计模式 [打印本页]

作者: rolling-stone    时间: 2014-8-1 01:24
标题: 关于单例设计模式
下面是一个简单的传入数值的单利设计模式的应用.
  1. class  Single
  2. {
  3.         int num;
  4.         private Single(){}
  5.         private static Single s = new Single();
  6.         public void setNum(int num)
  7.         {
  8.                 this.num = num;
  9.         }
  10.         public int getNum()
  11.         {
  12.                 return num;
  13.         }
  14.         public static Single getInstance()
  15.         {
  16.                 return s;
  17.         }
  18. }
  19. class SingleDemo
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 Single s1 = Single.getInstance();
  24.                 Single s2 = Single.getInstance();
  25.                 s1.setNum(30);
  26.                 System.out.println(s2.getNum());
  27.         }
  28. }
复制代码
请问一下,为什么最下面的SingleDemo类中,不可以将SingleDemo类的对象实例化,就是在
固定是在SingleDemo类中是这样表示的:
Single s1 = Single.getInstance();
为什么不可以是:
SingleDemo s1 = Single.getInstance;
谢谢!

作者: lcl    时间: 2014-8-1 07:32
单例设计模式一直都看不懂。。
作者: 刘沙    时间: 2014-8-1 08:06
SingleDemo s1 = Single.getInstance;这个是不行的 因为你的这里用的是私有修饰 private static Single s = new Single();
作者: 阿磊    时间: 2014-8-1 08:26
亲,你想new的对象是Single的,SingleDemo不是主函数的类吗,你new主函数的类,怎么能用其它类的方法呢,SingleDemo s = new SingleDeme();这样才能得到主函数的对象,这里为什么Single只能用Single.getInstance来获得呢,因为Single的构造函数被私有了,不能new对象,只能用它提供的方法来得到对象,所以用了它对外提供的方法来的到Single的对象咯。这样就是得到的一个单例后的对象。。。所以能使用Single里面的setNum和getNum方法。
作者: 暗夜星辰    时间: 2014-8-1 08:29
个人理解,希望对楼主有帮助!
首先Single和SingleDemo是两个类,而楼主的getInstance方法返回的是Single这个类,你用Single.getInstance()调用的返回值当然也是一个Single类了,怎么可以用SingleDemo这个类来接收返回值为Single类对象呢?
作者: zippo    时间: 2014-8-1 08:33
这是两个不同的类,又没有继承或者实现的关系,当然不可以。就好比如说,两个A,B不相关的人,不是父子,怎么会有关系呢。
作者: rolling-stone    时间: 2014-8-1 08:47
zippo 发表于 2014-8-1 08:33
这是两个不同的类,又没有继承或者实现的关系,当然不可以。就好比如说,两个A,B不相关的人,不是父子,怎 ...

我用SingleDemo创建一个对象,然后将用Single类创建的对象的内存地址赋给用SingleDemo创建的类,这样为什么不可以?大神,求解!
作者: zippo    时间: 2014-8-1 08:49
rolling-stone 发表于 2014-8-1 08:47
我用SingleDemo创建一个对象,然后将用Single类创建的对象的内存地址赋给用SingleDemo创建的类,这样为什 ...

抓住一点,变量一旦声明,只能存储同一类型的数据,不能指向不同类型的数据,很明晰那,这里的Demo和single不是同一类型的。
作者: rolling-stone    时间: 2014-8-1 08:50
zippo 发表于 2014-8-1 08:49
抓住一点,变量一旦声明,只能存储同一类型的数据,不能指向不同类型的数据,很明晰那,这里的Demo和sing ...

哦。好像渐渐了解了,谢了,大神!:victory:
作者: 200米王朝    时间: 2014-8-1 08:54
14. public static Single getInstance()
15.        {
16.                return s;
17.        }

第14-17行,这个getInstance()方法,返回值是single类型.
那么,Single.getInstance() 说的是对Single这个类调用getInstance()方法,这个方法返回值是Single类型,而不是SingleDemo类型。
作者: rolling-stone    时间: 2014-8-1 08:55
200米王朝 发表于 2014-8-1 08:54
14. public static Single getInstance()
15.        {
16.                return s;

好的,知道了,谢谢
作者: tianleboy    时间: 2014-8-1 09:01
lz,因为你创建的是single对象,你new的是single,所以前面是single定义。    你想创建那个对象,就用那个对象类来定义。但不能用一个类定义来创建另一个对象。   望LZ笑纳~
作者: liqi    时间: 2014-8-1 09:40
“为什么最下面的SingleDemo类中,不可以将SingleDemo类的对象实例化”
这句话本身就是个问题,你现在需要一个对象s1 是个引用类型数据,类型为Single,怎么能把它的类型 声明为SingleDemo,这个问题可比喻为:你需要  int类型数据5,你应该写为int i=5; 但你写成了 char i=5;
表面是单例设计模式看不懂,真正问题是你没有把类,对象还有构造函数概念弄明白
第一个类:对一些对象的描述,抽象,概括;
               包括三部分:第一部分 属性  
                                  第二部分 构造函数(如果类中没有写,那 么默认的是无参构造 ),用来实例化对象时   
                                               调用 即你的问题 new对象时调用,
                                               注意:  构造函数名和类名一致
                                   第三部分  普通函数   提供一些功能
实例化对象格式:  类   对象= new  构造函数()
因为构造函数名和类名一致,所以在没有多态的情况下 可以这样理解  类  对象 = new 类名()
有了多态  可能格式   类(或该类的父类)  对象=new  子类构造函数()
所以实例化时   等号前面的类名是构造函数所在的类 或 所在类的父类
      等号前的类 和 等号后的构造函数所在类 必须是有关系的,本类或父类
如果第一个类的构造函数 private Single(){}  没有私有化 即 public   Single(){}
那么实例化对象  Single s1 = new  Single();
但是现在私有化了 private,那么外部类不能访问,即SingleDemo类中没有权限访问构造函数,那么就不能实例化了,怎么办,只能在原类中实例化,但是原类中的对象也是私有的,不能访问,为了能取到对象,所以原类中写了个静态方法(这里涉及到了静态方法访问,静态方法不需要类的实例化就可以访问,格式为:类名.方法名()),这个静态方法返回值为s,类型为 Single,即 s1= Single.getInstance;这个s1是Single类型的
作者: liqi    时间: 2014-8-1 09:41
希望你能看明白
作者: 南柯一梦    时间: 2014-8-1 14:38
Single.getInstance;方法是返回Single对象,而SingleDemo类与Single类没关系,当然不可以用SingerDemo类型引用指向Singer对象了
作者: rolling-stone    时间: 2014-8-1 14:42
南柯一梦 发表于 2014-8-1 14:38
Single.getInstance;方法是返回Single对象,而SingleDemo类与Single类没关系,当然不可以用SingerDemo类型 ...

已经明白了,谢谢
作者: LFW    时间: 2014-8-1 16:15
SingleDemo s1 = Single.getInstance()的后边 Single.getInstance()意思是类名调用方法, Single.getInstance()的执行体是return s ,功能是返回一个对象。。。前边Single s1是跟int a 一样的意思,类型 名称(这个我突然不知道怎么描述了)。你SingleDemo s1 = Single.getInstance这算什么
作者: LFW    时间: 2014-8-1 16:20
具体的说是返回一个对象的内存地址值。你Single.getInstance的意思是什么? 类名.成员变量???调用了另一个类的静态变量?SingleDemo s1 = Single.getInstance>>>我觉得你是看多态了,然后混淆了概念,把那父类引用指向子类对象乱套了。。。。
作者: 如果有梦    时间: 2014-8-1 16:29
SingleDemo s1 = Single.getInstance 这怎么能行?
SingleDemo的引用怎么能够指向Single的类呢?又不是Single的父类!
作者: F@C    时间: 2014-8-1 17:17
进来学习




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2