第一章 对象引论02

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

有时你必须在导处类型中添加新的接口元素,这样也就扩展了接口并建立了新的类型。这个新的类型仍然能够替代基类,可是这种替代并不完美,由于基类没法访问你新添加的方法。这种状况咱们能够描述为“is-like-a”关系。工具

伴随多态的可互换对象spa

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

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

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

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

抽象基类和接口编译器

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

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

相关文章
相关标签/搜索