Java 中的變數不遵循多型和重寫


在面向物件程式設計 (OOP) 的世界中,多型和重寫是賦予程式語言靈活性和動態性的關鍵概念。Java 作為一種強大的 OOP 語言,完全支援這些特性。但是,必須理解的是,這些特性適用於 Java 中的方法,而不適用於變數。在本文中,我們將探討為什麼 Java 中的變數不遵循多型和重寫,從而更深入地瞭解 Java 的變數行為。

Java 中的多型

多型,一個希臘詞,意思是“多種形式”,是 OOP 的一個基本概念。它允許不同型別的物件被視為公共超型別的物件,從而可以編寫更靈活和可重用的程式碼。在 Java 中,多型是透過繼承、介面和方法重寫來實現的。

示例

讓我們來看一個例子

class Animal {
   void sound() {
     System.out.println("The animal makes a sound");
   }
}
class Cat extends Animal {
   @Override
   void sound() {
      System.out.println("The cat meows");
   }
}
public class Main {
   public static void main(String[] args) {
      Animal myAnimal = new Cat();
      myAnimal.sound();
   }
}

輸出

The cat meows

在這種情況下,myAnimal 是一個指向 Cat 物件的 Animal 引用變數。當在 myAnimal 上呼叫 sound() 方法時,將呼叫 Cat 類中的版本,而不是 Animal 類中的版本。這就是多型的體現,其中呼叫的方法是由實際的物件型別而不是引用型別決定的。

Java 中的重寫

方法重寫是 Java 中多型的一種特定形式,其中子類提供對在其超類中已定義的方法的特定實現。子類中的方法必須與超類中的方法具有相同的名稱、返回型別和引數。

為什麼變數不遵循多型和重寫?

與方法不同,Java 中的變數不遵循多型和重寫的概念。這種差異源於方法和變數在物件中存在和操作方式的基本差異。

在 Java 中,例項變數屬於類的例項,這意味著每個例項都有其自己的例項變數副本。因此,更改一個物件中的例項變數的值不會影響同一類的其他物件。

另一方面,方法屬於類本身,而不屬於任何特定例項。這意味著與變數不同,方法對於類的每個物件都沒有單獨的副本。

示例

讓我們重新審視前面的示例,這次新增例項變數

class Animal {
   String sound = "The animal makes a sound";
   void makeSound() {
      System.out.println(sound);
   }
}
class Cat extends Animal {
   String sound = "The cat meows";
   @Override
   void makeSound() {
      System.out.println(sound);
   }
}
public class Main {
   public static void main(String[] args) {
      Animal myAnimal = new Cat();
      myAnimal.makeSound();
      System.out.println(myAnimal.sound);
   }
}

輸出

The cat meows
The animal makes a sound

在此程式碼中,myAnimal 是一個指向 Cat 物件的 Animal 引用。對 myAnimal 呼叫 makeSound() 方法將列印“貓叫”,但是 System.out.println(myAnimal.sound) 行將列印“動物發出聲音”。為什麼會這樣?因為方法遵循多型性,所以執行 Cat 類中的 makeSound() 方法。但是,由於變數不遵循多型性,所以使用了 Animal 類中的 `sound` 變數。

這種行為是由於稱為變數隱藏的原理造成的。如果子類中的變數與超類中的變數同名,則子類變數將隱藏超類變數。

這並不意味著超類變數已被重寫。這兩個變數仍然獨立存在,使用哪個變數取決於引用型別,而不是實際的物件型別。這就是為什麼當我們透過 Animal 引用訪問 sound 變數時,我們得到的是 Animal 類中的 sound 值,而不是 Cat 類中的 sound 值。

變數重寫與變數隱藏

在 Java 中,變數不像方法那樣可以重寫。相反,它們遵循變數隱藏的原則。變數隱藏和方法重寫從根本上是不同的。

  • 方法重寫 - 在重寫中,子類為在其超類中已定義的方法提供不同的實現。呼叫哪個方法的決定基於實際物件的型別,而不是引用型別,這允許多型。

  • 變數隱藏 - 在變數隱藏中,如果子類中的變數與超類中的變數同名,則子類變數將隱藏超類變數。使用哪個變數的決定基於引用型別,而不是實際物件的型別。

這些原則源於這樣一個事實:方法是行為表示,而變量表示狀態。行為可以是多型的和可重寫的,允許不同型別的物件表現出不同的行為。相反,由變量表示的狀態屬於特定例項,而不是多型的。

結論

總而言之,瞭解為什麼 Java 中的變數不遵循多型和重寫,可以深入瞭解 Java 的工作原理。對於 Java 程式設計師來說,掌握這方面的知識對於避免在使用繼承和多型時出現誤解和錯誤至關重要。

更新於:2023年7月19日

瀏覽量:576

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.