A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© rolling-stone 中级黑马   /  2014-8-1 01:24  /  2661 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是一个简单的传入数值的单利设计模式的应用.
  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;
谢谢!

19 个回复

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

我用SingleDemo创建一个对象,然后将用Single类创建的对象的内存地址赋给用SingleDemo创建的类,这样为什么不可以?大神,求解!
回复 使用道具 举报
rolling-stone 发表于 2014-8-1 08:47
我用SingleDemo创建一个对象,然后将用Single类创建的对象的内存地址赋给用SingleDemo创建的类,这样为什 ...

抓住一点,变量一旦声明,只能存储同一类型的数据,不能指向不同类型的数据,很明晰那,这里的Demo和single不是同一类型的。
回复 使用道具 举报
zippo 发表于 2014-8-1 08:49
抓住一点,变量一旦声明,只能存储同一类型的数据,不能指向不同类型的数据,很明晰那,这里的Demo和sing ...

哦。好像渐渐了解了,谢了,大神!:victory:
回复 使用道具 举报
14. public static Single getInstance()
15.        {
16.                return s;
17.        }

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

好的,知道了,谢谢
回复 使用道具 举报
lz,因为你创建的是single对象,你new的是single,所以前面是single定义。    你想创建那个对象,就用那个对象类来定义。但不能用一个类定义来创建另一个对象。   望LZ笑纳~
回复 使用道具 举报
“为什么最下面的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类型的
回复 使用道具 举报
希望你能看明白
回复 使用道具 举报
Single.getInstance;方法是返回Single对象,而SingleDemo类与Single类没关系,当然不可以用SingerDemo类型引用指向Singer对象了
回复 使用道具 举报
南柯一梦 发表于 2014-8-1 14:38
Single.getInstance;方法是返回Single对象,而SingleDemo类与Single类没关系,当然不可以用SingerDemo类型 ...

已经明白了,谢谢
回复 使用道具 举报
LFW 中级黑马 2014-8-1 16:15:48
17#
SingleDemo s1 = Single.getInstance()的后边 Single.getInstance()意思是类名调用方法, Single.getInstance()的执行体是return s ,功能是返回一个对象。。。前边Single s1是跟int a 一样的意思,类型 名称(这个我突然不知道怎么描述了)。你SingleDemo s1 = Single.getInstance这算什么
回复 使用道具 举报
LFW 中级黑马 2014-8-1 16:20:12
18#
具体的说是返回一个对象的内存地址值。你Single.getInstance的意思是什么? 类名.成员变量???调用了另一个类的静态变量?SingleDemo s1 = Single.getInstance>>>我觉得你是看多态了,然后混淆了概念,把那父类引用指向子类对象乱套了。。。。
回复 使用道具 举报
SingleDemo s1 = Single.getInstance 这怎么能行?
SingleDemo的引用怎么能够指向Single的类呢?又不是Single的父类!
回复 使用道具 举报
F@C 来自手机 中级黑马 2014-8-1 17:17:38
20#
进来学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马