天天看點

Java 8中Interface的default方法和static方法

  1. 從java 8開始接口可以具有default方法。
  2. 從java 8開始接口可以具有static方法,類似于類的靜态方法。
  3. 引入了static方法以提供舊接口的向後相容性,以便它們可以擁有新方法而不影響現有代碼

在Java 8之前,接口隻能有抽象方法。 必須在單獨的類中提供這些方法的實作。 是以,如果要在接口中添加新方法,則必須在實作相同接口的類中提供其實作代碼。 為了解決這個問題,Java 8引入了default方法的概念,它允許接口具有實作方法,而不會影響實作接口的類。

// 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      

 引入了default方法以提供向後相容性,以便現有的接口可以使用lambda表達式而無需實作實作類中的方法。 預設方法也稱為防禦方法或虛拟擴充方法。

Static方法:

接口也可以有static方法,類似于類的static方法。

// 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      

static方法和多重繼承 :

如果兩個實作的接口都包含具有相同方法簽名的deafult方法,則實作類應明确指定要使用的預設方法,或者它應覆寫預設方法。 

// 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