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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

曾运

黑马帝

  • 黑马币:0

  • 帖子:55

  • 精华:0

© 曾运 黑马帝   /  2011-12-29 14:54  /  1846 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曾运 于 2011-12-29 17:20 编辑

class Demo
{   
        public static int a=2;
        public static void main(String[] args)
        {   
                Demo d=new Demo();
                d=null;
                System.out.println(d.a);//输出 2 ,为什么?
        }
}

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 为梦而战 于 2011-12-29 15:14 编辑

你把成员变量做成Static了,Demo类一加载这个a的值就被初始化成2了,而且直到Demo类结束才被释放。
为什么d指向了null,还能输出a的值,那是因为本类中还有一个隐式指针this指向你新创建的对象,
虽然d指向null但是对象还在内存中,this还隐式指向它,所以是this指向对象后输出对象的成员变量a的值2。
也就是相当于System.out.println(this.a);
这时d.a和a及this.a是一样的。都可以输出2

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
黄喆 黑马帝 2011-12-29 15:12:32
藤椅
System.out.println(d.a)  调用 对象d的 a属性,当然是2了
回复 使用道具 举报
刘健 黑马帝 2011-12-29 15:13:55
板凳
d是Demo的实例,d实例化的同时就是null,d.a调用的是Demo的a变量,a变量=3,所以输出2
回复 使用道具 举报
就是本类中还有一个隐式指针this指向你新创建的对象,
虽然你把null赋给d,在引用的时候this还隐式指向它,因为对象还在内存中

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
a是类变量,也就是静态成员变量,存放在方法区中,并且优先于对象d存在,d=null相当于把跟实例变量(存在于堆内存中)的关系切断了,但是跟方法区中的类变量依旧还有联系,所以可以调用

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
付星 黑马帝 2011-12-29 17:03:21
7#
此类由系统加载器加载,a这个变量只是你运行的程序不终止,a里面的值是独立的一份,当你把对象的引用为空,它会寻找方法区里的静态变量值
回复 使用道具 举报
颜宗茂 黑马帝 2011-12-29 21:30:40
8#
静态常量并不依附于对象存在,可以通过类访问,所以即使是空的对象也可以访问该属性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马