国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java向上轉(zhuǎn)型及內(nèi)存分析

Zachary / 2645人閱讀

摘要:但有時候,當(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的回答 - 知乎
https://www.zhihu.com/questio...
2. 內(nèi)存分配

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

相關(guān)文章

  • 多態(tài)

    摘要:父類型引用指向子類型對象多態(tài)以下程序編譯是沒有問題的,因為編譯器檢查到的數(shù)據(jù)類型是和之間存在繼承關(guān)系,并且是父類型,是子類型,父類型轉(zhuǎn)換成子類型叫做向下轉(zhuǎn)型,語法合格。 package duotai;public class Animal { public void move() { System.out.pr...

    Magicer 評論0 收藏0
  • Java筆記 - 重寫/重載,向上轉(zhuǎn)型/向下轉(zhuǎn)型

    摘要:所以靜態(tài)方法不能被覆蓋。雖然就算你重寫靜態(tài)方法,編譯器也不會報錯。也就是說,如果你試圖重寫靜態(tài)方法,不會阻止你這么做,但你卻得不到預(yù)期的結(jié)果重寫僅對非靜態(tài)方法有用。我們應(yīng)該直接使用類名來訪問靜態(tài)方法,而不要使用對象引用來訪問。 重寫/重載 重寫指的是根據(jù)運行時對象的類型來決定調(diào)用哪個方法,而不是根據(jù)編譯時的類型。所以靜態(tài)方法不能被覆蓋。 (如果從重寫方法會有什么特點來看,我們是不能...

    qqlcbb 評論0 收藏0
  • Java編程思想》筆記7.復(fù)用類

    摘要:在類的構(gòu)造方法中。對基類構(gòu)造器的調(diào)用必須放到子類構(gòu)造器的第一行。約定用大寫字母下劃線命名規(guī)范空白空白指被聲明為但又未給定初值的域,但可以在構(gòu)造方法必須在域的定義處代碼塊或構(gòu)造器中對進行賦值。 點擊進入我的博客 復(fù)用代碼是Java眾多引人注目的功能之一,但要成為極具革命性的語言,僅僅能夠復(fù)制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 7.1 組合 組合語法 就是在當(dāng)前類中產(chǎn)...

    ningwang 評論0 收藏0
  • 面向?qū)ο蠼涌诙鄳B(tài)

    摘要:多態(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)接口的格式?...

    wangdai 評論0 收藏0
  • Java 復(fù)用類(7)

    摘要:復(fù)用代碼是眾多引入注目的功能之一。但要想成為極具革命性的語言,僅僅能夠復(fù)制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 復(fù)用代碼是Java眾多引入注目的功能之一。但要想成為極具革命性的語言,僅僅能夠復(fù)制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。 1.組合語法 將對象引用置于新類中. 初始化對象引用:1.定義時初始化;2.構(gòu)造器初始化;3.使用之前(惰性初始化);...

    darkbaby123 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<