学习目标
关键是要理解抽象基类与接口特性被引入的必要性
抽象类和抽象方法
- 有abstract修饰的类称为“抽象类”,它只定义了什么方法应该存在,不能创建对象,必须派生出一个子类,并在子类中实现其未实现的方法之后,才能使用new关键字创建对象
- 在方法前加上abstract就形成抽象方法,只有方法声明,没有实现
抽象类的三种“类型”
- 直接定义了一个抽象方法
- 继承了一个抽象父类,但没有完全实现父类所包含的抽象方法
- 实现了一个接口,但没有完全实现此接口所包容的抽象方法
从抽象类继承
- 从抽象类继承的子类必须实现父类的所有抽象方法,否则,仍然是抽象类
使用抽象类
- 抽象类不能创建对象,一般用它来引用子类对象
- 实例
Person p;
p = new Employee();
- 以下模式总是成立的:
接口
看到这里,我发现,我还是没有从C++里走出来
Java接口的语法特性
- 定义一个接口,采用关键字interface,实现一个接口,采用关键字implements
- 接口的成员函数自动成为public的,数据成员自动成为static或final的
- 如果接口不声明为public,则自动变成package
- 一个类可以同时实现多个接口
接口的使用
接口的扩充
- 可以通过继承接口来扩充已有接口,并形成一个新的接口
- 实现子接口的类,必须实现“父子”接口所定义的所有方法,才能被实例化(即new出一个对象)
利用接口定义常量
- 只要一个类声明实现了这个接口,就可以直接使用这些常量名
- 在实际开发中,这种编程方式非常常见
- ⚠️定义在接口中的常量必须被初始化
接口与抽象类的区别
- 抽象类是一个不完全类,而接口只是表明类应该具有哪些“外部”特征,不涉及任何实现细节
- 接口基本上不具备继承的任何具体特点,它仅仅承诺了外界能够调用的方法
- 一个类一次可以实现若干个接口,但一个类只能继承一个父类