您的位置:首页 > 编程语言 > C语言/C++

《Java编程思想》之对象的创建、使用、生命期(简单比较java与C++的不同之处)

2012-01-11 21:17 706 查看

这个寒假有不少书要看呀。。今天开始拜读起《java编程思想》。写写博客记录读书点滴的同时激励自己继续努力!

第一章、对象导论

这一章是对面向程序设计的一个综述,介绍了接口与实现、抽象与封装、消息与函数。继承与数组,以及多态等等。

以下内容摘自《Java编程思想》第三版:

对象最重要的要素之一便是它们生成和销毁。对象数据位于何处?怎么控制对象的生成周期?对此存在着不同的处理哲学。

C++认为效率控制最重要的议题,所以给程序员提供了选择的权力。为了追求更大的执行效率,对象的存储空间和生命周期可以在编写程序时确定。这可以通过对象置于栈堆(它们有时被称为自动变量(automatic varibale)或限域变量(scopedvaribale))或者静态存储区域内来实现。这种方式将存储空间分配和释放置于优先考虑的位置,某些情况下这样控制非常有价值,但是,也牺牲掉了灵活性,因为你必须在编写程序时知道对象确切的数量、生命周期和类型。如果你试图解决更一般化的问题,例如计算机辅助设计、仓库管理或者是空中交通控制,这种方式都显得过于受限了。

第二种方式是在被称为堆(heap)内存池中动态地创建对象。在这种方式中,你直到运行时刻才知道需要多少对象?它们的生命周期如何?以及它们的具体类型是什么?这些问题的答案只能在程序运行时相关代码被执行到的那一刻才能确定。如果你需要一个新对象,你可以在你需要的时刻直接在堆中创建。因为存储空间是在运行时刻被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间。(在堆栈中创建存储空间通常只需要一条将栈顶指针向下移动的汇编指令,另一条汇编指令对应释放存储空间所需的将栈顶指针向上移动。创建堆存储空间的时间以来于存储机制的设计)。动态方式有这样一个一般性的逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。动态方式所带来的更大的灵活性正是解决一般化编程问题的要点所在。

Java完全采用了第二种方式(但是基本类型是一个特例)。每当你想要创建新对象时,就要使用new关键字来构建此对象的动态实例。

还有另一个议题,就是对象生命周期。对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间有多久,并可以自动销毁它。然而,如果你在堆上创建对象,编译器就会对它的生命周期一无所知。在像C++这类的语言中,你必须通过编程方式来确定何时销毁对象,这可能会因为你不能正确处理而导致内存泄漏(这在C++程序中是常见的问题)。Java提供了被称为“垃圾回收器(garbagecollector)”的机制,它可以自动发现对象何时不再被使用,并继而销毁它。垃圾回收器非常有用,因为它减少了你必须考虑的议题和你必须编写的代码。更重要的是,垃圾回收器提供了更高层的保障,可以避免暗藏的内存泄漏问题(这个问题已经使许多C++项目折戟沉沙)。

小结:

1、java采用堆动态创建对象(基本类型除外)。

缺点:在堆中分配存储空间花费大量的时间。

优点:具有更大的灵活性。如在编写程序时不需要知道对象确切的数量、生命周期和类型。

2、C++把对象放置于堆栈和静态存储区域

缺点:牺牲了灵活性。

优点:对象的存储空间和生命周期可以在编写程序时确定,带来更快的执行速度。

3、对象的销毁(堆上创建对象时)

(1)java:通过“垃圾回收器”。

缺点:降低了执行速度。(这点正确吗?)

(2)C++:必须通过编程方式确定何时销毁对象。

缺点:不能正确处理时会导致内存泄露。

4.[b]new操作是在堆上的[/b]

[b]这点java和C++是相同的。[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