- 從java 8開始接口可以具有default方法。
- 從java 8開始接口可以具有static方法,類似于類的靜态方法。
- 引入了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