黑马程序员技术交流社区

标题: 单例模式的一个小错误(已解决) [打印本页]

作者: 安路凤    时间: 2012-5-7 21:15
标题: 单例模式的一个小错误(已解决)
本帖最后由 安路凤 于 2012-5-14 21:01 编辑

今天看单例模式的视频时,发现一个错误,毕老师的代码是这样子的
我再eclipse里运行的时候出错了,按照错误指示我在 class Single 前面加上了静态static
这样代码就可以正常运行了
但是究其原因我确实不知道,{:soso_e101:}
各位一起来看看咯{:soso_e154:}
public class SingleDemo {
  class Single
{
  private int num;
  private Single()                       //第一步构造函数私有化
  { }
  private static Single s=new Single();  //第二步自定义一个对象s
  public static Single getInstance()     //第三步提供方法可获取到该对象
  {
   return s;
  }
  public int getNum() {
   return num;
  }
  public void setNum(int num) {
   this.num = num;
  }
  
}
public static void main(String[] args) {
  Single s1=new Single();
  s1.setNum(20);
  System.out.println(s1.getNum());
}
}


作者: 安路凤    时间: 2012-5-7 21:22
哦 我说呢 茅塞顿开!!!!!!!!!!!!!谢谢斑竹咯
作者: 黄或俊    时间: 2012-5-7 21:24
瞎我一跳,居然说老毕错了{:soso_e120:}
作者: 安路凤    时间: 2012-5-7 21:28
其实是我写错了!!正确的代码应该是这样子的 嘿嘿{:soso_e106:}
唉!!这回丢人丢大发啦
static class Single
{
  private int num;
  private Single()                       //第一步构造函数私有化
  { }
  private static Single s=new Single();  //第二步自定义一个对象s
  public static Single getInstance()     //第三步提供方法可获取到该对象
  {
   return s;
  }
  public int getNum() {
   return num;
  }
  public void setNum(int num) {
   this.num = num;
  }
  
}


  public class SingleDemo {
   public static void main(String[] args) {
  Single s1=Single.getInstance();
  Single s2=Single.getInstance();
  s1.setNum(20);
  System.out.println(s2.getNum()); }

}


作者: 安路凤    时间: 2012-5-7 21:29
还错着呢!!{:soso_e109:}那个 class 前边的 static  应该去掉
作者: 金肖    时间: 2012-5-7 21:41
因为主函数是静态的,静态不能访问非静态,而你的 class Single在成员位置上,可以理解是一个成员变量
所以不加static会报错
作者: 马浩    时间: 2012-5-7 21:55
老毕应该没看见吧??
作者: 黑马等我!    时间: 2012-5-7 22:30
金肖 发表于 2012-5-7 21:41
因为主函数是静态的,静态不能访问非静态,而你的 class Single在成员位置上,可以理解是一个成员变量
所以 ...

如果说因为主函数是静态的,静态的不能访问非静态的那下面的程序怎么能顺利通过呢。对象直接访问了成员变量num.
class Single
{
  private int num;
  private Single()                       //第一步构造函数私有化
  { }
  private static Single s=new Single();  //第二步自定义一个对象s
  public static Single getInstance()     //第三步提供方法可获取到该对象
  {
   return s;
  }
  public int getNum() {
   return num;
  }
  public void setNum(int num) {
   this.num = num;
  }
  
}
public static void main(String[] args) {
  Single s1=new Single();
  s1.setNum(20);
  System.out.println(s1.getNum());
}}

作者: 黑马-王建雨    时间: 2012-5-7 22:58
敢于怀疑的精神还是好的。
作者: 金肖    时间: 2012-5-7 23:14
黑马等我! 发表于 2012-5-7 22:30
如果说因为主函数是静态的,静态的不能访问非静态的那下面的程序怎么能顺利通过呢。对象直接访问了成员变 ...

因为num是私有的,你对外提供了公共的set() get()方法,
你是用的对象调用set方法对num进行赋值
楼主可以将重新在Single类和主函数外定义一个非静态的 int型的变量 a = 2; ,然后在主函数中打印a,编译会报
无法从静态上下文中引用非静态 变量 a
   System.out.println(a);
                             ^
作者: 黄燕京    时间: 2012-5-7 23:51
class Single
{
  private int num;
  private Single()                       //第一步构造函数私有化
  { }
  private static Single s=new Single();  //第二步自定义一个对象s
  public static Single getInstance()     //第三步提供方法可获取到该对象
  {
   return s;
  }
  public int getNum() {
   return num;
  }
  public void setNum(int num) {
   this.num = num;
  }
  
}


  public class SingleDemo {
   public static void main(String[] args) {
  Single s1=Single.getInstance();
  Single s2=Single.getInstance();
  s1.setNum(20);
  System.out.println(s2.getNum()); }

}

作者: suiabing    时间: 2012-5-7 23:58
你这个标题够抢眼,还以为老毕错了呢
作者: 邱俊杰    时间: 2012-5-8 00:35
我也以为老毕的写错了呢、这回老毕就不嗨皮了
作者: 赵玮_Tom    时间: 2012-5-8 07:49
你让我们这些老毕的铁杆粉丝情何以堪{:soso_e113:}
作者: 胡元    时间: 2012-5-8 10:17
小凤,你连我老人家都吓了一跳呢!老毕可是俺的偶像呀!
作者: 邓斌    时间: 2012-5-8 10:31
呵呵。。这东西还是忙严谨的。。出错很正常。




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