黑马程序员技术交流社区
标题:
为什么会输出?
[打印本页]
作者:
曾运
时间:
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