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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张宁 中级黑马   /  2013-3-9 10:51  /  1590 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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的? 这个代码的内存图谁能帮我划一下??

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
首先对象时建立在堆内存中的
其次 你把single中都变静态了,类也可以建立对象啊,但是对象的属性没法调用

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 王军行 于 2013-3-9 14:03 编辑

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

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

无标题.jpg
回复 使用道具 举报
静态方法的调用时通过类名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;

        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马