色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

全面講解?向對象編程三?特性 2

jf_78858299 ? 來源:小牛呼嚕嚕 ? 作者:小牛呼嚕嚕 ? 2023-02-09 14:25 ? 次閱讀

我們來看上面part1部分:

Cat cat_ = new Cat();
        cat_.eat();
        cat_.sleep();
        cat_.work();

結果:

吃魚

貓會睡懶覺。

動物可以幫助人類干活!

cat_.work(); 這處繼承了父類Animal的方法,還是很好理解的

我們接著看part2:

Animal cat=new Cat();
        cat.eat();
        cat.work();
        cat.sleep();//此處編譯會報錯。

        Animal dog=new Dog();
        dog.eat();//結果為:吃骨頭。此處調用子類的同名方法。

這塊就比較特殊了,我們一句句來看

Animal cat=new Cat(); 像這種這個 父類引用指向子類對象,這種現象叫做: "向上轉型" ,也被稱為 多態的引用

cat.sleep();這句 編譯器會提示 編譯報錯。表明:當我們當子類的對象作為父類的引用使用時,只能訪問子類中和父類中都有的方法,而無法去訪問子類中特有的方法

值得注意的是:向上轉型是安全的。但是缺點是:一旦向上轉型,子類會丟失子類的擴展方法,其實就是 子類中原本特有的方法就不能再被調用了。所以cat.sleep()這句會編譯報錯。

cat.eat();這句的結果打印:吃魚。程序這塊調用我們Cat定義的方法。

cat.work();這句的結果打印:動物可以幫助人類干活!我們上面Cat類沒有定義work方法,但是卻使用了父類的方法,這是不是很神奇。其實此處調的是父類的同名方法

Animal dog=new Dog();dog.eat();這句的結果打印為:吃骨頭。此處調用子類的同名方法。

由此我們可以知道當發生向上轉型,去調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。如果子類沒有同名方法,會再次去調父類中的該方法

向上轉型

我們現在知道了 向上轉型時會丟失子類的擴展方法,哎,但我們就是想找回來,這可咋辦?

向下轉型可以幫助我們,找回曾經失去的

我們來看part3:

Cat cat_real = (Cat)cat;  //注意 此處的cat 對應上面父類Animal,可不是子類
    cat_real.sleep();

Cat cat = (Cat)cat; cat222.sleep(); 這個向下轉型非常像"強轉"。

打印的結果:貓會睡懶覺。此處又能調用了 子類Cat 的 sleep()方法了。

一道簡單的面試題

我們再來看一道有意思的題,來強化理解

public class Main {
    
    static class Animal{
        int weight = 10;

        public void print() {
            System.out.println("this Animal Print:" + weight);
        }

        public Animal() {
            print();
        }
    }

    static class Dog extends Animal {
        int weight = 20;

        @Override
        public void print() {
            System.out.println("this Dog Print:" + weight);
        }

        public Dog() {
            print();
        }
    }

    public static void main(String[] args) {
        Dog dog = new Dog();

        System.out.println("---------------");
        Animal dog222 = new Dog();
        Dog dog333 =  (Dog)dog222;
        
        System.out.println("---------------");
        Dog dog444 = (Dog)new Animal();

    }
}

執行結果:

this Dog Print:0
this Dog Print:20
---------------
this Dog Print:0
this Dog Print:20
---------------
this Animal Print:10
Exception in thread "main" java.lang.ClassCastException: com.zj.Main$Animal cannot be cast to com.zj.Main$Dog
 at com.zj.Main.main(Main.java:15)

做對了嘛,不對的話,復制代碼去idea中debug看看

我們先看第一部分

Dog dog = new Dog();

程序內部的執行順序:

  1. 先 初始化 父類Animal 的屬性 int weight=10
  2. 然后 調用父類Animal的構造方法,執行print()
  3. 實際調用子類Dog的print()方法,打印:this Dog Print:0,由于此時的子類屬性weight 并未初始化
  4. 初始化 子類Dog 的屬性 int weight=20
  5. 調用 子類Dog的構造方法,執行print()
  6. 實際調用當前類的print()方法,打印this Dog Print:20

其中有幾處我們需要注意一下:實例化子類dog,程序會去默認優先實例化父類,即子類實例化時會隱式傳遞Dog的this調用父類構造器進行初始化工作,這個和JVM的雙親委派機制有關,這里就不展開講了,先挖個坑,以后再來填

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49229
  • 面向對象編程

    關注

    0

    文章

    22

    瀏覽量

    1833
