Java 的每個新版本都與先前的版本不同。以下是我們介紹的材料中的更改範例: 在 Java 5 之前,該
同樣,Java 8 與 Java 7 也有明顯不同。我們的大部分講座都是用該語言的第 7 版編寫的,但是,我們當然不會忽略重要的創新。由於我們在本次講座中討論的是接口,因此讓我們看一下接口中的一個更新 - 預設方法。您已經知道介面不實作. 它的任務是描述實現它的所有物件應該具有什麼行為。但開發人員經常遇到這樣的情況:所有類別中方法的實作都是相同的。讓我們來看看舊車的例子:
enum
語言中沒有 '。
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。對於池塘來說,你需要游泳的鳥,而對於鳥舍來說,你需要飛翔的鳥。為此,我們創建了兩個基類 -FlyingBird
和Waterfowl
。
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("Плывем!");
}
}
因此,我們的程式保留了靈活的類別管理,並且結合預設方法的實現,我們定義物件行為的能力幾乎變得無限!:)
GO TO FULL VERSION