首頁  >  文章  >  Java  >  使用子類別物件的超類別引用

使用子類別物件的超類別引用

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-12 06:08:02603瀏覽

Using a Superclass Reference for a Subclass Object

考慮一個場景,我們建立一個名為 User 的類,然後建立一個擴充 User 的子類,名為 Employee
通常,我們使用以下命令建立 User 的實例:

User user = new User();

這裡User是變數user的型別,user是儲存類別實例的變數,new User()建立了一個新的User實例。
簡單來說,使用者就是 User 的一個實例。


但是如果超類別User需要使用其子類別Employee中定義的方法怎麼辦?這會發生嗎?
簡短的答案是,但僅適用於重寫方法(超類別和子類別中都存在的方法)。這就是實現多態性的原因。
由於繼承中的關係是「is-a」關係,Employee is-a User。因此,只要它是相容型,就沒有什麼可以阻止 User 持有對其子類別 Employee 實例的參考。

如下完成:

User user = new Employee();

現在,假設 User 類別有兩個方法:

  1. getUserName()
  2. getUserSalary().

而 Employee 類別還有一個名為 getEmployeeInformation() 的附加方法,並重寫了 getUserSalary() 方法。

然後使用 User user = new Employee();:

  1. user.getUserName() 將會起作用,因為它是在 User 類別中定義的。

  2. user.getUserSalary() 也可以工作,但輸出將來自 Employee 類別中重寫的 getUserSalary() 方法,而不是來自 User 中的方法。這就是多態性的本質。

  3. user.getEmployeeInformation() 將無法運作。它將引發編譯錯誤,因為它特定於 Employee 類別。

當編譯器發現語法錯誤、類型不符或其他妨礙程式碼成功編譯的違規問題時,就會發生編譯錯誤。

如果我們嘗試執行相反的操作並使用超類引用 User 來引用子類物件 Employee,那麼如果沒有手動轉換,它將無法工作!這需要明確轉換,因為 User 不一定是 Employee


向上轉型VS。貶低

用簡單的方式解釋了這一點,用一個簡單的例子,讓我們專注於術語。

「超類別對子類別物件的引用」通常稱為向上轉換。簡而言之,向上轉換是將子物件類型轉換為父對象,並且它隱式發生意味著編譯器會自動處理它,因此我們不需要任何特定的轉換語法)。就像我們執行 User user = new Employee();.

向下轉型怎麼樣?

向下轉型與向轉型完全相反。

還記得我們說過從 User 實例建立 Employee 引用是無效的嗎?這稱為向下轉型,並且必須使用強制轉換語法明確完成。雖然向上轉型非常安全,但向下轉型會帶來風險。這並不意味著它沒有用,但必須謹慎使用。

由於本文主要討論向上轉型,所以我不會過多介紹向下轉型的細節,但重點是展示向下轉型和向上轉型之間的主要區別。


這是一個包裝! :)

以上是使用子類別物件的超類別引用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn