<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-159  評論-114  文章-7  trackbacks-0

    面向對象三大基石:封裝,繼承,多態。面試會問到。

    Overriding  覆蓋  只存在于父子類之間,一定。

    什么時候才是覆蓋呢?

    class Father{
       public void run(){
       }
    }

    class Son extends Father{
       public void run(int a){
       }
    }

    注意:這是方法的重載,不是覆蓋!只是這個重載發生在父子類之間。

    覆蓋是,子類參數列表與返回值都與父類相同,并且子類在覆蓋父類方法時,不能給出更嚴格的訪問控制,并且子類方法例外的類型是等于父子方法拋出的異常類型,或者是其子類型。

    The exceptions thrown by an overriding method must be equal to or a subset of the exceptions thrown by the overridden method.

    注意構造方法根本不能繼承,所以不存在覆蓋的問題。

    訪問控制

    private 本類內部可見

    default 同類同包

    protected 同包+不同包子類

    要構造一個對象,先構造父類對象,再構造子類對象

    構造一個對象的執行過程。

    1.遞歸的構造父類對象-----------〉也就是說父類本身也要走這樣的步驟。
    2.順序調用成員屬性賦初值語句
    3.調用本類構造方法

    后來課程領悟,類加載與構造對象是兩回事,類加載過程,1.static靜態成員加載,2運行static一次,靜態代碼塊,3如果有靜態內部類,賦值,對靜態內部類的賦值是指編譯產生的Employee$SomeInner.class文件的讀取。

    如果類有靜態變量或者靜態塊,而且用到時(static初始化只有在必要的時候才會進行,那么就會在第一步之前執行一遍,先靜態變量,然后靜態塊,以后再怎么new都不會執行,回到創建父類開始。

    ======〉引用Think In Java

    在這里有必要總結一下對象的創建過程。請考慮一個名為Dog的類:
    (1) 類型為Dog的一個對象首次創建時,或者Dog類的static方法/static字段首次訪問時,Java解釋器必須找到Dog.class(在事先設好的類路徑里搜索)。
    (2) 找到Dog.class后(它會創建一個Class對象,這將在后面學到),它的所有static初始化模塊都會運行。因此,static初始化僅發生一次——在Class對象首次載入的時候。
    (3) 創建一個new Dog()時,Dog對象的構建進程首先會在內存堆(Heap)里為一個Dog對象分配足夠多的存儲空間。
    (4) 這種存儲空間會清為零,將Dog中的所有基本類型設為它們的默認值(零用于數字,以及boolean和char的等價設定)。
    (5) 進行字段定義時發生的所有初始化都會執行。
    (6) 執行構建器。正如第6章將要講到的那樣,這實際可能要求進行相當多的操作,特別是在涉及繼承的時候。

    =====================

    多態-1.編譯時多態      方法重載
             2.運行時多態      一個對象可能會具有多個類型

    對象是客觀的。

    人類對對象的認識是主觀的

    當人看到一個不能識別的,有生命的,區別人的東西時,會類來認識該事物。

    也就是Animal a = new Dog();子類對象可以使用父類對象來引用。

    Animal被稱為編譯時類型,而a真正的對象類型是運行時類型。

    3個原則:

    1.對象不變(運行時類型不變)(客觀的肯定不會改變)
    2.只能調用編譯時類型的方法,方法調用時,檢查編譯時類型內部是否定義了該方法。
       也就是說,在你以一個一個動物來看待一只狗時,你是不會知道它有散步的方法的。
    3.RTTI,運行時,動態類型判定(看運行時類型),子類覆蓋了(Overriding)父類方法,那么調用運行時類型對象的方法。

    a instanceof 類名(編譯時類型)
    a為對象變量
    判斷a是否被聲明為后面類的對象。
    用在強制類型轉換之前。如果轉換錯了,java.lang.ClassCastException 運行時例外

    記住,方法只有覆蓋時,調用尋找運行時類型。而Overloading ->編譯時多態->看編譯時類型。

    屬性,重載阿,都要看編譯時類型。

    package com.ljl;

    public class TestClass {
        
    public void print(B b){
            System.out.println(
    "is B");        
        }

        
    //    public void print(A a){
    //        System.out.println("is A");
    //    }
        
        
    public static void main(String[] args)
        
    {
            TestClass tc 
    = new TestClass();
            A a 
    = new B();
            tc.print(a);
        }

    }


    class A{}

    class B extends A{}

    為什么子類覆蓋父類方法時,訪問控制符只能更寬泛。因為如果父類方法為public,子類方法為private,那么多態時,察看父類方法可以調用(可調用編譯時類型所定義的方法),而動態類型判斷時,調用子類方法,發現為private,完蛋了。





    posted on 2005-11-29 21:37 北國狼人的BloG 閱讀(397) 評論(0)  編輯  收藏 所屬分類: 達內學習總結
    主站蜘蛛池模板: 香蕉免费在线视频| 一级黄色片免费观看| 99re6热视频精品免费观看| 精品国产香蕉伊思人在线在线亚洲一区二区 | 国产成人精品免费视频网页大全| 亚洲大尺度无码无码专区| 国产精品福利片免费看| 亚洲欧洲中文日韩av乱码| 亚欧国产一级在线免费| 亚洲中文字幕无码专区| 99免费在线视频| 亚洲国产精品自在在线观看| 未满十八18禁止免费无码网站| 亚洲日本精品一区二区| 2020久久精品国产免费| 国产精品高清视亚洲一区二区 | 三级片免费观看久久| 免费乱理伦在线播放| 成人精品综合免费视频| 亚洲乱码国产乱码精品精| a级毛片高清免费视频| 亚洲欧洲国产精品你懂的| 91高清免费国产自产| 亚洲中文精品久久久久久不卡| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 亚洲色图古典武侠| 成全视频在线观看免费高清动漫视频下载 | 四虎在线播放免费永久视频| 一二三区免费视频| 亚洲一区二区电影| 中文字幕无码免费久久99| 国产91成人精品亚洲精品| 亚洲精品乱码久久久久久久久久久久 | 国产精品亚洲精品| 亚洲精品第一国产综合境外资源| av永久免费网站在线观看 | 最近中文字幕无吗免费高清| 免费人成视频在线观看免费| 亚洲第一福利网站| 国产一级淫片免费播放| 久久aa毛片免费播放嗯啊|