面向?qū)ο笕蠡悍庋b,繼承,多態(tài)。面試會問到。Overriding 覆蓋 只存在于父子類之間,一定。什么時候才是覆蓋呢?class Father{ public void run(){ }}class Son extends Father{ public void run(int a){ }}注意:這是方法的重載,不是覆蓋!只是這個重載發(fā)生在父子類之間。覆蓋是,子類參數(shù)列表與返回值都與父類相同,并且子類在覆蓋父類方法時,不能給出更嚴(yán)格的訪問控制,并且子類方法例外的類型是等于父子方法拋出的異常類型,或者是其子類型。The exceptions thrown by an overriding method must be equal to or a subset of the exceptions thrown by the overridden method.注意構(gòu)造方法根本不能繼承,所以不存在覆蓋的問題。訪問控制private 本類內(nèi)部可見default 同類同包protected 同包+不同包子類要構(gòu)造一個對象,先構(gòu)造父類對象,再構(gòu)造子類對象構(gòu)造一個對象的執(zhí)行過程。1.遞歸的構(gòu)造父類對象-----------〉也就是說父類本身也要走這樣的步驟。2.順序調(diào)用成員屬性賦初值語句3.調(diào)用本類構(gòu)造方法后來課程領(lǐng)悟,類加載與構(gòu)造對象是兩回事,類加載過程,1.static靜態(tài)成員加載,2運行static一次,靜態(tài)代碼塊,3如果有靜態(tài)內(nèi)部類,賦值,對靜態(tài)內(nèi)部類的賦值是指編譯產(chǎn)生的Employee$SomeInner.class文件的讀取。如果類有靜態(tài)變量或者靜態(tài)塊,而且用到時(static初始化只有在必要的時候才會進行),那么就會在第一步之前執(zhí)行一遍,先靜態(tài)變量,然后靜態(tài)塊,以后再怎么new都不會執(zhí)行,回到創(chuàng)建父類開始。======〉引用Think In Java在這里有必要總結(jié)一下對象的創(chuàng)建過程。請考慮一個名為Dog的類:(1) 類型為Dog的一個對象首次創(chuàng)建時,或者Dog類的static方法/static字段首次訪問時,Java解釋器必須找到Dog.class(在事先設(shè)好的類路徑里搜索)。(2) 找到Dog.class后(它會創(chuàng)建一個Class對象,這將在后面學(xué)到),它的所有static初始化模塊都會運行。因此,static初始化僅發(fā)生一次——在Class對象首次載入的時候。(3) 創(chuàng)建一個new Dog()時,Dog對象的構(gòu)建進程首先會在內(nèi)存堆(Heap)里為一個Dog對象分配足夠多的存儲空間。(4) 這種存儲空間會清為零,將Dog中的所有基本類型設(shè)為它們的默認(rèn)值(零用于數(shù)字,以及boolean和char的等價設(shè)定)。(5) 進行字段定義時發(fā)生的所有初始化都會執(zhí)行。(6) 執(zhí)行構(gòu)建器。正如第6章將要講到的那樣,這實際可能要求進行相當(dāng)多的操作,特別是在涉及繼承的時候。=====================多態(tài)-1.編譯時多態(tài) 方法重載 2.運行時多態(tài) 一個對象可能會具有多個類型對象是客觀的。人類對對象的認(rèn)識是主觀的當(dāng)人看到一個不能識別的,有生命的,區(qū)別人的東西時,會類來認(rèn)識該事物。也就是Animal a = new Dog();子類對象可以使用父類對象來引用。Animal被稱為編譯時類型,而a真正的對象類型是運行時類型。3個原則:1.對象不變(運行時類型不變)(客觀的肯定不會改變)2.只能調(diào)用編譯時類型的方法,方法調(diào)用時,檢查編譯時類型內(nèi)部是否定義了該方法。 也就是說,在你以一個一個動物來看待一只狗時,你是不會知道它有散步的方法的。3.RTTI,運行時,動態(tài)類型判定(看運行時類型),子類覆蓋了(Overriding)父類方法,那么調(diào)用運行時類型對象的方法。a instanceof 類名(編譯時類型)a為對象變量判斷a是否被聲明為后面類的對象。用在強制類型轉(zhuǎn)換之前。如果轉(zhuǎn)換錯了,java.lang.ClassCastException 運行時例外記住,方法只有覆蓋時,調(diào)用尋找運行時類型。而Overloading ->編譯時多態(tài)->看編譯時類型。屬性,重載阿,都要看編譯時類型。
為什么子類覆蓋父類方法時,訪問控制符只能更寬泛。因為如果父類方法為public,子類方法為private,那么多態(tài)時,察看父類方法可以調(diào)用(可調(diào)用編譯時類型所定義的方法),而動態(tài)類型判斷時,調(diào)用子類方法,發(fā)現(xiàn)為private,完蛋了。