接口就是一种规范或标准,只要符合这个标准都可以通用,接口的表现
在于对行为的抽象。 就好比插座,每个厂商生产的插座我们都可以用,这是因为他们有同一个标准,这里插座就是接口。
//接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口
public interface 接口名称{
// 定义变量
int a = 10; // 接口当中的成员变量默认都是public static final
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
void method2(); // 接口当中的成员方法默认都是public abstract, 更推荐用第二种来定义方法
}
接口中包含抽象方法,所以不能实例化接口,要实现接口徐一个普通类。接口和类之间用关键字implement实现一个类实现某个接口则必须实现该接口中的抽象方法,否则该类必须被定义为抽象类
🌰接口中可以包含变量和方法,变量被隐式指定为 public static final,方法被隐式指定为 public abstract(JDK 1.8 d一个类可以同时实现多个接口,一个类实现某个接口则必须实现该接口中的抽象方法,否则该类必须被定义为抽象类
🌰接口支持多继承,即一个接口可以继承(extends)多个接口,间接解决了 Java 中类不能多继承的问题。
接口用法
- 一般情况下,实现类和它的抽象类之前具有 "is-a" 的关系,但是如果我们想达到同样的目的,但是又不存在这种关系时,使用接口。
- 由于 Java 中单继承的特性,导致一个类只能继承一个类,但是可以实现一个或多个接口,此时可以使用接口。
接口帮Java实现多继承
由于 Java 中单继承的特性,导致一个类只能继承一个类,但是可以实现一个或多个接口,此时可以使用接口。
class Animal {
String name; // 不能使用private,后面的子类也要用
public Animal(String name) { // 父类的自定义的构造方法
this.name = name;
}
}
interface IFlying { // 自定义多种接口
void fly();
}
interface IRunning {
void run();
}
interface ISwimming {
void swimming();
}
// 小鸭子,不仅会跑,还会游泳、飞行
一个类继承父类,并实现多个接口,间接的解决java中不能多继承的问题
class Duck extends Animal implements IRunning, ISwimming, IFlying {
public Duck(String name) { // 子类构造方法
super(name); // 必须在子类构造方法的第一行
// 在给实现子类的构造方法前,先要用super()调用实现父类的构造方法,比较先有父后有子呀!
// 因为父类自己定义了构造方法,编译器不会自动给给子类构造方法中添加super();来实现父类的构造方法,需要我们自己实现
}
// 对接口中的抽象方法进行重写
@Override
public void fly() {
System.out.println(this.name + "正在用翅膀飞");
}
@Override
public void run() {
System.out.println(this.name + "正在用两条腿跑");
}
@Override
public void swimming() {
System.out.println(this.name + "正在漂在水上");
}
}
public class 接口的使用 { // 不用学我用中文名作为类名,我只是为演示方便
public static void main(String[] args) {
Duck duck = new Duck("第一个小鸭子"); // 实例化鸭子对象
duck.fly(); // 通过引用 变量名.方法名 输出重写后的方法
duck.run();
duck.swimming();
}
}
有人可能会说干嘛用接口,我直接在父类Animal中实现fly、run、swimming这些属性,
然后不同的动物子类再继承父类这些方法不行吗?
但问题是,鸭子会fly、swimming,那猫会飞和游泳吗?你再写个其他动物的子类是不是就不行了
而用接口呢?我们只是把这种飞、游泳的行为给抽象出来了,
只要一个子类有这种行为,他就可以实现相对应的接口,接口是更加灵活的
运行结果
一个小鸭子正在用翅膀飞
一个小鸭子正在用两条腿
一个小鸭子正在水上漂
一个类继承一个父类, 同时实现多个接口。
继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性 ,能实现接口的类和该接口并不一定有is_a的关系,只要该类有这个接口的特性就行
public interface Dog {
public abstract void eat();//public abstract可以省略不写
}
- 接口可以用来对类提供标准或规范(避免类在设计上的不一致性)
- 接口可用于简介实现多重继承(使用接口为实现类添加额外功能)
- 接口可以是设计与现实相分离(降低代码耦合度,保证代码安全性)