黑马程序员技术交流社区

标题: 为什么会输出? [打印本页]

作者: 曾运    时间: 2011-12-29 14:54
标题: 为什么会输出?
本帖最后由 曾运 于 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 ,为什么?
        }
}

作者: 为梦而战    时间: 2011-12-29 15:11
本帖最后由 为梦而战 于 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
作者: 黄喆    时间: 2011-12-29 15:12
System.out.println(d.a)  调用 对象d的 a属性,当然是2了
作者: 刘健    时间: 2011-12-29 15:13
d是Demo的实例,d实例化的同时就是null,d.a调用的是Demo的a变量,a变量=3,所以输出2
作者: 房宝彬    时间: 2011-12-29 15:20
就是本类中还有一个隐式指针this指向你新创建的对象,
虽然你把null赋给d,在引用的时候this还隐式指向它,因为对象还在内存中
作者: yunqiangshan    时间: 2011-12-29 15:24
a是类变量,也就是静态成员变量,存放在方法区中,并且优先于对象d存在,d=null相当于把跟实例变量(存在于堆内存中)的关系切断了,但是跟方法区中的类变量依旧还有联系,所以可以调用
作者: 付星    时间: 2011-12-29 17:03
此类由系统加载器加载,a这个变量只是你运行的程序不终止,a里面的值是独立的一份,当你把对象的引用为空,它会寻找方法区里的静态变量值
作者: 颜宗茂    时间: 2011-12-29 21:30
静态常量并不依附于对象存在,可以通过类访问,所以即使是空的对象也可以访问该属性。




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