第三章:抽象数据类型(ADT)和面向对象编程(OOP)
第四节:面向对象的程序设计
问题一:一个类的静态方法和实例方法的区别
用法的区别:静态方法与任何类中的实例都没有联系,实例方法必须需要一个特定的对象来调用(在静态函数中)。
内存存储的区别:
问题二:接口(Interface)与封装隐藏
1.接口的特点:
- 接口定义抽象数据类型(ADT),类实现ADT;接口确定ADT规约,类实现ADT
- 接口之间可以继承
- 一个类可以实现多个接口
- 一个接口可以有多种实现
- 打破了抽象边界,接口定义中没有包含constructor,依然无法保证所有实现类中都包含了同样名字的constructor。因此,客户端需要知道该接口的某个具体实现类的名字。
- 实现实例:
- 更详细的介绍
- 通过上面链接最需要了解的是:它与构造函数不同,它可以返回类型的子类型对象。这样可以强迫使用者通过接口来引用被返回的对象,而不是通过实现来引用。
- 其次是,可以降低类之间的耦合性(理解的不是太好。。。)
- 静态工厂的实现形式
3.接口与信息封装隐藏
- 使用接口类型声明变量
- 客户端仅使用接口中定义的方法
- 客户端代码无法直接访问属性
问题三:继承与重写(Inheritance and Overriding)
1.严格继承:子类只能添加新方法,无法重写超类中的方法(一个方法不能被重写,必须用 final 关键字定义)
2.final关键字在不同场合的应用:
3.覆盖/重写(Overriding)
用法:重写的函数与被重写的函数有(一样的名字,一样的参数和签名和一样的返回类型)
- ***实际执行时调用哪个方法,运行时决定(动态检查)
- 若父类型中的被重写的函数体不为空:意味着该方法可以被直接服用或者被重写
- 若父类型中的某个函数实现体为空,意味着其所有子类型都需要这个功能,但各有差异,没有共性,在每个子类中均需要重写
- 重写之后,利用super()复用了父类型中函数的功能。
- 重写的时候不要改变原方法的本意
问题四:抽象类
抽象级别排序:具体类→抽象类→接口
- 如果某些操作是所有子类型都共有,但彼此有差异,可以再父类型中涉及抽象方法,在各个子类型中重写。
- 所有子类型完全相同的操作,放在父类型中实现,子类型中无需重写。
- 有些子类型有而其他子类没有的操作,不要在父类型中定义和实现,而应在特定子类型中实现
问题五:多态和重载(Polymorphism and overloading)
1.多态的分类:特殊多态(Ad hoc polymorphism)对应于功能重载(functionoverloading)、参数化多态(Parametric polymorphism)对应于(genericprogramming)、子类型多态或包含多态(Subtyping)
2.特殊多态(Ad hoc polymorphism)与重载(Overloading)
用法:多个方法具有同样的名字,但有不同的参数列表或返回类型(必须具有不同的参数列表,可以具有相同或者不同的标签和返回类型)(可以咋子同一个类内重载,也可以在子类中重载)
价值:方便client调用,client可用不同的参数列表,调用同样的函数
- ***重载是一种静态多态,根据参数列表进行最佳匹配
- ***静态类型检查(static type checking),在编译阶段决定要具体执行哪个方法
- ***与之相反,重写(override methods)则是在run-time(运行阶段)进行动态检查(dynamic checking)
**例:判断调用的是哪个函数
(因为animalRefToHorce前面的类型是Aniaml,实例后的类型是Horce,但因为重载是静态多态,在编译时检查,所以它的类型为前面的Animal,自然调用的是参数类型为Animal的函数)
***例:看下列语句的输出是什么?
解:(每一行分别对应1,2,3,4)
(第一个,第二个比较基本无需解释。第三个,因为vocalize()函数为重写,所以是动态检查即在运行时检查,b的类型为Cow,所以调用的是Cow类里的函数。第四个,因为java是静态检查语言即在编译时检查,所以b的类型判定为Animal,无法点用moo()函数)
- ***重写(Overriding)与重载(Overloading)的区别
3.参数化多态(Parametric polymorphism)与泛型(Generic programming)(不太会)
含义:是一种类型变量
泛型类:其定义包含了类型变量
泛型接口的两种表示:泛型接口,非泛型的实现类
泛型接口,泛型的实现类
4.子类型多态(Subtyping Polymorphism)(不太会...)
问题六:动态分派(Dynamic dispatch)与静态分派(static dispatch)
对比:
****例:静态分派
动态分派:
总结: