考慮一個場景,我們創建一個名為 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 類別有兩個方法:
而 Employee 類別有一個名為 getEmployeeInformation() 的附加方法,並覆寫 getUserSalary() 方法。
然後用 User user = new Employee();:
user.getUserName() 將會起作用,因為它是在 User 類別中定義的。
user.getUserSalary() 也可以工作,但輸出將來自 Employee 類別中重寫的 getUserSalary() 方法,而不是來自 User 中的方法。這就是多態的本質。
user.getEmployeeInformation() 將無法運作。它將引發編譯錯誤,因為它特定於 Employee 類別。
當編譯器發現語法錯誤、類型不符或其他妨礙程式碼成功編譯的違規問題時,就會發生編譯錯誤。
如果我們嘗試執行相反的操作並使用超類別引用 User 引用子類別物件 Employee,則如果沒有手動轉換,它將無法運作!這需要明確轉換,因為 User 不一定是 Employee。
透過一個簡單的例子簡單地解釋了這一點之後,讓我們專注於術語。
「超類別對子類別物件的引用」通常稱為向上轉型。簡單地說,向上轉換是將子物件類型轉換為父對象,並且它是隱式發生的(意味著編譯器會自動處理它,因此我們不需要任何特定的轉換語法)。就像我們執行 User user = new Employee();. 時一樣
向下轉型怎麼樣?
向下轉型與向轉型完全相反。還記得我們說過從 User 實例建立
Employee 引用是無效的嗎?這稱為 downcasting,並且必須使用強制轉換語法明確完成。雖然向上轉型非常安全,但 向下轉型 會帶來風險。這並不意味著它沒有用,但必須謹慎使用。
由於本文主要討論向上轉型,所以我不會過多討論向下轉型的細節,但重點是展示向下轉型和向上轉型之間的主要區別。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3