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

資訊專欄INFORMATION COLUMN

Java向上轉型及內存分析

Zachary / 2654人閱讀

摘要:但有時候,當我們的代碼只需要與父類打交道時,可以使用向上轉型,來使我們的代碼不依賴具體子類,比如以下代碼,方法可以接受類的任意子類內存分析我們來分析以下轉型代碼在內存中的表示

學習設計模式的時候,發現很多模式都用到了向上轉型(eg. 工廠方法)。而我對向上轉型(upcasting)的機制并不十分熟悉。這篇文章將深入分析向上轉型的機制、內存分析。

概念

先從幾個基本概念開始:

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

Java中的數據類型分為兩類:基本數據類型(int, double)和引用類型(String)。引用類型對象中保存著一個地址(稱為“引用”),引用指向實際對象(稱為“實例”),實際對象中保存著值。

關于Java數據類型在內存中的分析詳解,請參考知友Intopass的解答:

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

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

相關文章

  • 多態

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

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

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

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

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

    ningwang 評論0 收藏0
  • 面向對象接口多態

    摘要:多態的前提是必須有子父類關系或者類實現接口關系,否則無法完成多態。具體格式如下父類引用指向子類對象就是多態的定義格式。多態的轉型分為向上轉型與向下轉型兩種向上轉型當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。 第3天 面向對象 今日內容介紹? 接口? 多態? 筆記本案例今日學習目標? 寫出定義接口的格式? 寫出實現接口的格式?...

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

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

    darkbaby123 評論0 收藏0

發表評論

0條評論

Zachary

|高級講師

TA的文章

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