think in java 中一句话的疑问

http://www.yq1012.com/Thinkin...

第二章 一切都是对象

2.3.2 对象的作用域

Java对象不具备与主类型一样的存在时间。用new关键字创建一个Java对象的时候,它会超出作用域的范围之外。所以假若使用下面这段代码:

{ String s = new String("a string"); } /* 作用域的终点 */

那么句柄s会在作用域的终点处消失。然而,s指向的String对象依然占据着内存空间。在上面这段代码里,我们没有办法访问对象,因为指向它的唯一一个句柄已超出了作用域的边界。在后面的章节里,大家还会继续学习如何在程序运行期间传递和复制对象句柄。

这样造成的结果便是:对于用new创建的对象,只要我们愿意,它们就会一直保留下去。

这个编程问题在C和C++里特别突出。

// 这是什么描述方式?翻译问题还是我的问题? // 这个冒号看不懂 // 什么是不能从语言获得任何帮助

看来在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,

// 这又是什么意思?什么叫无法确定时候可用? // 跨作用域传递不是使用 move or new 传给指针?
所以在需要对象的时候,根本无法确定它们是否可用。

// ???不需要可不就释放喽 // 需要对象继续存在不释放不就行了?转移数据/接管数据
而且更麻烦的是,在C++里,一旦工作完成,必须保证将对象清除。

这样便带来了一个有趣的问题。假如Java让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程序的“凝固”呢。

// 什么问题导致的头痛呢?我没看明白上面一句话 在C++里,这个问题最令程序员头痛。

但Java以后,情况却发生了改观。Java有一个特别的“垃圾收集器”,它会查找用new创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。这意味着我们根本不必操心内存的回收问题。只需简单地创建对象,一旦不再需要它们,它们就会自动离去。

这样做可防止在C++里很常见的一个编程问题:由于程序员忘记释放内存造成的“内存溢出”。

阅读 2.2k
2 个回答

1看来在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,
意思是语言本身不能帮助你解决对象是否一直存在的问题
2所以在需要对象的时候,根本无法确定它们是否可用。
这是接着前边讲的,在C++里,一个类指针有可能是已经被delete过,无法确定它们是否可用。
3在C++里,这个问题最令程序员头痛。
也是接着前边说的,,前边讲,Java让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程序的“凝固”呢。
在C++里边如果让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程序的“凝固”,是最令程序员头疼的(因为C++语言不能自动回收,可能有的老对象不需要了,但是人工辨别出来手动回收内存比较困难,可能早就忘了,从而引出JAVA可以自动回收对象,非常方便)

翻译地有点迷…
意思就是java有垃圾回收,不用(也不能)手动回收对象。cpp没有,需要手动回收对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题