Object-Oriented Programming (OOP) 面向对象的编程
用OOP/接口/类实现ADT
OOP的基本概念
封装与信息隐藏
继承与重写
多态、子类型、重载
静态与动态分派
– Interface和Class: 定义和实现ADT
– 接口中只有方法的定义,没有实现
– 接口之间可以继承与扩展
– 一个类可以实现多个接口(从而具备了多个接口中的方法)
– 一个接口可以有多种实现类
接口:确定ADT规约;类:实现ADT
也可以不需要接口直接使用类作为ADT,既 有ADT定义也有ADT实现
实际中更倾向于使用接口来定义变量
– 打破了抽象边界,接口定义中没有包含constructor,也无法保证所有实现 类中都包含了同样名字的constructor。 – 故而,客户端需要知道该接口的某个具体实现类的名字
接口中的每个 方法在所有类中都要实现,缺点是会导致部分方法的重复实现
通过default方法,在接口 中统一实现某些功能,无需在各个类中重复实现它。
default 方法的典 型使用方式:以增量式的为接口增加额外的功能而不破坏已实现的类
使用接口类型声明变量
客户端仅使用接口中定义的 方法
客户端代码无法直接访问属性
客户端仍然可以访问其他的非接口成员
严格继承:子类只能添加新方法,无法重写超类中 的方法
重写 的函数:完全同样的signature
实际执行时调用哪个方法,运行时决定。
父类型中的被重写函数体不为空:意 味着对其大多数子类型来说,该方法 是可以被直接复用的。
对某些子类型来说,有特殊性,故重 写父类型中的函数,实现自己的特殊 要求
如果父类型中的某个函数实现体为空, 意味着其所有子类型都需要这个功能, 但各有差异,没有共性,在每个子类中 均需要重写。
重写之后,利用super()复用了父类 型中函数的功能,并对其进行了扩展
重写的时候,不要改变原方法的本意
抽象类不能实例化(不能用new 生成对象)
继承某个抽象类的子类在实例化时,所有父类中的 抽象方法必须已经实现
如果某些操作是所有子类型都共有, 但彼此有差别,可以在父类型中设计 抽象方法,在各子类型中重写
所有子类型完全相同的操作, 放在父类型中实现,子类型中 无需重写。
有些子类型有而其他子类型无 的操作,不要在父类型中定义 和实现,而应在特定子类型中 实现。
一个方法可以有多个同名的实现(方法重载)
一个类型名字可以代表多个类型(泛型编程)
一个变量名字可以代表多个类的实例(子类型)
? 重载:多个方法具有同样的名字,但有不同的参数列表或返回值类型
重写时父类和子类中的方法具有相同的签名
签名不同时则为重载
子类重载了父类的 方法后,子类仍然继承了被重载的方法
参数多态性是指方法针对多种类型时具有同样的行为 (这里的多种类型应具有通用结构),此时可使用统一的类型变量表达多种 类型
在运行时根据具体指定类型确定具 体类型(编译成class文件时,会用指定类型替换类型变量“擦除”)
泛型编程是一种编程风格,其中数据类型和函数是根据待 指定的类型编写的,随后在需要时根据参数提供的特定类型进行实例 化。
泛型编程围绕“从具体进行抽象”的思想,将采用不同数据表示的 算法进行抽象,得到泛型化的算法,可以得到复用性、通用性更强 的软件。
使用泛型变量的三种形式 :泛型类、泛型接口和泛型方法
类中如果 声明了一个或多个泛型变量,则为泛型类
注: 泛型类/接口,是在实例化类的时候指明泛型的具体类型 泛型方法,是在调用方法的时候指明泛型的具体类型
静态方法 不能使用所在泛型类定义的泛型变量
如果静态方法要使用泛型的话,必须将静态方法也定义成泛型方 法 。
子类型的规约不能弱化超类型的规约。
子类型多态:不同类型的对象可以统一的处理而无需区分
? 价值:方便client调用,client可用不同的参数列表,调用同样的函数
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!