日期:2014-05-20  浏览次数:20906 次

一个小问题。
Java code

Animal an=new Cat();
an=new Dog();




Animal an=new Cat(); 在内存中开辟了一个栈。
那么 an=new Dog(); 是重新开的,还是覆盖的?

------解决方案--------------------
new Cat()会在堆中开辟一片内存,而栈中只是存放堆中的地址
new Dog()会在堆中再开辟一片内存,而栈中存放的地址会改变为后者
------解决方案--------------------
[color=#FF0000]
------解决方案--------------------
你本来的说法也不够确切,new Cat()是在堆内存开辟了一个 对象,然后 对象引用an有可能在堆栈当中,看an是不是局部变量了,an引用指向到刚刚开辟的对象
new Dog()也是在内存JVM堆当中开辟了一个新对象,然后an的引用指向新开辟对象
an=new Dog() 是重开了一个新对象,肯定不是覆盖,原来的new Cat()的对象 因为没有程序引用到,所以会被JVM的垃圾回收机制自动回收
------解决方案--------------------
Animal an=new Cat(); an 指向 NEW CAT()对象
an=new Dog(); an 指向 NEW DOG()对象;NEW CAT() 销毁~
指向问题应该没有重开 和覆盖