在 Java 8 之前,接口只能有抽象方法。这些方法的实现必须在单独的类中提供。因此,如果要在接口中添加新方法,则必须在实现同一接口的类中提供其实现代码。为了克服这个问题,Java 8 引入了默认方法(default method)的概念,该方法允许接口具有实现的方法,而不会影响实现接口的类。

// A simple program to Test Interface default 
// methods in java 
interface TestInterface 
{ 
	// abstract method 
	public void square(int a); 

	// default method 
	default void show() 
	{ 
	System.out.println("Default Method Executed"); 
	} 
} 

class TestClass implements TestInterface 
{ 
	// implementation of square abstract method 
	public void square(int a) 
	{ 
		System.out.println(a*a); 
	} 

	public static void main(String args[]) 
	{ 
		TestClass d = new TestClass(); 
		d.square(4); 

		// default method executed 
		d.show(); 
	} 
} 

输出:

16
 Default Method Executed

引入了默认方法以提供向后兼容性,以便现有 interinface 可以使用 lambda 表达式,而无需在实现类中实现方法。默认方法也称为防御方法(defender methods)或虚拟扩展方法(virtual extension methods.)。

 

静态方法(static method):
接口也可以具有静态方法,这与类的静态方法类似。

// A simple Java program to TestClassnstrate static 
// methods in java 
interface TestInterface 
{ 
	// abstract method 
	public void square (int a); 

	// static method 
	static void show() 
	{ 
		System.out.println("Static Method Executed"); 
	} 
} 

class TestClass implements TestInterface 
{ 
	// Implementation of square abstract method 
	public void square (int a) 
	{ 
		System.out.println(a*a); 
	} 

	public static void main(String args[]) 
	{ 
		TestClass d = new TestClass(); 
		d.square(4); 

		// Static method executed 
		TestInterface.show(); 
	} 
} 

输出:

16
 Static Method Executed

 

默认方法和多重继承(Default Methods and Multiple Inheritance
如果实现的接口都包含具有相同方法的 default Methods, 则实现类应显式指定要使用哪个默认方法,或者应重写默认方法。

// A simple Java program to demonstrate multiple 
// inheritance through default methods. 
interface TestInterface1 
{ 
	// default method 
	default void show() 
	{ 
		System.out.println("Default TestInterface1"); 
	} 
} 

interface TestInterface2 
{ 
	// Default method 
	default void show() 
	{ 
		System.out.println("Default TestInterface2"); 
	} 
} 

// Implementation class code 
class TestClass implements TestInterface1, TestInterface2 
{ 
	// Overriding default show method 
	public void show() 
	{ 
		// use super keyword to call the show 
		// method of TestInterface1 interface 
		TestInterface1.super.show(); 

		// use super keyword to call the show 
		// method of TestInterface2 interface 
		TestInterface2.super.show(); 
	} 

	public static void main(String args[]) 
	{ 
		TestClass d = new TestClass(); 
		d.show(); 
	} 
} 

输出:

Default TestInterface1
Default TestInterface2

 

要点:

  • 从 java 8 开始,接口可以具有实现的默认方法。
  • 接口可以具有静态方法,也可以类似于类的静态方法。
  • 引入了默认方法,为旧接口提供向后兼容性,以便它们可以添加新方法的时候而不影响现有代码。

发表评论