Java 面向对象(下)
P343-
1. 抽象类
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得 非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
abstract关键字的使用
- abstract:抽象的
- abstract可以用来修饰的结构:类、方法
- abstract修饰类:抽象类
注意:
- 此类不能实例化。
- 抽象类中 一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)。
- 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作。
- abstract修饰方法:抽象方法。
- 抽象方法 只有方法的声明,没有方法体。
abstract public void breath();
- 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
- 若子类 重写了父类中的所有的抽象方法后,此子类方可实例化。若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用
abstract
修饰。 - 抽象类的构造方法定义为
protected
,因为只能被子类调用。
2. 接口
2.1 接口的定义
- 一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
- 另一方面,有时必须从几个类中抽取出- - 些共同的行为特征,而它们之间又 没有is-a的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打印机、扫描仪、摄像头、充电器、MP3机、手机、数码相机、移动硬盘等都支持USB连接。
- 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个"是不是"的关系,而接口实现则是"能不能"的关系。
- 接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都 要遵守。
2.2 接口的使用
- 接口使用
interface
来定义 - Java中,接口和类是并列的两个结构
- 如何定义接口:定义接口中的成员
- JDK7及以前:只能定义全局常量和抽象方法
- 全局常量:
public static final
的。 但是书写时,可以省略不写 - 抽象方法:
public abstract
的 - JDK8:除了定义 全局常量和抽象方法之外,还可以定义静态方法、默认方法(略)
// 定义接口 interface Flyable { public static final int Max_VALUE = 7900; int MIN_VALUE = 20; public abstract void fly(); void stop(); }
- 接口中不能定义构造器的! 意味着接口不可以实例化
Java开发中, 接口通过让 类去实现(implements)的方式来使用。
- 如果 实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
// 类实现接口 class Plane implements Flyable { public Plane() {} @Override public void fly() { System.out.println("飞机起飞"); } @Override public void stop() { System.out.println("飞机降落"); } }
- Java类可以实现多个接口 --- >弥补了Java单继承性的局限性
格式:class AA extends BB implements CC,DD,EE
- 接口与接口之间可以继承,而且可以多继承。
- 接口的具体使用,体现多态性。
- 接口,实际上可以看做是一种规范。
- 开发中,体会面向接口编程。