面向对象的编程
1 接口、抽象类、具体类
-
接口
interface
和Class
: 定义和实现ADT- 接口之间可以继承与扩展
extends
- 一个类可以实现
implements
多个接口(从而具备了多个接口中的方法) - 一个接口可以有多种实现类
- 接口中的每个方法在所有类中都要实现
- 通过default方法,在接口中统一实现某些功能,无需在各个类中重复实现它
-
抽象类
- 至少包含一个抽象方法
abstract
的类称为抽象类,抽象类只有定义没有实现,不能实例化。抽象类中允许有具体方法,但是至少得有一个抽象方法 - 继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现。
- 至少包含一个抽象方法
-
具体类
- 具体实现接口的类
- 具体实现接口的类
2 继承、override
- 如果子类想要覆盖重写父类中的函数,则要和父类保持相同的方法签名。
- 返回值可以相同
- 如果不相同,则子类方法中的返回值一定是父类方法中返回值的子类型
- 实际执行时调用哪个方法,运行时决定。
- 当子类包含重写超类方法的方法时,它还可以使用关键字
super.
调用超类方法
3 多态、overload
-
overload重载
- 一个方法有多个重名的实现
- 必须有不同的参数列表
- 返回值可以相同/不同
- 除了名字相同之外,各个方法之间没有任何关系
- 重载使用静态类型检查传递的参数或者返回类型,
- 在编译阶段决定具体执行哪个方法(重写是在运行时进行动态检查的)
-
多态的3种形态:
- 特殊多态(overload重载)
- 参数化多态(泛型)
- 子类型多态、包含多态(子父类继承)
4 泛型
-
泛型变量
E
、泛型方法E
、泛型类<E>
、泛型接口<E>
和public interface List<E> //泛型接口 public class Pair<E> { //泛型类 private final E first, second; //泛型变量 public Pair(E first, E second) { //泛型方法 this.first = first; this.second = second; } public E first() { return first; } public E second() { return second; } }
-
类、接口中如果声明了一个或多个泛型变量,则为泛型类、接口
-
泛型不是协变的,是不变的。
list<object>
和arraylist<object>
存在父子关系,而list<integer>
和list<object>
不存在父子关系。如果想存在父子关系,则需要加上限定符extends