上一篇《封装、继承、多态》中介绍了抽象类——一种不能被实例化的特殊类,其子类可以通过继承调用其方法,但是 java 是单根继承,一个类只能继承一个父类,那么多根继承在 java 中是否就实现不了呢?
一个类的确只能继承一个类,但可以实现多个接口,这样也可以达到“多根继承”的效果
接口
接口不是类,是一系列静态常量和抽象方法的集合,接口不能被实例化,但可以被类实现。类似于继承,实现接口的非抽象类必须实现其所有的抽象方法。
定义接口的关键字:interface
//接口的创建
public interface Paper {
public String getPaper(String size);
}
实现接口的关键字:implements
//接口的实现(类似于类的继承)
//实现一个接口
public class A4Paper implements Paper {
@Override
public String getPaper() {
return "A4纸";
}
}
//实现多个接口,各接口之间用 ,隔开
public class Printer implements Paper, Ink { //这里的 Ink 也是一个接口
@Override
public String getPaper(String size) {
System.out.println("在"+size+"纸上打印");
return size;
}
}
接口也可以作为变量,虽然接口不可以被实例化,但可以作为变量指向其实现类,和抽象父类指向子类实例相同
public class Printer {
//类和对象可以作为数组元素,自然也可以作为变量
//接口在这里可以看作一个抽象父类作变量,“继承”(实现)它的类可以作为它的实例
private Paper paper;
public Printer(Paper paper) {
this.paper = paper;
}
public Printer() {}
public Paper getPaper() {return paper;}
public void setPaper(Paper paper) {this.paper = paper;}
public void getPrint() {
System.out.println("在"+this.paper.getPaper()+"打印");
}
}
接口的特性:
- 接口不能被实例化,也没有构造方法
- 接口内的变量都是公共静态常量,方法都是公共抽象方法(方法的public abstract可以省略)
- 实现类必须实现其所有方法(除非实现类是抽象类)
- 一个实现类可以实现多个接口,也可以继承的同时实现接口
- 一个接口也可以继承多个接口,但接口不能实现接口(extends,继承多个也用 ,隔开)
抽象类和接口的相同点:都不能被实例化,其非抽象的子类/实现类都要实现其全部的抽象方法
接口与抽象类的不同点:
- 抽象类是类,关键字 class ;接口不是类,关键字 interface
- 抽象类可以有构造方法、非公共静态常量、实例方法;接口只能有公共静态常量和公共抽象方法
- 继承抽象类关键字 extends ;实现接口关键字 implements
- 一个类只能继承一个抽象类,但可以实现多个接口
- 抽象类利于代码复用,接口利于代码维护