- 👑专栏内容:Java
- ⛪个人主页:子夜的星的主页
- 💕座右铭:前路未远,步履不停
目录
1、接口概念
在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等。电脑的USB口上,可以插:U盘、鼠标、键盘等所有符合USB协议的设备。接口其实就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
接口,也可以进一步看成是抽象类的进一步抽象。接口的定义格式与定义类的格式基本相同,将class
关键字换成 interface
关键字,就定义了一个接口。
java
//
interface IShape{
public abstract void draw();
public static void draw3() {
System.out.println("1234");
}
}
//
class Cycle implements IShape{
@Override
public void draw() {
System.out.println("⭕");
}
}
public class Test {
public static void drawMap(IShape iShape){
iShape.draw();
}
public static void main(String[] args) {
Cycle cycle = new Cycle();
drawMap(new Cycle());
}
}
提示:
- 创建接口时, 接口的命名一般以大写字母 I 开头
- 接口的命名一般使用 "形容词" 词性的单词
- 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性
接口中,不能有实现的方法,但是有2种类型的方法需要注意:
- 静态方法可以有具体的实现
- 这个方法被
default
关键字修饰,也是可以的。
注意事项:
- 接口是使用
interface
来定义的 - 接口当中的方法默认是
public abstract
修饰的 - 接口中的成员变量默认是
public static final
修饰的 - 接口也不能通过关键字
new
来进行实例化 - 类和接口之间,我们使用关键字
implements
来进行关联 - 当一个类实现一个接口后,这个类必须重写这个接口种的抽象方法
- 当接口当中存在
default
方法,可以选择重写,也可以选择不重写 - 一个类不想实现接口中的方法,这个类可以被定义为抽象类
2、实现一个接口
定义一个接口 Flying
,里面包含一个飞行的方法。
java
public interface Flying {
// 接口中的方法 fly
void fly();
}
实现接口的一个类 Bird
java
public class Bird implements Flying {
// 实现接口方法 'fly'
@Override
public void fly() {
System.out.println("The bird is flying");
}
}
3、实现多个接口
在Java中,类和类之间是单继承的,一个类只能有一个父类,即Java中不支持多继承,但是一个类可以实现多个接口。一个类实现多个接口,可以解决多继承的问题。
下面通过类来表示一组动物。
java
class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
另外我们再提供一组接口, 分别表示 "会飞的", "会跑的", "会游泳的"。这三个接口,每个接口代表的功能是不一样的。
java
interface IFlying {
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
接下来我们创建几个具体的动物,注意要先继承类再实现接口。
猫,是会跑的
java
class Cat extends Animal implements IRunning {
public Cat(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在用四条腿跑");
}
}
鱼,是会游泳的
java
class Fish extends Animal implements ISwimming {
public Fish(String name) {
super(name);
}
@Override
public void swim() {
System.out.println(this.name + "正在用尾巴游泳");
}
}
青蛙, 是既能跑, 又能游的
java
class Frog extends Animal implements IRunning, ISwimming {
public Frog(String name) {
super(name);
}
@Override
public void run() {
System.out.println(this.name + "正在往前跳");
}
@Override
public void swim() {
System.out.println(this.name + "正在蹬腿游泳");
}
}
注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类 。
上面的代码展示了 Java 面向对象编程中最常见的用法:一个类继承一个父类, 同时实现多种接口。继承表达的含义是 is-a
语义, 而接口表达的含义是 具有 xxx
特性
猫是一种动物, 具有会跑的特性.
青蛙也是一种动物, 既能跑, 也能游泳
鸭子也是一种动物, 既能跑, 也能游, 还能飞
这样设计有什么好处呢? 时刻牢记多态的好处, 让程序猿忘记类型。有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力。
例如, 现在实现一个方法, 叫 "散步"
java
public static void walk(IRunning running) {
System.out.println("我带着伙伴去散步");
running.run();
}
在这个 walk 方法内部, 我们并不关注到底是哪种动物, 只要参数是会跑的, 就行
java
Cat cat = new Cat("小猫");
walk(cat);
Frog frog = new Frog("小青蛙");
walk(frog);
4、接口间的继承
在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。即:用接口可以达到多继承的目的。接口可以继承一个接口,使用 extends
关键字,达到复用的效果。
java
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
通过接口继承创建一个新的接口 IAmphibious
表示 "两栖的"。此时实现接口就继续要实现 run 方法, 也需要实现 swim 方法。
接口间的继承相当于把多个接口合并在一起