黑马程序员技术交流社区

标题: 单例设计模式的一个小问题 [打印本页]

作者: 张宁    时间: 2013-3-9 10:51
标题: 单例设计模式的一个小问题
  1. class Single{
  2. private Single(){}
  3. private static Single s = new Single();
  4. pirvate static int age;
  5. public void setAge(int age){
  6.     this .age = age;
  7. }
  8. public int ageAge(){
  9.   retrun age;
  10. }
  11. public static Single getInstance(){
  12.    return s;
  13. }
  14. }
  15. class SingleDemo{
  16.    main...省略
  17.    Single ss = Single.getInstance();
  18.    ss.setAge(10);
  19.    s.o.p(ss.getAge);
  20. }
复制代码
这个单例模式中,设置了两个非静态方法,就是setAge 和 getAge,如果我把single这个类中的所有变量和方法都改成静态的,就会提示无法从静态上下文中引用非晶态方法,为什么呢?  是不是说这个类不可以建立对象,所以栈内存中只能有 是这一个对象,对象又不能调用static 方法,所以说class 类里边的除了 getInstance()这个方法外,其他的方法都不能是static的? 这个代码的内存图谁能帮我划一下??


作者: 黑马朱超    时间: 2013-3-9 12:53
首先对象时建立在堆内存中的
其次 你把single中都变静态了,类也可以建立对象啊,但是对象的属性没法调用
作者: 王军行    时间: 2013-3-9 13:32
本帖最后由 王军行 于 2013-3-9 14:03 编辑

因为静态随着类的加载而加载。这时还没有对象题中你的setAge方法中引入了this ,this是对象  。对象还没有无法访问 。所以出现了这种情况,其他的你静态没有问题
对象不能调用static方法是怎么一说,static方法可以直接被类名调用,没有说不能被对象调用吧。

无标题.jpg (48.85 KB, 下载次数: 31)

无标题.jpg

作者: Walking Walking    时间: 2013-3-9 16:41
静态方法的调用时通过类名Single直接访问的,不需要实力化,方法中的this在静态方法中就不能使用,但是可以通过Single.age 访问静态的属性。
这样写是允许的
class Single{
         
         
         private static Single s = new Single();
         
         private static int age;
         
         public static void setAge(int age){
         
                 Single.age = age;
         
        }
         
        public static int ageAge(){
         
         return age;
         
        }
         
        public static Single getInstance(){
         
                return s;

        }
}




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