1. Java 接口可以包含的内容
-
Java 7
- 常量
- 抽象方法
- 必须用
public abstract
修饰,例如public abstract void func();
- 可以省略修饰,默认添加
public abstract
- 必须用
-
Java 8
- 默认方法
public default 返回值类型 函数(参数列表){//可以有方法体}
一般用于接口升级 - 静态方法
- 默认方法
-
Java 9
-
私有方法
解决默认方法重复调用问题,抽取出公共操作
默认私有方法和静态私有方法
-
2. 接口的抽象方法
-
在任何版本的Java中,接口都能定义抽象方法
public interface MyInterface { // 定义一个抽象方法 // [public] [abstract] 返回值类型 方法名(参数列表); public abstract void methodAbs(); }
-
抽象方法的使用
-
接口不能直接使用,必须有一个"实现类"来"实现"该接口
public class 实现类名称 implements 接口名称{ // ... }
-
接口的实现类必须覆盖重写(override)接口中所有的抽象方法
-
创建实现类的对象进行使用
public interface MyInterface { public abstract void methodAbs(); } // ----------------------------------------------------------------- public class MyInterfaceImpl implements MyInterface{ @Override public void methodAbs() { System.out.println("这是抽象方法"); } } // ----------------------------------------------------------------- public class main { public static void main(String[] args) { MyInterface obj = new MyIntermaceImpl(); obj.methodAbs(); // 这是抽象方法 } }
如果实现类并没有重写接口中所有的抽象方法,那么这个实现类必须是抽象类
-
3. 接口的默认方法
public interface MyInterfaceDefault {
/*
* 从Java 8开始,接口可以定义默认方法:
* [public] default 返回值类型 方法名(参数列表){
* // 方法体
* }
* 【注】接口中的默认方法,可以解决接口升级问题,因为接口添加默认方法时原实现类不用修改
*/
public default void methodDefaultA(){
System.out.println("这是默认方法A...");
}
public default void methodDefaultB(){
System.out.println("这是默认方法B...");
}
public abstract void methodAbs();
}
// -------------------------------------------------------------
public class MyInterfaceImpl implements MyInterfaceDefault{
@Override
public void methodAbs() {
System.out.println("这是一个抽象方法...");
}
@Override
public void methodDefaultB() {
System.out.println("这是重写的默认方法B...");
}
}
// ------------------------------------------------------------
public class main {
public static void main(String[] args) {
MyInterfaceImpl obj = new MyInterfaceImpl();
obj.methodAbs(); // 这是一个抽象方法...
obj.methodDefaultA(); // 这是默认方法A...
obj.methodDefaultB(); // 这是重写的默认方法B...
}
}
接口的默认方法,可以通过接口类实现对象直接调用
接口的默认方法,也可以被接口实现类override重写
4. 接口的静态方法
public interface MyInterfaceStatic {
/*
* 从Java 8 开始,接口当中允许定义静态方法
* [public] static 返回值类型 方法名(参数列表){
* // 方法体
* }
*/
public static void methodStatic(){
System.out.println("这是一个静态方法...");
}
}
// --------------------------------------------------------
public class main {
public static void main(String[] args) {
// MyInterfaceImpl obj = new MyInterfaceImpl();
// obj.methodStatic(); // 报错,不能通过接口实现类的对象调用接口中的静态方法
// 通过接口名称直接调用静态方法
MyInterfaceStatic.methodStatic(); // 这是一个静态方法...
}
}
5. 接口的私有方法
从 Java 9 开始,接口中允许定义私有方法,包括:
-
普通私有方法,解决多个默认方法之间重复代码问题
private 返回值类型 方法名称(参数列表){ // 方法体 }
-
静态私有方法,解决多个静态方法之间重复代码问题
private static 返回值类型 方法名称(参数列表){ // 方法体 }
【示例】
public interface MyInterfacePrivate {
public default void methodDefault() {
methodCommon();
System.out.println("这是默认方法...");
}
public static void methodStatic() {
methodCommonStatic();
System.out.println("这是静态方法...");
}
private void methodCommon() {
System.out.println("这是一个默认公用方法...");
}
private static void methodCommonStatic() {
System.out.println("这是一个默认静态方法");
}
}
// -------------------------------------------------------------
public class MyInterfaceImpl implements MyInterfacePrivate{
}
// -------------------------------------------------------------
public class main {
public static void main(String[] args) {
MyInterfaceImpl obj = new MyInterfaceImpl();
obj.methodDefault(); // 这是一个默认公用方法...
// 这是默认方法...
MyInterfacePrivate.methodStatic(); // 这是一个默认静态方法
// 这是静态方法...
}
}
6. 接口中的常量
-
接口中的成员变量只能是常量,用
public static final
修饰[public] [static] [final] int num = 10;
【示例】
public interface MyInterfaceConst {
public static final int NUM_OF_MY_CLASS = 10;
}
// -----------------------------------------------------------
public class main {
public static void main(String[] args) {
System.out.println(MyInterfaceConst.NUM_OF_MY_CLASS); // 10
}
}
7. Tips
- 接口中不能有静态代码块和构造方法
- 一个类只可以继承一个父类,但是可以同时实现多个接口
- 如果所实现的多个接口中,存在重复的抽象方法,只需override一次即可;若实现类是抽象类,则可以不用重写
- 如果实现类没有重写所有抽象方法,则实现类必须是抽象类
- 如果实现的多个接口中,有重复的默认方法,此时必须要重写,消除二义性,即使实现类是抽象类,也要重写
- 一个类,如果其直接父类方法和接口中默认方法冲突,优先使用父类中方法