Skip to content

[!quote] 接口的组成更新 Java 8 之前,接口中只有常量抽象方法Java 8 之后,接口中加入了默认方法静态方法Java 9 之后,接口中加入了私有方法

❤️ 接口中的默认方法

[!quote] 接口中的默认方法 public default ……

  • 默认方法中可以有方法体
  • 接口中的默认方法不会让实现类去强制重写,而且就算实现类不重写,被 new 出来的实现类也可以调用接口的默认方法
  • 当一个实现类实现了多个接口,且这多个接口中有同名的默认方法时,那么在实现类中也必须重写该默认方法
java
public 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 接口,mitfImp1mitfImp2 都实现了它,现在要求要在 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() 功能的类则不管

    java
    public interface MyInterface {  
    	void show1();
    	void show2();
      
    	public default void show3() {  
    		System.out.println("show3");  
    	}  
    }
    java
    public 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");
    	}
    }
    java
    public 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");  
	}  
}