黑马程序员技术交流社区
标题: 静态,非静态调用问题。 [打印本页]
作者: Mr.__ㄨīn 时间: 2014-3-24 09:59
标题: 静态,非静态调用问题。
本帖最后由 Mr.__ㄨīn 于 2014-3-25 13:02 编辑
- class Single
- {
- private int num;
- public void setNum(int num)
- {
- this.num = num;
- }
- public int getNum()
- {
- return num;
- }
- private Single(){}
- private static Single s = new Single();
- public static Single getInstance()
- {
- return s;
- }
- }
- class SingleDemo
- {
- public static void main(String[] args)
- {
- Single s1 = Single.getInstance();
- Single s2 = Single.getInstance();
- s1.setNum(23);
- System.out.println(s2.getNum());
- }
- }
复制代码
在讲单例设计模式时 ,Single s1 = Single.getInstance(); 之后,静态怎么可以调用非静态方法setNum()?
作者: tcny 时间: 2014-3-24 10:12
在这里是静态代码块中不能调用非静态方法, 原因是静态内容先进入内存,这时非静态方法还不存在。
- private static Single s = new Single();
- public static Single getInstance()
- {
- return s;
- }
复制代码
而代码中只有这两个标有静态,根本没有非静态的内容。至于你说的调用s1.setNum(23)时,对象已经都创建完了Single s1 = Single.getInstance();,所以内存中已经有s1的完整对象了,当然可以调用任何方法。
作者: 银酱 时间: 2014-3-24 11:24
这是用创建后的对象调用的静态方法,可以的。
作者: 黄陂酷歌 时间: 2014-3-24 12:52
楼主不要逻辑混乱,静态方法不能调用非静态数据,但是你的代码不是静态方法在调用非静态数据,而是你建立了一个对象,这个对象在调用对象中的方法setNum()这个方法是非静态的自然可以调用非静态数据了
作者: 李东梁 时间: 2014-3-24 12:57
本帖最后由 李东梁 于 2014-3-24 12:59 编辑
Single s1 = Single.getInstance();
是实例化了一个Single 对象s1,s1调用自己类里面的东西有什么问题呢?
作者: muma 时间: 2014-3-24 13:02
当调用s1.setNum(23)时,已经都创建完了Single s1 = Single.getInstance();,所以内存中已经有s1的完整对象了,当然可以调用任何方法。
作者: Mr.__ㄨīn 时间: 2014-3-25 12:42
噢,谢谢了。明白了。
作者: Mr.__ㄨīn 时间: 2014-3-25 12:46
嗯,明白了,谢谢。
作者: Mr.__ㄨīn 时间: 2014-3-25 12:47
之前确实有点混淆了。现在明白了,谢谢。
作者: Mr.__ㄨīn 时间: 2014-3-25 12:49
嗯,知道了。谢谢
作者: Mr.__ㄨīn 时间: 2014-3-25 12:50
明白了 。谢谢
作者: 追逐 时间: 2014-3-25 13:19
- class Single
- {
- private int num;
- public void setNum(int num)
- {
- this.num = num;
- }
- public int getNum()
- {
- return num;
- }
- private Single(){}
- private static Single s = new Single();
- public static Single getInstance()
- {
- return s;
- }
- }
- class SingleDemo
- {
- public static void main(String[] args)
- {
- Single s1 = Single.getInstance();
- Single s2 = Single.getInstance();
- /*
- 这里是对象去调用类的函数。
- 你要理解Single s1是在创建一个本类对象。
- 而Single.getInstance();是通过类名去调用本类中的一个可以返回本类对象的静态函数。
- 而把这个反出来的对象赋值给s1.这样就相当于建立了一个Single类的对象
- 因为s1是Single类的对象了
- 所以通过被本类对象去调用一个本类中的非静态函数是可以的。
- 要知道对象是不能调用类中的静态方法的。因为静态的函数或者变量都是优先于对象存在的
- 是随着类的加载而加载进内存中的。静态的变量和函数都存在于常量池中。
- 所以可以被类名.去调用。你也可以理解为静态存在的时候。对象还没出生呢?
- 单例设计模式只是不能让别的类随意的建立对象。
- 而并不是不能建立对象。单例设计模式定义对象的格式是
- 类名 变量名 = 类名.可以返回对象的静态函数;
- 就像你写的Single s1 = Single.getInstance();
- 其实就是在定义单例类中的对象
- */
- s1.setNum(23);
- System.out.println(s2.getNum());
- }
- }
复制代码
作者: 小斥候 时间: 2014-3-25 13:23
在类的内部定义的是不能访问非静态;既然已经得到了实例对象了,那不就可以调用实例方法了吗
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |