接口
定义:接口就是一种公共的规范标准,只要符合规范,大家可以通用,意义在于制定规范和做功能的拓展
特点
- 接口使用关键字interface 修饰
- 类实现接口用implements表示
- 接口不能实例化
- 实现接口必须实现接口中的所有抽象方法,除非这个类是抽象类
成员特点
- 成员变量 :只能是常量
- 构造方法: 没有
- 成员方法:只能是抽象方法
JDK8以后接口又新加了一些新方法 - 默认方法 为了解决接口升级问题
public default void show3() {
}
默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字
public可以省略,default不能省略
如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写
- 静态方法
public static void show() {
}
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
public可以省略,static不能省略
- 私有方法
产生原因
Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性
private static void method() { //static可以省略
}
默认方法可以调用私有的静态方法和非静态方法
静态方法只能调用私有的静态方法
抽象类
概述
抽象类的出现,是因为在做子类共性内容抽取的时候,发现有些内容在父类中并没有具体的实现,就需要无方法体的抽象方法
特点
- 抽象类中不一定有抽象方法,由抽象方法的类一定是抽象类
- 抽象类不能实例化(关键字为abstract)
- 抽象类可以有构造方法
- 抽象类的子类 要么重写抽象类中的所有方法,要么是抽象类
相同点
- 都不能被实例化
- 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点
- 接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
- 实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
- 接口强调特定功能的实现,而抽象类强调所属关系。
- 接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。