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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java.exe 中级黑马   /  2013-5-15 17:31  /  1200 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看到教学视频的单利设计模式部分,对类中有一个成员是本类对象非常疑惑
如果我们定义如下一个类:

class Demo
{
   private Demo d=new Demo();
}

class DemoRun
{
   public static void main(String[] args)
  {
    Demo dd=new Demo();
  }
}

如果运行DemoRun 的话就会出现无限循环创建对象的情况发生,从而导致内存的溢出。

单例设计模式:
class Single
{
   private Single(){}
   private static Single s=new Single();
   private static Single getInstance()
        {
           return s;
        }
   
}
class SingleRun
{
  public static void main(String[] args)
  {
      Single ss=Single.getInstance();
  }
}
在单利设计模式中,本类的对象 d 被static修饰后,当程序执行 Single.getInstance()方法时,加载Single.class类文件,并完成对类的初始化,因为静态成员是被所有对象所共享的,所以产生的本类对象d就不会再去循环的创建对象了。各位大神,我这样理解对吗?如果不对,请赐教!

11 个回复

倒序浏览
class Demo
{
   private Demo d=new Demo();
}

class DemoRun
{
   public static void main(String[] args)
  {
    Demo dd=new Demo();
  }
}
这个DemoRun类里根本没有方法,你下面所谓的运行怎么运行啊?你应该在DemoRun里定义一个获得new Demo();的方法才对。单例设计模式中,就提供了这样的方法。

回复 使用道具 举报
class Single
{
   private Single(){}//构造方法被私有后 别的类就不能初始化Single了
   private static Single s=new Single();// private static 这个类中有一个他自己无参对象
   private static Single getInstance()//因为外边的类无法实例话对象,在类中提供了一个
        {
           return s;//因为 Single s=new Single(); 被static修饰了,无论调用多少次这个方法,他们共同操作的是同一个对象
        }
   
}
class SingleRun
{
  public static void main(String[] args)
  {
      Single ss=Single.getInstance();
  }
}

这是我的理解,希望能对你有帮助,有不正确的地方希望指点一下。谢谢。。
回复 使用道具 举报
上面那串代码主要问题是你把Demo d =new Demo()私有了。外部类就没法调用了。你得提供一个方法以供外部类调用。
以下就是你写的单例设计模式中提供的外部类调用Demo类创建的对象的方法。   因为私有了,所以只能供外部调用已创建的对象不能供外部创建对象。
private Single(){}
   private static Single s=new Single();
   private static Single getInstance()
        {
           return s;
        }
回复 使用道具 举报
韩秀山 发表于 2013-5-15 17:46
class Single
{
   private Single(){}//构造方法被私有后 别的类就不能初始化Single了

和我理解一样。这就是单例设计模式保证对象唯一的方法。
回复 使用道具 举报
王靖远 发表于 2013-5-15 17:57
和我理解一样。这就是单例设计模式保证对象唯一的方法。

嗯,谢谢。。
回复 使用道具 举报
韩秀山 发表于 2013-5-15 18:00
嗯,谢谢。。

  private static Single getInstance()这句应该错了
他把这个提供的调用方法私有了。那人家还怎么调用?
我觉得这里应该是public static Single getInstance()
其他理解上基本正确
回复 使用道具 举报
王靖远 发表于 2013-5-15 18:04
private static Single getInstance()这句应该错了
他把这个提供的调用方法私有了。那人家还怎么调用? ...

嗯,是我忽略了。呵呵!太感谢了!!!:loveliness:
回复 使用道具 举报
王靖远 发表于 2013-5-15 18:04
private static Single getInstance()这句应该错了
他把这个提供的调用方法私有了。那人家还怎么调用? ...

非常感谢哈,我再想想,理一下
回复 使用道具 举报
韩秀山 发表于 2013-5-15 18:11
嗯,是我忽略了。呵呵!太感谢了!!!

感谢你们哈
回复 使用道具 举报
韩秀山 发表于 2013-5-15 17:46
class Single
{
   private Single(){}//构造方法被私有后 别的类就不能初始化Single了

class Demo
{
   private Demo d=new Demo();
}

class DemoRun
{
   public static void main(String[] args)
  {
       Demo dd=new Demo();
  }
}

如果你有空的话把上面的代码,敲下来运行一下,为什么结果是那样的,是不是因为在循环创建对象啊?谢谢
回复 使用道具 举报
java.exe 发表于 2013-5-15 21:32
class Demo
{
   private Demo d=new Demo();

嗯  谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马