成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

Zachary / 2652人閱讀

摘要:但有時(shí)候,當(dāng)我們的代碼只需要與父類打交道時(shí),可以使用向上轉(zhuǎn)型,來(lái)使我們的代碼不依賴具體子類,比如以下代碼,方法可以接受類的任意子類內(nèi)存分析我們來(lái)分析以下轉(zhuǎn)型代碼在內(nèi)存中的表示

學(xué)習(xí)設(shè)計(jì)模式的時(shí)候,發(fā)現(xiàn)很多模式都用到了向上轉(zhuǎn)型(eg. 工廠方法)。而我對(duì)向上轉(zhuǎn)型(upcasting)的機(jī)制并不十分熟悉。這篇文章將深入分析向上轉(zhuǎn)型的機(jī)制、內(nèi)存分析。

概念

先從幾個(gè)基本概念開(kāi)始:

1. Java中的引用類型(reference type)

Java中的數(shù)據(jù)類型分為兩類:基本數(shù)據(jù)類型(int, double)和引用類型(String)。引用類型對(duì)象中保存著一個(gè)地址(稱為“引用”),引用指向?qū)嶋H對(duì)象(稱為“實(shí)例”),實(shí)際對(duì)象中保存著值。

關(guān)于Java數(shù)據(jù)類型在內(nèi)存中的分析詳解,請(qǐng)參考知友Intopass的解答:

Java 到底是值傳遞還是引用傳遞? - Intopass的回答 - 知乎
https://www.zhihu.com/questio...
2. 內(nèi)存分配

Heap中的對(duì)象會(huì)繼續(xù)指向內(nèi)存中的數(shù)據(jù)段(data segment)。數(shù)據(jù)保存對(duì)象的實(shí)際值

3. 向上轉(zhuǎn)型

定義:將父類的引用指向子類的實(shí)例 or 將子類對(duì)象賦值給父類引用

Dog dog = new Dog();
Animal anim = (Animal) dog; //實(shí)際對(duì)象類型沒(méi)變,僅引用類型改變了
anim.eat();

由于實(shí)際對(duì)象類型沒(méi)變,所以,anim調(diào)用的eat方法仍是Dog類中重寫(xiě)的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.

一般說(shuō)來(lái),向上轉(zhuǎn)型不是必須的。但有時(shí)候,當(dāng)我們的代碼只需要與父類打交道時(shí),可以使用向上轉(zhuǎn)型,來(lái)使我們的代碼不依賴具體子類,比如:

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)存分析

我們來(lái)分析以下轉(zhuǎn)型代碼在內(nèi)存中的表示:

Dog dog = new Dog();
Animal anim = (Animal)dog;

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68635.html

相關(guān)文章

  • 多態(tài)

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

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

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

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

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

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

    摘要:多態(tài)的前提是必須有子父類關(guān)系或者類實(shí)現(xiàn)接口關(guān)系,否則無(wú)法完成多態(tài)。具體格式如下父類引用指向子類對(duì)象就是多態(tài)的定義格式。多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種向上轉(zhuǎn)型當(dāng)有子類對(duì)象賦值給一個(gè)父類引用時(shí),便是向上轉(zhuǎn)型,多態(tài)本身就是向上轉(zhuǎn)型的過(guò)程。 第3天 面向?qū)ο?今日內(nèi)容介紹? 接口? 多態(tài)? 筆記本案例今日學(xué)習(xí)目標(biāo)? 寫(xiě)出定義接口的格式? 寫(xiě)出實(shí)現(xiàn)接口的格式?...

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

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

    darkbaby123 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<