《Java编程思想》--对象导论--第1章

来源:互联网 发布:熊猫网络电视怎么用 编辑:程序博客网 时间:2024/05/16 18:20

所谓的“类型”是指“所抽象的是什么”。

每个对象看起来都有点像一台微型计算机——它具有状态,还具有操作,用户可以要求对象执行这些操作。

面向对象语言的基本特性:

1.万物皆为对象。

2.程序是对象的集合,它们通过发送消息来告知彼此所要做的。

3.每个对象都有自己的由其他对象所构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象。因此,可以在程序中构建复杂的体系,同时将其复杂性隐藏在对象的简单性背后。

4.每个对象都拥有其类型。

5.某一特定类型的所有对象都可以接收同样的消息。

在程序执行期间具有不同的状态而其他方面都相似的对象会被分组到对象的类中,这就是关键字class的由来。

接口确定了对某一特定对象所能发出的请求(个人注释:其实就是方法的集合)。

类创建者的目标是构建类,这种类只向客户端程序员暴露必须的部分,而隐藏其他部分。为什么要这样?因为如果加以隐藏,那么客户端程序员将不能够访问它,这意味着类创建者可以任意修改被隐藏的部分,而不用担心对其他任何人造成影响。被隐藏的部分通常代表对象内部脆弱的部分,它们很容易被粗心的或不知内情的客户端程序员所毁坏,因此将实现隐藏起来可以减少程序bug。

在任何相互关系中,具有关系所设计的各方都遵守的边界是十分重要的事情。

因此,访问控制的第一个存在原因就是让客户端程序员无法触及他们不应该触及的部分——这些部分对数据类型的内部操作来说是必需的,但并不是用户解决特定问题所需的接口的一部分。

访问控制的第二个存在原因就是允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员。

在创建了一个类之后,即使另一个新类与其具有相似的功能,你还是得重新创建一个新类。如果我们能够以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新类那就要好多了。通过“继承”便可达到这样的效果。不过,当父类发生变动时,子类也会反映出这些变动。

一个基类型包含其所有导出类型所共享的特性和行为。可以创建一个基类型来标识系统中某些对象的核心概念,从基类型中导出其他类型,来标识此核心可以被实现的各种不同方式。

当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(尽管private成员被隐藏了起来,并且不可访问),而且更重要的是它复制了基类的接口。也就是说,所有可以发送给基类对象的消息同时也可以发送给导出类对象。由于通过发送给类的消息的类型可知类的类型,所以这也意味着导出类与基类具有相同的类型。通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。

有两种方法可以使基类与导出类产生差异。第一种方法:直接在导出类中添加新方法。第二种也是更重要的方式:改变现有基类的方法和行为,这被称为“覆盖(overriding)”。你可以说:“此时,我正在使用相同的接口方法,但是我想在新类型中做些不同的事情”。

编译器不可能产生传统意义上的函数调用。一个非面向对象编程的编译器产生的函数调用会引起所谓的“前期绑定”。这么做意味着编译器将产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。然而在OOP中,程序直到运行时才能够确定代码的地址。
OOP语言使用“后期绑定”,当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查(无法提供此类保证的语言被称为是弱类型的),但是并不知道将被执行的确切代码。
为了执行“后期绑定”,Java使用一小段特殊的代码来替代绝对地址调用。这段代码使用在对象中存储的信息来计算方法体的地址。

为什么要设计不同的容器?
一、不同容器提供了不同类型的接口和外部行为。
二、不同的容器对于某些操作具有不同的效率。

为什么要有泛型?
泛型,也称为“参数化类型”

在Java SE5出现之前,容器存储的额对象都只具有Java中的通用类型:Object。单根继承结构意味着所有东西都是Object类型,所以可以存储Object的容器可以存储任何东西。这使得容器很容易被复用。

要使用这样的容器,只需在其中置入对象引用,稍后还可以将它们取回。但是由于容器只存储Object,所以当将对象引用置入容器时,它必须被向上转型为Object,因此它会丢失其身份。当把它取回时,就获取了一个对Object对象的引用,而不是对置入时的那个类型的对象的引用。所以,当取出的时候,需要向下转型为更具体的类型。向下转型和运行时的检查需要额外的程序运行时间,也需要程序员付出更多的心血。那么,创建这样的容器,它知道自己所保存的对象的类型,从而不需要向下转型以及消除犯错误的可能,这样不是更有意义吗?这种解决方案被称为参数化类型机制。参数化类型就是一个编译器可以自动定制作用于特定类型上的类。

Java采用动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。堆(heap)的内存池中动态地创建对象。在这种方式中,直到运行时才知道需要多少对象,它们的生命周期如何,以及它们的具体类型是什么。这些问题的答案只能在程序运行时相关代码被执行到的那一刻才能确定。如果需要一个新独享,可以在需要的时刻直接在堆中创建。因为存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于在栈中创建存储空间的时间。在栈中创建存储空间和释放存储空间通常各需要一条汇编指令即可,分别对应将栈顶指针指向下移动和将栈顶指针向上移动。创建堆存储空间的 时间依赖于存储机制的设计。

Java的垃圾回收器被设计用来处理内存释放问题()


原创粉丝点击