首頁 >Java >java教程 >Java中的變數不遵循多型和重寫

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

王林
王林轉載
2023-09-09 18:13:021186瀏覽

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() 方法呼叫將列印“The cat meows”,但 System.out.println(myAnimal.sound) 行將列印“The Animalmakes a sound”。為什麼會出現這種情況?由於方法遵循多態性,因此會執行 Cat 類別中的 makeSound() 方法。但是,由於變數不遵循多態性,因此使用 Animal 類別中的「聲音變數」

此行為是由於變數隱藏原理造成的。如果子類別中的變數與其超類別中的變數同名,則子類別變數隱藏超類別變數

這並不表示超類別變數已被覆寫。這兩個變數仍然獨立存在,並且使用的變數由引用類型決定,而不是由實際物件類型決定。這就是為什麼當我們透過 Animal 引用存取聲音變數時,我們從 Animal 類別而不是 Cat 類別獲取聲音值。

變數覆蓋與變數隱藏

在 Java 中,變數不受方法之類的重寫的影響。相反,它們遵循變數隱藏的原則。變數隱藏和方法重寫有根本的差異:

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

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

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

結論

總而言之,理解為什麼 Java 中的變數不遵循多態性和重寫可以為了解 Java 的工作原理提供重要的見解。這些知識對於 Java 程式設計師在使用繼承和多態性時避免誤解和錯誤至關重要

以上是Java中的變數不遵循多型和重寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除

相關文章

看更多