面向对象(下)-接口的理解
6.6 接口(interface)
概述:
-
一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法,但是,Jvava不支持多重继承。有了几口,就可以通过多重实现得到多重继承的效果。
-
另一方面,有时必须 从几个类中抽取出一些共同的行为特征,而他们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。例如:鼠标、键盘、打印机灯都支持USB连接。
-
接口就是规范,定义的是一组规则,体现了现实世界中"如果你是/要...则必须能..."的思想。
继承是一个"是不是"的关系,而接口实现则是"能不能"的关系. 如:黄种人是人类,黄种人能吃饭、睡觉,狗也能吃饭睡觉,那么黄种人可以继承人类,实现吃饭、睡觉等接口。 -
接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守。如:打印机能使用USB,则打印机必须遵守USB的规范,使用统一的USB端口和协议。 -
接口和类是并列的关系。
面向对象(下)接口的定义与使用
接口的使用
-
a、接口使用interface定义
-
b、java中,接口和类是并列的两个结构
-
c、如何定义接口:定义接口中的成员
-
- JDK7及以前:in定义全局常量和抽象方法
-
-(全局常量:public static final,书写时可以省略)
-
-(抽象方法:public abstract,书写时可以省略)
-
- JDK8及以后:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
-
d、接口中不能定义构造器!意味着接口不可以实例化
-
e、java开发中,接口通过让类实现(implements)方式来使用
-
- 如果实现类覆盖了接口的所有抽象方法,则此实现类可以实例化。
-
- 如果实现类未覆盖接口的所有抽象方法,则此实现类为抽象类。
-
f、java类可以实现多个接口 (弥补了java单继承的局限性)
-
- 格式:class AA extends BB implements CC, DD, EE
-
g、接口与接口之间可以继承,而且可以多继承
-
- 格式:Interface AA extends BB, CC {}
-
h、接口的具体使用,体现了多态性
-
i、接口,实际上可以看做是一种规范
-
j、接口的主要用途就是被实现类实现。(面向接口编程)
java
public class InterfaceTest {
public static void main(String[] args) {
Plan plan = new Plan();
plan.fly(); // 以7900速度起飞!
plan.stop(); // 以1速度减速停止!
Fly fly = new Plan(); // 展示接口的多态;
fly.fly(); // 以7900速度起飞!
fly.stop(); // 以1速度减速停止!
}
}
// 某某能飞
interface Fly {
public static final int MAX_SPEED = 7900; // 最快速度
int MIN_SPEED = 1; // 省略public static final 最慢速度
public abstract void fly(); // 开始飞
void stop(); // 省略public abstract 停下来
}
// 飞机能飞
class Plan implements Fly, AA{ // 类可以继承或多继承接口
@Override
public void fly() {
System.out.println("以" + Fly.MAX_SPEED + "速度起飞!");
}
@Override
public void stop() {
System.out.println("以" + Fly.MIN_SPEED + "速度减速停止!");
}
}
interface AA{}
interface BB{}
interface CC extends AA, BB{} // 接口可以继承或多继承接口
面向对象(下)创建接口匿名实现类的对象
对标匿名类的对象。
java
public static void main(String[] args) {
// 接口的非匿名实现类对象
Plan plan = new Plan();
plan.fly(); // 以7900速度起飞!
plan.stop(); // 以1速度减速停止!
// 接口的非匿名实现类对象
Fly fly = new Plan(); // 展示接口的多态;
fly.fly(); // 以7900速度起飞!
fly.stop(); // 以1速度减速停止!
// 接口的非匿名实现类的匿名对象:Plan类实现了接口Fly,且这个对象没有名字。
new Plan().fly();
// 接口的匿名实现类的非匿名对象:接口的实现类没名字,但是对象有名字。
Fly fly1 = new Fly() {
@Override
public void fly() {}
@Override
public void stop() {
}
};
// 接口的匿名实现类的匿名对象:接口没有实现类,对象也没名字。
new Fly() {
@Override
public void fly() {}
@Override
public void stop() {}
}.fly();
}