摘要:但有時候,當(dāng)我們的代碼只需要與父類打交道時,可以使用向上轉(zhuǎn)型,來使我們的代碼不依賴具體子類,比如以下代碼,方法可以接受類的任意子類內(nèi)存分析我們來分析以下轉(zhuǎn)型代碼在內(nèi)存中的表示
學(xué)習(xí)設(shè)計模式的時候,發(fā)現(xiàn)很多模式都用到了向上轉(zhuǎn)型(eg. 工廠方法)。而我對向上轉(zhuǎn)型(upcasting)的機制并不十分熟悉。這篇文章將深入分析向上轉(zhuǎn)型的機制、內(nèi)存分析。
概念先從幾個基本概念開始:
1. Java中的引用類型(reference type)Java中的數(shù)據(jù)類型分為兩類:基本數(shù)據(jù)類型(int, double)和引用類型(String)。引用類型對象中保存著一個地址(稱為“引用”),引用指向?qū)嶋H對象(稱為“實例”),實際對象中保存著值。
關(guān)于Java數(shù)據(jù)類型在內(nèi)存中的分析詳解,請參考知友Intopass的解答:
Java 到底是值傳遞還是引用傳遞? - Intopass的回答 - 知乎2. 內(nèi)存分配
https://www.zhihu.com/questio...
Heap中的對象會繼續(xù)指向內(nèi)存中的數(shù)據(jù)段(data segment)。數(shù)據(jù)保存對象的實際值
3. 向上轉(zhuǎn)型定義:將父類的引用指向子類的實例 or 將子類對象賦值給父類引用
Dog dog = new Dog(); Animal anim = (Animal) dog; //實際對象類型沒變,僅引用類型改變了 anim.eat();
由于實際對象類型沒變,所以,anim調(diào)用的eat方法仍是Dog類中重寫的eat方法,而不是父類Animal類中的eat方法。
用途我們?yōu)槭裁匆褂孟蛏限D(zhuǎn)型?
Generally, upcasting is not necessary. However, we need upcasting when we want to write general code that deals with only the supertype.
一般說來,向上轉(zhuǎn)型不是必須的。但有時候,當(dāng)我們的代碼只需要與父類打交道時,可以使用向上轉(zhuǎn)型,來使我們的代碼不依賴具體子類,比如:
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);內(nèi)存分析
我們來分析以下轉(zhuǎn)型代碼在內(nèi)存中的表示:
Dog dog = new Dog(); Animal anim = (Animal)dog;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68635.html
摘要:所以靜態(tài)方法不能被覆蓋。雖然就算你重寫靜態(tài)方法,編譯器也不會報錯。也就是說,如果你試圖重寫靜態(tài)方法,不會阻止你這么做,但你卻得不到預(yù)期的結(jié)果重寫僅對非靜態(tài)方法有用。我們應(yīng)該直接使用類名來訪問靜態(tài)方法,而不要使用對象引用來訪問。 重寫/重載 重寫指的是根據(jù)運行時對象的類型來決定調(diào)用哪個方法,而不是根據(jù)編譯時的類型。所以靜態(tài)方法不能被覆蓋。 (如果從重寫方法會有什么特點來看,我們是不能...
摘要:在類的構(gòu)造方法中。對基類構(gòu)造器的調(diào)用必須放到子類構(gòu)造器的第一行。約定用大寫字母下劃線命名規(guī)范空白空白指被聲明為但又未給定初值的域,但可以在構(gòu)造方法必須在域的定義處代碼塊或構(gòu)造器中對進行賦值。 點擊進入我的博客 復(fù)用代碼是Java眾多引人注目的功能之一,但要成為極具革命性的語言,僅僅能夠復(fù)制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 7.1 組合 組合語法 就是在當(dāng)前類中產(chǎn)...
摘要:多態(tài)的前提是必須有子父類關(guān)系或者類實現(xiàn)接口關(guān)系,否則無法完成多態(tài)。具體格式如下父類引用指向子類對象就是多態(tài)的定義格式。多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種向上轉(zhuǎn)型當(dāng)有子類對象賦值給一個父類引用時,便是向上轉(zhuǎn)型,多態(tài)本身就是向上轉(zhuǎn)型的過程。 第3天 面向?qū)ο?今日內(nèi)容介紹? 接口? 多態(tài)? 筆記本案例今日學(xué)習(xí)目標? 寫出定義接口的格式? 寫出實現(xiàn)接口的格式?...
摘要:復(fù)用代碼是眾多引入注目的功能之一。但要想成為極具革命性的語言,僅僅能夠復(fù)制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 復(fù)用代碼是Java眾多引入注目的功能之一。但要想成為極具革命性的語言,僅僅能夠復(fù)制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 1.組合語法 將對象引用置于新類中. 初始化對象引用:1.定義時初始化;2.構(gòu)造器初始化;3.使用之前(惰性初始化);...
閱讀 3371·2021-11-22 09:34
閱讀 2857·2021-10-09 09:43
閱讀 1445·2021-09-24 09:47
閱讀 2199·2019-08-30 12:53
閱讀 998·2019-08-29 14:00
閱讀 3356·2019-08-29 13:17
閱讀 2269·2019-08-28 18:00
閱讀 1284·2019-08-26 12:00