[!quote] 接口的组成更新 Java 8 之前,接口中只有常量和抽象方法Java 8 之后,接口中加入了默认方法和静态方法Java 9 之后,接口中加入了私有方法
❤️ 接口中的默认方法
[!quote] 接口中的默认方法
public default ……
- 默认方法中可以有方法体
- 接口中的默认方法不会让实现类去强制重写,而且就算实现类不重写,被 new 出来的实现类也可以调用接口的默认方法
- 当一个实现类实现了多个接口,且这多个接口中有同名的默认方法时,那么在实现类中也必须重写该默认方法
javapublic class mitfImp1 implements MyInterface1, MyInterface2 { public void show3() { // 此处实现MyInterface1的show3方法 MyInterface1.super.show3(); } } psvm { mitfImp1 m1 = new mitfImp1(); m1.show3(); } --- 我是1接口中的默认方法
[!hint] 接口的默认方法 和 抽象类的普通方法 很像,我要怎么区分呢 ?
- 【接口的默认方法的目的】 :在不破坏现有实现的情况下,向接口添加新方法,而不是定义一个有方法体的方法,让子类去拥有,也就是说不到万不得已不使用,尽量还是保持接口是抽象的,是一种规范,没有方法体
- 【抽象类的普通方法】 :抽象类的普通方法就是定义一个子类都共用的方法,比接口的默认方法的好处就是,抽象类可以实例化,也可以定义状态
作用
让你更加灵活地在接口中加入新的方法,而不破坏现有代码
可以减少代码量【
比如牛类,羊类,马类都实现了动物接口。但是它们的 eat() 方法都是吃草。那我没有使用默认方法时,我要在三个类里都实现 eat() 方法并且写上相同的内容;使用默认方法后,这三个类中就不需要重写 eat() 方法了】
举例
比如,有一个 MyInterface 接口,mitfImp1 和 mitfImp2 都实现了它,现在要求要在 mitfImp1 中加入一个 show3() 方法,在 mitfImp2 中不加入
不使用默认方法
- 方法 1 :你需要新建一个 MyInterfaceSon 接口来继承 MyInterface 接口,然后创建 show3() 方法,再让 mitfImp1 类从 MyInterface 接口转到实现 MyInterfaceSon 接口
java
public interface MyInterface {
void show1();
void show2();
}java
public interface MyInterfaceSon extends MyInterface{
void show3();
}java
public class mitfImp1 implements MyInterfaceSon{
public void show1() {
System.out.println("111show1");
}
public void show2() {
System.out.println("111show2");
}
public void show3() {
System.out.println("111show3");
}
}java
public class mitfImp2 implements MyInterface {
public void show1() {
System.out.println("222show1");
}
public void show2() {
System.out.println("222show2");
}
}- 方法 2 :或者你在 MyInterface 接口中直接加入 show3() 方法,然后在所有实现过它的实现类里面重写,
很麻烦很麻烦
java
public interface MyInterface {
void show1();
void show2();
void show3();
}java
public class mitfImp1 implements MyInterfaceSon{
public void show1() {
System.out.println("111show1");
}
public void show2() {
System.out.println("111show2");
}
public void show3() {
System.out.println("111show3");
}
}java
public class mitfImp2 implements MyInterface {
public void show1() {
System.out.println("222show1");
}
public void show2() {
System.out.println("222show2");
}
public void show3(){}
}使用默认方法
你只需要在 MyInterface 里加入默认方法 show3(),再在要实现 show3() 功能的实现类里重写即可,不需要 show3() 功能的类则不管
javapublic interface MyInterface { void show1(); void show2(); public default void show3() { System.out.println("show3"); } }javapublic class mitfImp1 implements MyInterface{ public void show1() { System.out.println("111show1"); } public void show2() { System.out.println("111show2"); } public void show3() { System.out.println("111show3"); } }javapublic class mitfImp2 implements MyInterface { public void show1() { System.out.println("222show1"); } public void show2() { System.out.println("222show2"); } }
❤️ 接口中的静态方法
[!quote] 接口中的静态方法
public static ……
[!hint] 使得代码更加简洁,增加可读性,易于管理 比如我在测试类中需要到 MyInterface 中的 show 方法:
- 在 show() 方法不是静态方法时,我需要先创建一个实现类 Impl,然后通过 Impl 来调用 show 方法,
可是我只是需要 show() 方法而已,我不需要 Impl 类啊,这样就使得代码变得复杂了,可读性也降低了- 在 show() 方法是静态方法时,我只需要 MyInterface.show() 即可,不需要创建一个没有用的 Impl 类
+ 静态方法只能通过接口名调用,不能通过实现类名调用,~~所以与默认方法不同,就算有一个实现类同时实现了两个接口,且这两个接口有同名的静态方法,也不会强制重写~~
java
public interface MyInterface1 {
public static void show4(){
System.out.println("我是1接口中的静态方法");
}
}
public interface MyInterface2 {
public static void show4(){
System.out.println("我是2接口中的静态方法");
}
}
public class mitfImp1 implements MyInterface1,MyInterface2 { }
psvm {
MyInterface1.show4(); //遥控器是MyInterface1,而不是mitfImp1
MyInterface2.show4();
}
---
我是1接口中的静态方法
我是2接口中的静态方法❤️ 接口中的私有方法
[!quote] 接口中的私有方法
private ……,private static ……
[!hint]+ 减少接口中代码的重复性
java// 在不使用接口中的私有方法时 public interface MyInterface1 { default void show1(){ System.out.print("我是show1:"); System.out.print("hello"); System.out.print("world"); System.out.print("java"); } default void show2(){ System.out.print("我是show2:"); System.out.print("hello"); System.out.print("world"); System.out.print("java"); } }java// 使用接口中的私有方法时 public interface MyInterface1 { default void show1() { System.out.print("我是show1:"); show(); } default void show2() { System.out.print("我是show2:"); show(); } private void show() { System.out.print("hello"); System.out.print("world"); System.out.print("java"); } }