各JDK版本中的接口可以包含的内容
- JDK7中接口可以包含的内容:常量、抽象方法
- JDK8中接口可以包含的内容:常量、抽象方法、默认方法、静态方法
- JDK8中接口可以包含的内容:常量、抽象方法、默认方法、静态方法、私有方法
接口中的抽象方法定义
- 接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
- 这两个关键字修饰符可以选择性地省略
接口的使用步骤:
- 接口不能直接使用,必须有一个“实现类”来“实现”该接口,格式:
public class 实现类名称 implements 接口名称{ } - 接口的实现类必须覆盖重写接口中的所有的抽象方法,实现方式为:去掉abstract关键字,加上方法体大括号
- 创建实现类的对象,进行使用,使用接口中的抽象方法时,不能直接new接口,只能new实现类
//定义接口
public interface demo01 {
public abstract void methodAbs();
}
//接口实现类
public class demo01_impl implements demo01{
public void methodAbs() {
System.out.println("这是抽象方法");
}
}
//调用实现类中的方法
public class test1 {
public static void main(String[] args) {
demo01_impl impl=new demo01_impl();
impl.methodAbs();
}
}
接口中的默认方法(default)
- why?如果一个接口已经被大量的类实现,如果需要再扩充这个接口的功能添加新的方法,则需要所有已经实现的子类重写这个方法,所以从JDK8开始新增了默认方法,便于接口的扩展
- 定义规则
1. 默认方法使用 default 关键字,一个接口中可以有多个默认方法;
2. 接口中既可以定义抽象方法,又可以定义默认方法,默认方法不是抽象方法
3. 子类实现接口的时候,可以直接调用接口中的默认方法,即继承了接口中的默认方法,也可以复写该方法,如果同时实现了两个接口,且两个接口中定义了一样的默认方法,则必须重写默认方法,不然会报错。 - 实例:
interface Cat {
//默认方法
default void run() {
System.out.println("猫跑");
}
default void climb() {
System.out.println("猫爬树");
}
}
//WhiteCat实现Cat
class WhiteCat implements Cat {
//重写默认方法
public void run() {
System.out.println("白猫跑");
}
}
public class Demo04Interface {
public static void main(String[] args) {
WhiteCat cat = new WhiteCat();
cat.run(); //调用子类中重写的方法
cat.climb(); //调用接口中默认方法
}
}
抽象类和接口的异同以及使用场合
抽象类
- 抽象类:包含抽象方法的类,即使用abstract修饰的类
- 特点:
1. 抽象类不能被实例化,只能被继承
2. 抽象类中可以不包含抽象方法(不包含抽象方法就没有太大意义,可以作为工具类防止被实例化)
3. 抽象类的子类可以不实现所有的抽象方法,但必须也为抽象类
4. 抽象类的构造方法不能定义成私有
5. 抽象类不能被final修饰,因为final修饰的类不能被继承
6. 抽象方法必须为public或者protected(如果为 private则不能被子类继承,子类便无法实现该方法),缺省的情况下默认为public。
接口
- 接口:一种特殊的抽象类
- 特点:
1. 接口中没有构造器,不能被实例化
2. 接口只能继承接口,不能继承类,接口支持多继承
3. 接口中定义的成员变量,默认为是public static final 修饰的静态变量
4. 接口中定义的方法,默认是public static 修饰的静态内部类
5. 接口中定义的方法,默认是public abstract修饰的抽象方法,在JDK8中,接口也可以定义静态方法,不能通过实现类的对象来直接调用,可以直接使用接口名进行调用
6. 如果实现类所实现的多个接口中的抽象方法存在重复,没关系
7. 如果实现类所实现的多个接口中的默认方法存在重复,则子接口必须进行默认方法的覆盖重写
接口和抽象类的异同点
- 语法层面
1. 相同点:
1. 抽象类和接口都不能被实例化
2. 抽象类和接口都可以定义抽象方法,子类(可以不用实现,则子类也是抽象类)/实现类必须复写这些抽象方法
2. 不同点
1. 抽象类有构造方法,接口没有
2. 抽象类中的成员变量可以是各种类型的,接口中的成员变量只能是public static final 类型的
3. 抽象类可以包含普通方法,接口中只能是public abstract修饰抽象方法
4. 抽象类只能是单继承,接口可以多继承 - 设计层面
抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象,例如可以将飞机和鸟定义为不同的抽象类,但是可以将飞定义为一个接口。
参考资料https://blog.csdn.net/qq_37766026/article/details/90702387