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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mr.__ㄨīn 中级黑马   /  2014-3-24 09:59  /  1443 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Mr.__ㄨīn 于 2014-3-25 13:02 编辑
  1. class Single
  2. {
  3.         private int num;
  4.         public void setNum(int num)
  5.         {
  6.                 this.num = num;
  7.         }
  8.         public int getNum()
  9.         {
  10.                 return num;
  11.         }

  12.         private  Single(){}

  13.         private static Single s = new Single();

  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(23);

  26.                 System.out.println(s2.getNum());
  27.         }
  28. }
复制代码

在讲单例设计模式时 ,Single s1 = Single.getInstance();  之后,静态怎么可以调用非静态方法setNum()?

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

12 个回复

倒序浏览
在这里是静态代码块中不能调用非静态方法, 原因是静态内容先进入内存,这时非静态方法还不存在。
  1. private static Single s = new Single();      
  2. public static  Single getInstance()
  3. {
  4.                 return s;
  5. }
复制代码

而代码中只有这两个标有静态,根本没有非静态的内容。至于你说的调用s1.setNum(23)时,对象已经都创建完了Single s1 = Single.getInstance();,所以内存中已经有s1的完整对象了,当然可以调用任何方法。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
这是用创建后的对象调用的静态方法,可以的。
回复 使用道具 举报
楼主不要逻辑混乱,静态方法不能调用非静态数据,但是你的代码不是静态方法在调用非静态数据,而是你建立了一个对象,这个对象在调用对象中的方法setNum()这个方法是非静态的自然可以调用非静态数据了
回复 使用道具 举报
本帖最后由 李东梁 于 2014-3-24 12:59 编辑



Single s1 = Single.getInstance();
是实例化了一个Single 对象s1,s1调用自己类里面的东西有什么问题呢?







回复 使用道具 举报
当调用s1.setNum(23)时,已经都创建完了Single s1 = Single.getInstance();,所以内存中已经有s1的完整对象了,当然可以调用任何方法。
回复 使用道具 举报
tcny 发表于 2014-3-24 10:12
在这里是静态代码块中不能调用非静态方法, 原因是静态内容先进入内存,这时非静态方法还不存在。

而代码 ...

噢,谢谢了。明白了。
回复 使用道具 举报
银酱 发表于 2014-3-24 11:24
这是用创建后的对象调用的静态方法,可以的。

嗯,明白了,谢谢。
回复 使用道具 举报
黄陂酷歌 发表于 2014-3-24 12:52
楼主不要逻辑混乱,静态方法不能调用非静态数据,但是你的代码不是静态方法在调用非静态数据,而是你建立了 ...

之前确实有点混淆了。现在明白了,谢谢。
回复 使用道具 举报
muma 发表于 2014-3-24 13:02
当调用s1.setNum(23)时,已经都创建完了Single s1 = Single.getInstance();,所以内存中已经有s1的完整对象 ...

嗯,知道了。谢谢
回复 使用道具 举报
李东梁 发表于 2014-3-24 12:57
Single s1 = Single.getInstance();
是实例化了一个Single 对象s1,s1调用自己类里面的东西有什么问题呢 ...

明白了 。谢谢
回复 使用道具 举报
  1. class Single
  2. {
  3.         private int num;
  4.         public void setNum(int num)
  5.         {
  6.                 this.num = num;
  7.         }
  8.         public int getNum()
  9.         {
  10.                 return num;
  11.         }

  12.         private  Single(){}

  13.         private static Single s = new Single();

  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.                                 /*
  26.                                 这里是对象去调用类的函数。
  27.                                 你要理解Single s1是在创建一个本类对象。
  28.                                 而Single.getInstance();是通过类名去调用本类中的一个可以返回本类对象的静态函数。
  29.                                 而把这个反出来的对象赋值给s1.这样就相当于建立了一个Single类的对象
  30.                                 因为s1是Single类的对象了
  31.                                 所以通过被本类对象去调用一个本类中的非静态函数是可以的。
  32.                                 要知道对象是不能调用类中的静态方法的。因为静态的函数或者变量都是优先于对象存在的
  33.                                 是随着类的加载而加载进内存中的。静态的变量和函数都存在于常量池中。
  34.                                 所以可以被类名.去调用。你也可以理解为静态存在的时候。对象还没出生呢?
  35.                                 单例设计模式只是不能让别的类随意的建立对象。
  36.                                 而并不是不能建立对象。单例设计模式定义对象的格式是
  37.                                 类名  变量名 = 类名.可以返回对象的静态函数;
  38.                                 就像你写的Single s1 = Single.getInstance();
  39.                                 其实就是在定义单例类中的对象
  40.                                 */
  41.                 s1.setNum(23);
  42.                 System.out.println(s2.getNum());
  43.         }
  44. }
复制代码


回复 使用道具 举报
在类的内部定义的是不能访问非静态;既然已经得到了实例对象了,那不就可以调用实例方法了吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马