现在的位置: 首页 > 综合 > 正文

第一章 对象引论02

2012年08月18日 ⁄ 综合 ⁄ 共 1063字 ⁄ 字号 评论关闭

是一个(is-a)与像是一个(is-like-a)关系

有时你必须在导处类型中添加新的接口元素,这样也就扩展了接口并创建了新的类型。这个新的类型仍然可以替代基类,但是这种替代并不完美,因为基类无法访问你新添加的方法。这种情况我们可以描述为“is-like-a”关系。

伴随多态的可互换对象

编译器不可能产生传统意义上的函数调用(function call)。一个非面向对象(non-OOP)编译器产生的函数调用会引起所谓的“前期绑定(earlybinding)”。这么做意味着编译器将产生对一个具体函数名字的调用,而链接器(linker)将这个调用解析到将要被执行代码的绝对地址(absolute address)。在OOP中,程序直到运行时刻才能够确定代码的地址,所以当消息发送到一个泛化对象时,必须采用其他的机制。为了解决这个问题,面向对象程序设计语言使用了“后期绑定(latebinding)”的概念。当你向对象发送消息时,被调用的代码直到运行时刻才能被确定。编译器确保被调用方法存在,并对调用参数(argument)和返回值(return
value)执行类型检查(无法提供此类保证的语言被称为是弱类型的(weakly typed)),但是并不知道将会被执行的确切代码。

为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址调用。这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。当你向一个对象发送消息时,该对象就能够知道对这条消息应该做些什么。

在Java中,动态绑定是缺省行为,你不需要添加额外的关键字来实现多态(polymorphism)。

将导出类看作是它的基类的过程称为“向上转型(upcasting)”

抽象基类和接口

基类仅仅表示其导出类的接口,也就是说,你不希望任何人创建基类的实际对象,而只是希望他们将对象向上转型到基类,所以它的接口将派上用场。这是通过使用abstract关键字把类标识成为抽象类来实现的。如果有人试图创建一个抽象类的对象,编译器都会加以阻止。抽象方法只能在抽象类内部创建,当该类被继承时,抽象方法必须被实现,否则继承类仍然是一个抽象类。创建抽象方法使得你可以将一个方法置于接口中而不必被迫为此方法提供可能毫无意义的方法体。

Interface(接口)这个关键字比抽象类的概念更进了一步,它压根不允许有任何方法定义。接口是一个非常方便而通用的工具,因为它提供了接口与实现的完美分离。此外,只要你愿意,你就可以将多个接口组合到一起,与之相对照的,你要继承多个一般类或抽象类却是不可能的。

抱歉!评论已关闭.