第五章 接口
5.1 接口概述
常见的猫狗案例 猫和狗它们仅仅提供一些基本功能。
但有一些不是动物本身就具备的,比如:猫钻火圈,狗跳高等功能
是在后面的培养中训练出来的,这种额外的功能,java 提供了接口表示。
5.2 接口特点
A:接口用关键字 interface 表示
[public] interface 接口名 {}
- 接口中的方法不能具体实现,接口中的方法必须为抽象方法
- 接口中一般不定义变量,因为接口中的变量会被默认指定为 public static final 变量(只能是)
B:类实现接口用 implements 表示
class 类名 implements 接口 1, 接口 2,[....]{}
1. 一个类(非抽象类)可以遵循多个接口,并且需要实现(重写)该接口中所有的方法
2. 子类为抽象类的意义不大
5.3 接口的成员特点
A: 成员变量
只能是常量
默认修饰符:public static final
B: 构造方法
没有构造方法
C: 成员方法
只能是抽象的
默认修饰符:public abstract
5.4 抽象类和接口的区别(重要)
我们从我们实际设计场景中来切入这个话题
先来举一个简单的例子:
狗都具有 eat()、sleep() 方法,我们分别通过抽象类和接口定义这个抽象概念
// 通过抽象类定义
public abstract class Dog {public abstract void eat();
public abstract void sleep();}
// 通过接口定义
public interface Dog {public abstract void eat();
public abstract void sleep();}
但是我们现在如果需要让狗拥有一项特殊的技能——钻火圈 DrillFireCircle(),如何增加这个行为呢?
思考:
- 将钻火圈方法与前面两个方法一同写入抽象类中,但是这样的话,但凡继承这个抽象类狗都具有了钻火圈技能,明显不合适
- 将钻火圈方法与前面两个方法一同写入接口中,当需要使用钻火圈功能的时候,就必须实现 接口中的 eat()、sleep() 方法(重写该接口中所有的方法)显然也不合适
那么该如何解决呢 ? 我们可以仔细想一想,eat 和 sleep 都是狗本身所应该具有的一种行为, 而钻火圈这种行为则是后天训练出来的, 只能算是对狗类的一种附加或者延伸, 两者不应该在同一个范畴内, 所以我们考虑将这个单独的行为, 独立的设计一个接口, 其中包含 DrillFireCircle() 方法, Dog 设计为一个抽象类, 其中又包括 eat()、sleep() 方法.
一个 SpecialDog 即可继承 Dog 类并且实现 DrillFireCircle() 接口
下面给出代码:
// 定义接口,含有钻火圈方法
public interface DrillFireCircle() {public abstract void drillFireCircle();
}
// 定义抽象类狗类
public abstract class Dog {public abstract void eat();
public abstract void sleep();}
// 继承抽象类且实现接口
class SpecialDog extends Dog implements drillFireCircle {public void eat() {//....}
public void sleep() {//....}
public void drillFireCircle() () {//....}
}
总结:
继承是一种 “ 是或不是 ” 的关系,而 接口 实现则是 “ 有或没有 ” 的关系。如果一个类继承了某个抽象类,它的子类则一定是抽象类的种类,而接口实现则是有或者没有、具备或者不具备的关系,比如狗是否能钻火圈,能则可以实现这个接口,不能就不实现这个接口。
结尾:
如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家!^_^
如果能帮到你的话,那就来关注我吧!
在这里的我们素不相识,却都在为了自己的梦而努力 ❤
一个坚持推送原创 Java 技术的公众号:理想二旬不止