黑马程序员技术交流社区

标题: 怎么解释这个,班里五六个人没法解释.求画图 [打印本页]

作者: HM黑马    时间: 2015-7-2 23:05
标题: 怎么解释这个,班里五六个人没法解释.求画图
class A
{
        static String name;
        static int age;

        public static void show()
        {
                System.out.println(name+age);
        }
}

class JingTaiTest
{
        public static void main(String[] args)
        {
                A a = new A();
                a.name = "刘德华";
                a.age = 18;
                a.show();

                System.out.println("+++++++++++++++");

                a = null;
                a.show();
        }
}
作者: HM黑马    时间: 2015-7-2 23:07
a = null;
a.show();
为什么还可以打印?
作者: very爱    时间: 2015-7-2 23:31
感觉应该是A类中的成员变量与方法都是静态的,只要类创建,这些静态的就创建,而且他们存储在内存的方法区中,new A();是在堆内存中开辟空间,a指向这个内存地址,a=null,只是赋予空地址,而类A中的静态变量与方法还是存在的,所以还能打印。

不知道解释的对不对!
作者: HM黑马    时间: 2015-7-2 23:35
那你a都没有指向了,怎么去获取的方法中的name和age?
作者: fmi110    时间: 2015-7-2 23:55
没想通 等楼下解决
作者: shuaiqi_P_D    时间: 2015-7-2 23:55
因为类名.就是静态属性跟方法的引用,不需要对象都可以用,等不等于null   没影响
作者: 冷雨敲窗被未温    时间: 2015-7-3 00:09
被静态修饰的成员变量被该类所有对象共享,该成员变量随着类的加载而加载,优先于对象存在。读懂这三句话你就知道为什么是那样的结果了。
作者: 双栖动物    时间: 2015-7-3 00:31
a虽然不再指向堆内存了 但a还是一个A 所以这个调用还是有效的
作者: fmi110    时间: 2015-7-3 08:47
学习了 顶顶
作者: yky1678    时间: 2015-7-3 09:00
静态成员是随着类的加载而加载的,它们放在了方法区中。当当创建对象a时,你用这个对象调用了成员,所以静态成员name、age、show都被加载进了栈中,和栈中的a放在了一起。
当a的值为null了,所以它没有指向对象了,但是因为栈中还保存的有name、age和show呀,所以当然能够调用了。




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