第五章 继承、接口和抽象类 第三节 转型、多态和契约设计

类转型(1):

--变量支持互相转化,比如 int  a  =  ( int ) 3.5 ;  (转型意味着两个数据有共同点,如3和3.5的整数部分相同,才能转型)

--类型可以相互转型,但是只限制于有继承关系的类。

(1)子类可以转换成父类,而父类不可以转为子类。

(2)子类继承父类所有的财产,子类可以变成父类(从大到小,因此子类肯定大。即向上转型);从父类直接变成子类(从小变大,即向下转型)则不允许。 从大的东西(子类)转为小的东西(父类)是可以的,因为可以把多余的东西屏蔽掉。

第五章 继承、接口和抽象类 第三节 转型、多态和契约设计

类转型(2):

--有一种情况允许父类转为子类,那就是: 这个父类对象本身就是从子类转化过来的。

第五章 继承、接口和抽象类 第三节 转型、多态和契约设计

这样子可以转化的原因是 obj1本身的起源就是来自子类Man。

 

多态(1):

--类型转换,带来的作用就是多态。

--子类继承父类的所有方法,但子类可以重新定义一个名字、参数和父类完全一样的方法,这种行为就叫做重写(覆写,覆盖,overwrite / override, not overload(这是重载))。重载是两个不同的方法,函数名一样,但是形参类型或者个数不一样。

--子类的方法的优先级高于父类的。优先调用子类的同名同参数方法。

多态(2):

第五章 继承、接口和抽象类 第三节 转型、多态和契约设计

第五章 继承、接口和抽象类 第三节 转型、多态和契约设计意味着obj1、obj2、obj3指向的是同一块内存,所以他们调用的方法是同一个。这些调用的方法都是依赖于这个对象来指定的,这个对象本身就是Man对象。

 

多态(3):

多态的作用:

(1)以统一的接口来操纵某一类中不同的对象的动态行为

(2)对象之间的解耦

--参看AnimalTest.java

契约设计(1):

--Java编程设计遵循契约精神

--契约:规定规范了对象应该包含的行为方法

--接口定义方法的名称、参数和返回值,规范了派生类(子类)至少应该有的行为

--基于接口,利用转型和多态,不影响真正方法的调用,成功地将调用类和被调用类解耦(decoupling)

举个例子:

契约设计(2):

第五章 继承、接口和抽象类 第三节 转型、多态和契约设计

--Animal是一个接口,有两个未实现的方法eat()和move(),调用类中new 了接口 如new  Animal(){...},new接口的同时,必须将接口的所有方法实现补足补全,否则就不能new。

--只需要传进来一个实现Animal接口的对象,就可以运行haveLunch方法。这两个类就完成了解耦关系。我写这边的代码,你写那边的代码,我们定义好了,我送给你一个参数,如Animal的对象。你就说只需要给我一个Animal对象就可以了,你就会执行haveLunch方法。

第五章 继承、接口和抽象类 第三节 转型、多态和契约设计