面向对象语言的五个基本特性:
1.万物皆对象
2.程序是对象的集合,它们通过发送消息来告知彼此所要做的。
3.每个对象都有自己的由其他对象所构成的存储。
4.每个对象都拥有其类型。
5.某一特定类型的所有对象都可以接收同样的消息。
每个对象都提供服务
对容器有所选择有两个原因:
1.不同容器提供了不同类型的接口和外部行为。堆栈相比队列就具备不同的接口行为,也不同于集合和列表的接口和行为。它们之中的某种容器提供的解决方案可能比其他容器要灵活的多。
2.不同的容器对于某些操作具有不同的效率。最好的例子就是两种List的比较:ArraryList和LinkedList。它们都是具有相同接口和外部行为的简单的序列,但是它们对某些操作所花费的代价却有天壤之别。
对象的创建
对象的数据位于何处?怎样控制对象的生命周期?C++认为效率控制室最重要的议题,所以给程序员提供了选择的权力。为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定, 这一通过将对象置于堆栈或静态存储区域内来实现。这种方式将存储空间分配和释放置于优先考虑的位置,某些情况下只要控制非常有价值。但是,也牺牲了灵活性,因为必须 在编写程序时知道对象确切的数量、生命周期和类型。
第二种方式实在被称为堆heap的内存池中动态的创建对象。在这种方式中,直到运行时才知道需要多少对象,它们的生命周期如何,以及它们具体类型是什么。这些问题的答案只能在程序运行时相关代码呗执行到那一刻才能确定。如果需要一个新对象,可以在需要的时刻直接在堆中创建。因为存储空间实在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于在堆栈中创建存储空间的时间。在堆栈中创建存储空间和释放存储空间通常各需要一条汇编指令即可,分别对应将栈顶指针向下移动和将栈顶指针向上移动。创建堆存储空间的时间依赖于存储机制的设计。
动态方式有这样一个一般性的逻辑假设:对象趋于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。动态方式所带来的更大的灵活性正是解决一般化编程问题的要点所在。
Java完全采用了内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。
对象的生命周期
对于允许在堆栈上创建对象的语言,编译器可以确定对象存活时间,并可以自动销毁它。
然而,如果是在堆上创建对象,编译器就会对它的生命周期一无所知。
异常处理
异常处理将错误处理直接置于编程语言中,有时甚至置于操作系统中。异常是一种对象,它从出错地点被“抛出”,并被专门设计用来处理特定类型错误的相应的异常处理器“捕获”。
异常处理就像是与程序正常执行路径并行的,在错误发生时执行的另一条路径。因为它是另一条完全分离的执行路径,所以它不会干扰正常的执行代码。
并发编程
隐患:共享资源