收藏 人收藏

    評論

    相關推薦

    嵌入式C語言面向對象編程---多態

    前兩篇文章主要講述了 C 語言面向對象編程– 封裝和繼承。本篇文章繼續來討論一下,如何使用 C 語言實現面向對象編程的另一個重要特性:多態。
    發表于 10-31 14:41 ?1037次閱讀

    Python的面向對象編程詳解

    一般編程可分為面向過程編程,和面向對象編程。Python的面向對象編程,與Java的面向
    發表于 09-04 16:35 ?589次閱讀
    Python的面向<b class='flag-5'>對象</b><b class='flag-5'>編程</b>詳解

    每日一教labview視頻教程【12.15】labview面向對象編程(上)

    面向對象編程視頻:專家從類開始進行講解,詳細說明了如何進行面向對象編程。http://yunpan.cn/lk/480ep1p
    發表于 12-15 10:35

    利用LabVIEW工程庫實現面向對象編程

    。VI Scripting技術也是LabVIEW的新特性。利用它可以直接在LabVIEW中解析或更改LabVIEW VI。. LabVIEW面向對象編程的具體實現方法我們可以把一組相
    發表于 12-06 12:41

    編程魔法師大思想視頻宣傳片

    講解了單片機裸編程項目的設計實現過程,并通過一只電機對象到兩只電機對象的設計演變過程,深入講解了數碼分離、線程實現、
    發表于 04-23 21:46

    面向對象編程及其特性 精選資料分享

    編程語言分為面向過程編程、函數式編程和面向對象編程。其實python就是一種面向對象
    發表于 07-21 08:38

    面向對象編程介紹

    目錄一、面向對象編程介紹1.面向過程編程2.函數式編程3.面向對象
    發表于 12-13 07:22

    C++面向對象多線程編程 (pdf電子版)

    C++面向對象多線程編程共分13章,全面講解構建多線程架構與增量多線程編程技術。第1章介紹了
    發表于 09-25 09:39 ?0次下載

    對象特性的測定

    對象特性的測定 一、 實驗目的1、通過實驗了解對象的靜態和動態特性2、掌握對象靜態和動態
    發表于 05-17 10:53 ?14次下載

    面向對象編程練習

    實驗 3 面向對象編程練習 一、實驗目的     通過編程和上機實驗理解 Java 語言是如何體現面向對象編程
    發表于 09-23 18:57 ?3060次閱讀

    LabVIEW 網絡講壇第四季:面向對象編程的應用

    本視頻主要講解了基本概念,以及面向對象編程在LabVIEW中的應用。
    的頭像 發表于 06-25 02:46 ?2919次閱讀
    LabVIEW 網絡講壇第四季:面向<b class='flag-5'>對象</b>的<b class='flag-5'>編程</b>的應用

    Labview面向對象編程快速入門教程

    在面向對象編程中, 類用來表示通用特性。 例如,假設有一個描述汽車的類。 類中定義了各種汽車的通用特性對象是類的特定實例。汽車類的一個
    發表于 07-31 08:00 ?83次下載
    Labview面向<b class='flag-5'>對象</b><b class='flag-5'>編程</b>快速入門教程

    Oracle外部例程-plsql調用com對象講解

    Oracle外部例程-plsql調用com對象講解(現代電源技術試卷西建大)-該文檔為Oracle外部例程-plsql調用com對象講解文檔,是一份不錯的參考文檔,感興趣的可以看看,,
    發表于 09-28 13:36 ?14次下載
    Oracle外部例程-plsql調用com<b class='flag-5'>對象</b><b class='flag-5'>講解</b>

    全面講解?對象編程?特性 1

    把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。封裝是面向對象的特征之一,是對象和類概念的主要特性。 > 通俗地說,一個類
    的頭像 發表于 02-09 14:24 ?372次閱讀

    西門子PLC面向對象編程

    面向對象編程是計算機高級語言的一種高級編程模式,這種設計思想也可以應用于工業控制系統的plc程序中。雖然我們 無法實現面向對象編程的許多優
    發表于 04-17 11:41 ?7次下載
    西門子PLC面向<b class='flag-5'>對象</b><b class='flag-5'>編程</b>
    主站蜘蛛池模板: 女人张开腿让男人添| 女教师の诱惑| 日本 稀土矿| 国产精品亚洲AV色欲在线观看 | 精品视频在线播放| 蜜柚视频在线观看全集免费观看| 一本之道加勒比在线观看| 国产看黄网站又黄又爽又色| 丝瓜视频樱桃视频在线观看免费| 亚洲天堂视频网站| 韩国伦理电影在线神马网 | 欧美14videosex性欧美成人| 91麻豆久久| 国产精品久久久久久精品...| 久久内在线视频精品mp4| 青青草国产精品久久| 亚洲国产成人精品无码区APP | 最近中文字幕无吗免费高清| 国产成人精品视频频| 天天影视网网色色欲| 91精品专区| 欧美性xxxx18| 国产成A人片在线观看| 亚洲国产高清在线| 久久极品视频| 99精品国产高清自在线看超| 果冻传媒妈妈要儿子| 色中色辩论区| freehd另类xxxx喷水| 日本人娇小hd| 99re久久热在线播放8| 火影小南被爆羞羞网站| 欧式午夜理伦三级在线观看| 富婆夜店找黑人猛男BD在线| 亚洲 欧美 日本 国产 高清| 久久精品手机观看| FREECHINESE东北群交| 亚洲高清毛片一区二区| 美国色吧影院| 最近2019中文字幕免费版视频| 欧美老少欢杂交另类|