Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - 介面中的預設方法



Java 預設方法

Java 在 Java 8 中的 介面 中引入了預設方法實現的新概念。在 Java 8 之前,介面只能有 抽象方法。新增預設方法功能是為了向後相容,以便舊介面可以利用 Java 8 的 lambda 表示式 功能。

例如,ListCollection 介面沒有 'forEach' 方法宣告。因此,新增此方法將簡單地破壞集合框架的實現。Java 8 引入了預設方法,以便 List/Collection 介面可以具有 forEach 方法的預設實現,而實現這些介面的類無需實現相同的。

語法

以下是 Java 中介面中預設方法的語法:

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

Java 預設方法示例

package com.tutorialspoint;

interface vehicle {
   // default method must have an implementation
   default void print() {
      System.out.println("I am a vehicle!");
   }
}

// implementing class needs not to implement the default method
// of an interface.
public class Tester implements vehicle {
   public static void main(String args[]) {
      Tester tester = new Tester();
      // implementing class can access the default method as its own method
      tester.print(); 
   }
}

讓我們編譯並執行上述程式,這將產生以下結果:

I am a vehicle!

多重繼承中的預設方法

使用介面中的預設函式,有可能一個類實現了兩個具有相同預設方法的介面。以下程式碼解釋瞭如何解決這種歧義。

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

public interface fourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

第一個解決方案是建立一個覆蓋預設實現的自己的方法。

public class car implements vehicle, fourWheeler {

   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

示例:使用自己的實現覆蓋介面的預設方法

在此示例中,我們建立了兩個具有相同預設方法 print() 的介面。由於 Car 類實現了這兩個介面,因此它必須重寫預設方法,否則編譯器將抱怨重複的預設方法。在使用自己的實現重寫預設方法後,我們可以輕鬆地使用 Car 類的 print 方法,如下所示

package com.tutorialspoint;

interface Vehicle {
   default void print() {
      System.out.println("I am a vehicle!");
   }
}

interface FourWheeler {
   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {
   // overriding the default method will resolve the ambiguity
   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

public class Tester {
   public static void main(String args[]) {
      Car car = new Car();
      car.print(); 
   }
}

讓我們編譯並執行上述程式,這將產生以下結果:

I am a four wheeler car vehicle!

第二個解決方案是使用 super 呼叫指定介面的預設方法。

public class car implements vehicle, fourWheeler {

   public void print() {
      vehicle.super.print();
   }
}

示例:呼叫介面的預設方法

在此示例中,我們建立了兩個具有相同預設方法 print() 的介面。由於 Car 類實現了這兩個介面,因此它必須重寫預設方法,否則編譯器將抱怨重複的預設方法。在使用自己的實現重寫預設方法後,我們可以輕鬆地使用 Car 類的 print 方法,如下所示

package com.tutorialspoint;

interface Vehicle {
   default void print() {
      System.out.println("I am a vehicle!");
   }
}

interface FourWheeler {
   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {
   // use the default method of a interface
   public void print() {
      FourWheeler.super.print();
   }
}

public class Tester {
   public static void main(String args[]) {
      Car car = new Car();
      car.print(); 
   }
}

讓我們編譯並執行上述程式,這將產生以下結果:

I am a four wheeler!

Java 中的靜態預設方法

從 Java 8 開始,介面也可以具有靜態預設方法。這些靜態方法充當幫助器或實用程式函式,有助於更好地封裝程式碼。

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

示例:呼叫介面的靜態預設方法

在此示例中,我們建立了兩個具有相同預設方法 print() 的介面。由於 Car 類實現了這兩個介面,因此它必須重寫預設方法。在重寫預設方法並呼叫介面實現後,我們直接呼叫了靜態方法,如下所示

package com.tutorialspoint;

interface Vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

interface FourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {

   public void print() {
      // call the Vehicle interface default print method   
      Vehicle.super.print();
      FourWheeler.super.print();
	  // call the Vehicle interface static blowHorn method  
      Vehicle.blowHorn();
      System.out.println("I am a car!");
   }
}
public class Tester {

   public static void main(String args[]) {
      Vehicle vehicle = new Car();
      vehicle.print();
      // call the Vehicle interface static blowHorn method 
	  Vehicle.blowHorn();
   }
}

讓我們編譯並執行上述程式,這將產生以下結果:

I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!
Blowing horn!!!
廣告