摘要:但有時候,當我們的代碼只需要與父類打交道時,可以使用向上轉型,來使我們的代碼不依賴具體子類,比如以下代碼,方法可以接受類的任意子類內存分析我們來分析以下轉型代碼在內存中的表示
學習設計模式的時候,發現很多模式都用到了向上轉型(eg. 工廠方法)。而我對向上轉型(upcasting)的機制并不十分熟悉。這篇文章將深入分析向上轉型的機制、內存分析。
概念先從幾個基本概念開始:
1. Java中的引用類型(reference type)Java中的數據類型分為兩類:基本數據類型(int, double)和引用類型(String)。引用類型對象中保存著一個地址(稱為“引用”),引用指向實際對象(稱為“實例”),實際對象中保存著值。
關于Java數據類型在內存中的分析詳解,請參考知友Intopass的解答:
Java 到底是值傳遞還是引用傳遞? - Intopass的回答 - 知乎2. 內存分配
https://www.zhihu.com/questio...
Heap中的對象會繼續指向內存中的數據段(data segment)。數據保存對象的實際值
3. 向上轉型定義:將父類的引用指向子類的實例 or 將子類對象賦值給父類引用
Dog dog = new Dog(); Animal anim = (Animal) dog; //實際對象類型沒變,僅引用類型改變了 anim.eat();
由于實際對象類型沒變,所以,anim調用的eat方法仍是Dog類中重寫的eat方法,而不是父類Animal類中的eat方法。
用途我們為什么要使用向上轉型?
Generally, upcasting is not necessary. However, we need upcasting when we want to write general code that deals with only the supertype.
一般說來,向上轉型不是必須的。但有時候,當我們的代碼只需要與父類打交道時,可以使用向上轉型,來使我們的代碼不依賴具體子類,比如:
public class AnimalTrainer { public void teach(Animal anim) { anim.move(); anim.eat(); } }
以下代碼,teach方法可以接受Animal類的任意子類:
Dog dog = new Dog(); Cat cat = new Cat(); AnimalTrainer trainer = new AnimalTrainer(); trainer.teach(dog); trainer.teach(cat);內存分析
我們來分析以下轉型代碼在內存中的表示:
Dog dog = new Dog(); Animal anim = (Animal)dog;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68635.html
摘要:所以靜態方法不能被覆蓋。雖然就算你重寫靜態方法,編譯器也不會報錯。也就是說,如果你試圖重寫靜態方法,不會阻止你這么做,但你卻得不到預期的結果重寫僅對非靜態方法有用。我們應該直接使用類名來訪問靜態方法,而不要使用對象引用來訪問。 重寫/重載 重寫指的是根據運行時對象的類型來決定調用哪個方法,而不是根據編譯時的類型。所以靜態方法不能被覆蓋。 (如果從重寫方法會有什么特點來看,我們是不能...
摘要:在類的構造方法中。對基類構造器的調用必須放到子類構造器的第一行。約定用大寫字母下劃線命名規范空白空白指被聲明為但又未給定初值的域,但可以在構造方法必須在域的定義處代碼塊或構造器中對進行賦值。 點擊進入我的博客 復用代碼是Java眾多引人注目的功能之一,但要成為極具革命性的語言,僅僅能夠復制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 7.1 組合 組合語法 就是在當前類中產...
摘要:復用代碼是眾多引入注目的功能之一。但要想成為極具革命性的語言,僅僅能夠復制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 復用代碼是Java眾多引入注目的功能之一。但要想成為極具革命性的語言,僅僅能夠復制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 1.組合語法 將對象引用置于新類中. 初始化對象引用:1.定義時初始化;2.構造器初始化;3.使用之前(惰性初始化);...
閱讀 3380·2021-11-22 09:34
閱讀 2898·2021-10-09 09:43
閱讀 1467·2021-09-24 09:47
閱讀 2215·2019-08-30 12:53
閱讀 1014·2019-08-29 14:00
閱讀 3383·2019-08-29 13:17
閱讀 2280·2019-08-28 18:00
閱讀 1298·2019-08-26 12:00