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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 安路凤 中级黑马   /  2012-5-7 21:15  /  2360 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 安路凤 于 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());
}
}

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
suiabing + 5 题目最好把毕老师去掉,容易让人误解.
贠(yun)靖 + 1 你这是写成内部类了- -!老师是写在外面滴.

查看全部评分

15 个回复

倒序浏览
哦 我说呢 茅塞顿开!!!!!!!!!!!!!谢谢斑竹咯
回复 使用道具 举报
瞎我一跳,居然说老毕错了{:soso_e120:}
回复 使用道具 举报
其实是我写错了!!正确的代码应该是这样子的 嘿嘿{: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()); }

}

回复 使用道具 举报
还错着呢!!{:soso_e109:}那个 class 前边的 static  应该去掉
回复 使用道具 举报
因为主函数是静态的,静态不能访问非静态,而你的 class Single在成员位置上,可以理解是一个成员变量
所以不加static会报错
回复 使用道具 举报
老毕应该没看见吧??
回复 使用道具 举报
金肖 发表于 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:30
如果说因为主函数是静态的,静态的不能访问非静态的那下面的程序怎么能顺利通过呢。对象直接访问了成员变 ...

因为num是私有的,你对外提供了公共的set() get()方法,
你是用的对象调用set方法对num进行赋值
楼主可以将重新在Single类和主函数外定义一个非静态的 int型的变量 a = 2; ,然后在主函数中打印a,编译会报
无法从静态上下文中引用非静态 变量 a
   System.out.println(a);
                             ^
回复 使用道具 举报
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()); }

}
回复 使用道具 举报
你这个标题够抢眼,还以为老毕错了呢
回复 使用道具 举报
我也以为老毕的写错了呢、这回老毕就不嗨皮了
回复 使用道具 举报
你让我们这些老毕的铁杆粉丝情何以堪{:soso_e113:}
回复 使用道具 举报
小凤,你连我老人家都吓了一跳呢!老毕可是俺的偶像呀!
回复 使用道具 举报
呵呵。。这东西还是忙严谨的。。出错很正常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马