JavaRush /Java Blog /Random-TW /介面中的預設方法

介面中的預設方法

在 Random-TW 群組發布
Java 的每個新版本都與先前的版本不同。以下是我們介紹的材料中的更改範例: 在 Java 5 之前,該enum語言中沒有 '。
介面中的預設方法 - 1
同樣,Java 8 與 Java 7 也有明顯不同。我們的大部分講座都是用該語言的第 7 版編寫的,但是,我們當然不會忽略重要的創新。由於我們在本次講座中討論的是接口,因此讓我們看一下接口中的一個更新 - 預設方法。您已經知道介面不實作. 它的任務是描述實現它的所有物件應該具有什麼行為。但開發人員經常遇到這樣的情況:所有類別中方法的實作都是相同的。讓我們來看看舊車的例子:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
您認為這段程式碼的主要問題是什麼?您可能注意到我們寫了一堆相同的程式碼!這個問題在程式設計中很常見,應該避免。另一件事是,在 Java 8 發布之前,沒有特殊的解決方案選項。當這個版本發佈時,可以定義預設方法並在介面內實作它們!其操作方法如下:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
現在,對於所有機器都相同的方法gas()brake()已包含在介面中,並且不需要重複的程式碼。而且,每個類別中都提供了這些方法!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
如果有 100 個類別都有一個方法gas(),但其中只有 99 個具有相同的行為怎麼辦?這會毀了一切,預設方法在這種情況下不起作用?當然不是:) 介面的預設方法可以被覆寫。
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
所有其他 99 種類型的機器都將實現預設方法,並且該類別UnusualCar(例外)不會破壞整體情況,並將冷靜地確定其行為。介面中的多重繼承 如您所知,Java 中不存在多重繼承。造成這種情況的原因有很多;我們將在單獨的講座中詳細討論它們。在其他語言中,例如在 C++ 中,情況正好相反。如果沒有多重繼承,就會出現一個嚴重的問題:同一個物件可以有許多不同的特徵和「行為」。生活中的例子:對父母來說我們是孩子,對老師來說我們是學生,對醫生來說我們是病人。在生活中,我們扮演不同的角色,相應地表現也不同:我們與老師的交談顯然不同於與親密朋友的交談。讓我們嘗試將這種情況轉化為程式碼。假設我們有兩個類別:Pond 和 Aviary。對於池塘來說,你需要游泳的鳥,而對於鳥舍來說,你需要飛翔的鳥。為此,我們創建了兩個基類 -FlyingBirdWaterfowl
public class Waterfowl {
}

public class FlyingBird {
}
因此,我們將把類別繼承於 的鳥送到鳥舍FlyingBird,並將繼承自 的鳥送到池塘Waterfowl。一切看起來都很簡單。但是如果我們需要在某個地方辨識鴨子,我們該怎麼辦呢?她既會游泳又會飛。但我們沒有多重繼承。幸運的是,Java 提供了多種介面實作。如果一個類別不能從多個父類別繼承,那麼實作多個介面就很容易了!我們的鴨子既可以飛也可以游泳:)使用接口FlyingBird而不是Waterfowl類就足以達到預期的結果。
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
因此,我們的程式保留了靈活的類別管理,並且結合預設方法的實現,我們定義物件行為的能力幾乎變得無限!:)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION