Java对象的生命周期和基本类型有所不同。当你使用new创建一个对象时,该对象在其作用域结束后会依然存在。因此,如果你编写如下代码:
虽然引用s会在作用域结束后消失,但是它指向的String对象还会继续占用内存。对于上面的代码而言,该String对象在作用域结束后就无法再获取,这是因为已经超出了其唯一引用的作用域范围。在后续章节中,你将看到如何在程序中传递和复制对象的引用。
如果需要的话,通过new创建的对象会存在足够长的时间,因此C++编程中出现的一系列问题在Java中就消失了。在编写C++代码时,你不仅要确保对象在需要的时候随时可用,而且事后还要负责销毁这些对象。
等等,还有个问题。如果Java对这些对象不闻不问,为什么应用程序并没有因为内存溢出而强行结束呢?而这一点也正是C++存在的问题。原因就在于,Java使用了一点魔法,即垃圾收集器会监视所有通过new创建的对象,并及时发现哪些对象不再被引用,然后它会释放这些对象所占用的内存,使得这些内存可以用于其他新对象。这意味着你无须关注何时需要释放内存,你要做的只是创建对象而已,如果你不再需要这些对象,就任由它们去吧(垃圾收集器会处理它们)。这种机制解决了一类非常严重的编程问题:由于程序员忘记释放内存而导致的“内存泄漏”(memory leak)。