面向?qū)ο筇匦訽第1頁
面向?qū)ο筇匦訽第2頁
面向?qū)ο筇匦訽第3頁
面向?qū)ο筇匦訽第4頁
面向?qū)ο筇匦訽第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第5章 面向?qū)ο蟮奶匦?Object Oriented Techniques 目錄 5.1面向?qū)ο筇匦悦嫦驅(qū)ο筇匦?5.2抽象類抽象類 5.3接口接口 5.4內(nèi)部類內(nèi)部類 5.5異常類異常類 5.6泛型類泛型類 5.1 面向?qū)ο筇匦?面向過程的代碼面向過程的代碼 Procedure call Loose cohesion Tight coupling Redundancy Component B Goto D1 Component D Goto D1 D1: Change V1 to zero V1=V2-A1 Increment V1 Global: V1 V2 Common data ar

2、ea Component ZComponent XComponent Y Component A Component B Control data l Maintainability 可維護(hù)性可維護(hù)性 l Reusability 可重用性可重用性 l Extensibility 可擴(kuò)展性可擴(kuò)展性 Component A Component B Data Structure 5.1 面向?qū)ο筇匦?多態(tài)多態(tài) polymorphism 封裝封裝 Encapsulation 繼承繼承 Inheritance 抽象抽象 Abstraction 面向?qū)ο蟮拇a面向?qū)ο蟮拇a Messaging l Mai

3、ntainability 可維護(hù)性可維護(hù)性 l Reusability 可重用性可重用性 l Extensibility 可擴(kuò)展性可擴(kuò)展性 1封裝性 多態(tài)多態(tài) polymorphism 繼承繼承 Inheritance 抽象抽象 Abstraction 封裝封裝 Encapsulation 封裝(封裝(Encapsulation) First Principle of OO 通過對(duì)象的封裝,實(shí)現(xiàn)了通過對(duì)象的封裝,實(shí)現(xiàn)了模塊化模塊化 通過對(duì)類和類的成員施以一定的通過對(duì)類和類的成員施以一定的訪問權(quán)限訪問權(quán)限,實(shí)現(xiàn)了,實(shí)現(xiàn)了信息信息 隱藏隱藏 javajava中的限定詞中的限定詞 同一個(gè)類同一個(gè)類同

4、一個(gè)包同一個(gè)包不同包的子類不同包的子類不同包非子類不同包非子類 private* default * protected* public* 1封裝性 未封裝未封裝的全局變量的全局變量 Box . x 可以造成系統(tǒng)中所有類之間產(chǎn)生緊耦合可以造成系統(tǒng)中所有類之間產(chǎn)生緊耦合 系統(tǒng)可維護(hù)性差系統(tǒng)可維護(hù)性差 1封裝性 Java中中實(shí)例實(shí)例變量變量最低限度最低限度的封裝的封裝 沒有封裝沒有封裝x的的身份身份 類的類的public成員構(gòu)成類的成員構(gòu)成類的輸出輸出API 1封裝性 隱藏隱藏實(shí)例成員變量實(shí)例成員變量 添加添加存取方法存取方法 解除對(duì)實(shí)例成員的耦合解除對(duì)實(shí)例成員的耦合 x從輸出從輸出API變成了類

5、的內(nèi)部實(shí)現(xiàn)變成了類的內(nèi)部實(shí)現(xiàn) 封裝成員的封裝成員的身份身份 getter setter(mutator) 1封裝性 x: String ? No Change! x成為成為Box的內(nèi)部實(shí)現(xiàn)的內(nèi)部實(shí)現(xiàn) 不再影響不再影響Client 防止修改防止修改 1封裝性 可維護(hù)性、冗余性可維護(hù)性、冗余性 對(duì)于易發(fā)生變化的成對(duì)于易發(fā)生變化的成 員,在內(nèi)部訪問時(shí)使員,在內(nèi)部訪問時(shí)使 用用存取方法存取方法 類的內(nèi)部對(duì)成員的訪問類的內(nèi)部對(duì)成員的訪問 1封裝性 封裝封裝引用類型引用類型成員成員 “myBox”在在Room中中 良好的封裝了嗎?良好的封裝了嗎? 1封裝性 封裝封裝引用類型引用類型成員成員 boxbox中

6、中x x是局部變量的拷是局部變量的拷 貝,局部變量貝,局部變量x x改變不影響改變不影響 boxbox狀態(tài)狀態(tài) 在在Room中進(jìn)行中進(jìn)行防御拷防御拷 貝(貝(defensive copy) 1封裝性 引用類型引用類型成員的成員的getter方法破壞封裝性方法破壞封裝性 getter方法破壞了方法破壞了Room對(duì)對(duì) Box的封裝的封裝 1封裝性 不可變更類不可變更類 封裝性、安全性的考慮封裝性、安全性的考慮 不可變更類的實(shí)例一旦被創(chuàng)建,其狀態(tài)就不會(huì)發(fā)生變化不可變更類的實(shí)例一旦被創(chuàng)建,其狀態(tài)就不會(huì)發(fā)生變化 String、基本數(shù)據(jù)類型的類包裝器、基本數(shù)據(jù)類型的類包裝器 特點(diǎn):特點(diǎn): “private

7、”成員屬性成員屬性 成員沒有成員沒有setter方法方法 “final”class “final”成員屬性成員屬性 通常不提供可變成員的通常不提供可變成員的getter方法方法 通常不在構(gòu)造函數(shù)中引用外部可變對(duì)象通常不在構(gòu)造函數(shù)中引用外部可變對(duì)象 線程安全線程安全 實(shí)例可以被重用(對(duì)象池)實(shí)例可以被重用(對(duì)象池) 享元模式享元模式( flyweight design pattern ) 1封裝性 防御拷貝(防御拷貝(defensive copy) 防御拷貝應(yīng)該在參數(shù)有防御拷貝應(yīng)該在參數(shù)有 效性驗(yàn)證效性驗(yàn)證之前之前 參數(shù)有效性驗(yàn)證必須針參數(shù)有效性驗(yàn)證必須針 對(duì)對(duì)拷貝后拷貝后的變量的變量 1封裝性

8、 防御拷貝(防御拷貝(defensive copy) 返回可變對(duì)象的防御拷返回可變對(duì)象的防御拷 貝貝 封裝性 總結(jié) 最大限度的降低數(shù)據(jù)的可見性最大限度的降低數(shù)據(jù)的可見性 謹(jǐn)慎設(shè)計(jì)和輸出公共謹(jǐn)慎設(shè)計(jì)和輸出公共API 耦合性耦合性 可維護(hù)性可維護(hù)性 可擴(kuò)展性可擴(kuò)展性 public protected default private exported API implementation package 封裝性 總結(jié) 公共的類構(gòu)成了包(一個(gè)子系統(tǒng))的外觀公共的類構(gòu)成了包(一個(gè)子系統(tǒng))的外觀 ( faade ) 當(dāng)一個(gè)類只被一個(gè)其他類訪問的時(shí)候,可以作為該當(dāng)一個(gè)類只被一個(gè)其他類訪問的時(shí)候,可以作為該

9、類的內(nèi)部類類的內(nèi)部類 ( innner class) 不能因?yàn)闇y試類的正確性,而提高其可見性不能因?yàn)闇y試類的正確性,而提高其可見性 如果包中一個(gè)類頻繁訪問另一個(gè)類的成員變量時(shí),如果包中一個(gè)類頻繁訪問另一個(gè)類的成員變量時(shí), 應(yīng)考慮重構(gòu)設(shè)計(jì)應(yīng)考慮重構(gòu)設(shè)計(jì) 包對(duì)類的封裝性包對(duì)類的封裝性 public class 封裝性 總結(jié) 類不應(yīng)該直接暴露成員變量(類不應(yīng)該直接暴露成員變量(fields) 反例反例:java.awt.Point,java.awt.Dimension 類的成員變量應(yīng)盡可能設(shè)置為私有的(類的成員變量應(yīng)盡可能設(shè)置為私有的(private) “static final”可以設(shè)置為公有,但

10、必須為簡單類型可以設(shè)置為公有,但必須為簡單類型 或不可變的引用類型或不可變的引用類型 “protected”會(huì)引起成員變?yōu)闀?huì)引起成員變?yōu)锳PI的一部分的一部分 根據(jù)類是否為可變類型,來提供相應(yīng)的根據(jù)類是否為可變類型,來提供相應(yīng)的getter和和setter 對(duì)于可變的對(duì)于可變的引用成員引用成員變量,在構(gòu)造函數(shù)和變量,在構(gòu)造函數(shù)和getter方法方法 中使用防御拷貝中使用防御拷貝 在類的內(nèi)部對(duì)不穩(wěn)定的屬性,使用在類的內(nèi)部對(duì)不穩(wěn)定的屬性,使用getter和和setter訪問訪問 類對(duì)成員的封裝性類對(duì)成員的封裝性 2繼承性(Inheritance) 實(shí)現(xiàn)實(shí)現(xiàn)代碼復(fù)用代碼復(fù)用 組合(組合(has-a)

11、 繼承(繼承(is-a) 把一些類的共性再把一些類的共性再抽取抽取出來,放到一個(gè)類中,稱為出來,放到一個(gè)類中,稱為 父類父類 具有特殊屬性的新類繼承父類的狀態(tài)和行為,稱為具有特殊屬性的新類繼承父類的狀態(tài)和行為,稱為 子類子類 子類繼承了父類的屬性和方法子類繼承了父類的屬性和方法(不包括構(gòu)造方法不包括構(gòu)造方法),同,同 時(shí)也可以擁有自己的屬性和方法時(shí)也可以擁有自己的屬性和方法 繼承具有傳遞性繼承具有傳遞性 父類可以是父類可以是Java類庫中的類,也可以是自己編寫的類類庫中的類,也可以是自己編寫的類 Java中每個(gè)類只能有一個(gè)直接父類,稱為中每個(gè)類只能有一個(gè)直接父類,稱為單繼承單繼承 2繼承性(I

12、nheritance) 2繼承性(Inheritance) 我吃素,可脾氣我吃素,可脾氣 不太好不太好 2繼承性(Inheritance) 在狗群中,吠叫聲是個(gè)在狗群中,吠叫聲是個(gè) 很重要的事情,該聲音很重要的事情,該聲音 必須有代表性和獨(dú)一無必須有代表性和獨(dú)一無 二性二性 2繼承性(Inheritance) 對(duì)呀,對(duì)呀,LionLion、TigerTiger 和和CatCat之間有共同的部分之間有共同的部分 狼和狗之間也可以狼和狗之間也可以 共享某些東西共享某些東西 2繼承性(Inheritance) 它們都是它們都是 貓科動(dòng)物貓科動(dòng)物 它們都是它們都是 犬齒動(dòng)物犬齒動(dòng)物 2繼承性(Inhe

13、ritance) 創(chuàng)建子類創(chuàng)建子類 class SubClass extends SuperClass java中所有的類都是通過直接或間接地繼承中所有的類都是通過直接或間接地繼承java.lang.Object 類得到的,如果一個(gè)類沒使用類得到的,如果一個(gè)類沒使用extends,該類被系統(tǒng)默認(rèn)為,該類被系統(tǒng)默認(rèn)為 是是Object類的子類。類的子類。 java不支持多重繼承不支持多重繼承。 子類不能繼承父類中權(quán)限為子類不能繼承父類中權(quán)限為private的成員變量和方法。的成員變量和方法。 2繼承性 子類繼承父類的變量和方法可以被子類自身定義的方子類繼承父類的變量和方法可以被子類自身定義的方

14、法所訪問法所訪問 子類和父類在同一包中,子類繼承父類中不是子類和父類在同一包中,子類繼承父類中不是 private的成員變量和方法的成員變量和方法 子類和父類不在同一包中,子類繼承父類中的子類和父類不在同一包中,子類繼承父類中的 protected, public成員變量和方法成員變量和方法 繼承的成員變量及方法的訪問權(quán)限保持不變繼承的成員變量及方法的訪問權(quán)限保持不變 下面我們看一個(gè)下面我們看一個(gè)例子例子。 程序的運(yùn)行結(jié)果見下圖程序的運(yùn)行結(jié)果見下圖 5.3 子類對(duì)象的構(gòu)造過程 當(dāng)用子類的構(gòu)造方法創(chuàng)建一個(gè)子類的對(duì)象時(shí)當(dāng)用子類的構(gòu)造方法創(chuàng)建一個(gè)子類的對(duì)象時(shí),子類總子類總 是先調(diào)用是先調(diào)用父類的構(gòu)造

15、方法父類的構(gòu)造方法,如果子類的構(gòu)造方法中沒,如果子類的構(gòu)造方法中沒 有顯式指明使用哪一個(gè)構(gòu)造方法,子類調(diào)用父類有顯式指明使用哪一個(gè)構(gòu)造方法,子類調(diào)用父類不帶不帶 參數(shù)參數(shù)的構(gòu)造方法。的構(gòu)造方法。 (1)將子類中聲明的成員變量做為子類對(duì)象的成員變)將子類中聲明的成員變量做為子類對(duì)象的成員變 量量 (2)父類的成員變量也都分配了內(nèi)存空間,但只將其)父類的成員變量也都分配了內(nèi)存空間,但只將其 中一部分(繼承的那部分)做為子類對(duì)象的成員變量。中一部分(繼承的那部分)做為子類對(duì)象的成員變量。 子類未繼承的成員子類未繼承的成員 子類未繼承的成員子類未繼承的成員 引用引用 子類對(duì)象子類對(duì)象 子類繼承的成員子

16、類繼承的成員 子類繼承的成員子類繼承的成員 子類聲明的成員子類聲明的成員 子類聲明的成員子類聲明的成員 子類對(duì)象內(nèi)存示意圖子類對(duì)象內(nèi)存示意圖 5.4 成員的覆蓋(隱藏) 子類擁有與父類相同的成員的情況稱為覆蓋子類擁有與父類相同的成員的情況稱為覆蓋 (override) 子類通過覆蓋父類的子類通過覆蓋父類的成員變量成員變量和和方法方法,可以把父,可以把父 類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。 成員變量的覆蓋:變量名相同成員變量的覆蓋:變量名相同 成員方法的覆蓋:返回值類型、方法名、形式成員方法的覆蓋:返回值類型、方法名、形式 參數(shù)都相同參數(shù)都相同 5.4.

17、1 成員變量的隱藏(覆蓋) 子類中定義的成員變量與父類中的成員變量同名時(shí)子類中定義的成員變量與父類中的成員變量同名時(shí) (不必類型相同不必類型相同),子類就隱藏了),子類就隱藏了繼承的繼承的成員變量成員變量 父類的方法會(huì)看到原來的變量,而子類的方法看到的父類的方法會(huì)看到原來的變量,而子類的方法看到的 則是新則是新“版本版本”的變量的變量 成員變量的隱藏成員變量的隱藏 例例5-3 成員變量的隱藏(覆蓋) 例如:例如:class IntegerCalculator int sum; class DecimalCalculator extends IntegerCalculator double su

18、m; 類類DecimalCalculator 從從IntegerCalculator中繼承的方法將中繼承的方法將 看到整型變量,而看到整型變量,而DecimalCalculator類中定義的方法則會(huì)類中定義的方法則會(huì) 看到浮點(diǎn)型變量看到浮點(diǎn)型變量 如果需在如果需在DecimalCalculator類內(nèi)引用從類內(nèi)引用從IntegerCalculator 繼承得到的同名變量,需要使用繼承得到的同名變量,需要使用super int s = super.sum; 5.4.2 方法的覆蓋(重寫 override) 子類定義一個(gè)方法,該方法的名字、子類定義一個(gè)方法,該方法的名字、返回類型返回類型、參數(shù)個(gè)、

19、參數(shù)個(gè) 數(shù)和類型與從父類繼承的方法數(shù)和類型與從父類繼承的方法完全相同完全相同 如果子類重寫了父類的方法,就隱藏了繼承的方法,子如果子類重寫了父類的方法,就隱藏了繼承的方法,子 類對(duì)象調(diào)用該方法則調(diào)用的是重寫的方法,要調(diào)用被隱類對(duì)象調(diào)用該方法則調(diào)用的是重寫的方法,要調(diào)用被隱 藏的方法則必須使用藏的方法則必須使用super關(guān)鍵字關(guān)鍵字 重寫的方法既可以操作繼承的成員變量,也可以操作子重寫的方法既可以操作繼承的成員變量,也可以操作子 類聲明定義的成員變量類聲明定義的成員變量 子類通過方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽宰宇愅ㄟ^方法的重寫可以把父類的狀態(tài)和行為改變?yōu)樽?身的狀態(tài)和行為身的狀態(tài)和行為

20、 方法重寫方法重寫例例5-4 【Method1.java】 class A int x; void setX( ) x=0; class B extends A int x; /隱藏了父類的隱藏了父類的 x x void setX( ) x=5; 5.4.2 方法的覆蓋(重寫 override) 注意:注意: 從從JDK5.0開始,在重寫方法時(shí)可以返回父類方法開始,在重寫方法時(shí)可以返回父類方法 返回值類型的子類型返回值類型的子類型 例子:例子:Chicken.java 5.4.2 方法的覆蓋(重寫 override) 5.4.2 方法的覆蓋(重寫 override) 方法重寫的兩種方法重寫的兩

21、種失敗失敗情況:情況: 方法名相同,參數(shù)個(gè)數(shù)和類型相同,但返回類型不同方法名相同,參數(shù)個(gè)數(shù)和類型相同,但返回類型不同(或或 不是父類方法返回類型的子類不是父類方法返回類型的子類),出現(xiàn),出現(xiàn)編譯錯(cuò)誤編譯錯(cuò)誤 方法名相同,參數(shù)個(gè)數(shù)和類型有不同,稱為重載的方法方法名相同,參數(shù)個(gè)數(shù)和類型有不同,稱為重載的方法 重寫父類方法時(shí),不可以降低方法的訪問權(quán)限重寫父類方法時(shí),不可以降低方法的訪問權(quán)限 父類中的一個(gè)靜態(tài)方法可以由子類中的另一個(gè)靜態(tài)方法父類中的一個(gè)靜態(tài)方法可以由子類中的另一個(gè)靜態(tài)方法 所遮蔽,但不能用一個(gè)非靜態(tài)方法來覆蓋一個(gè)靜態(tài)方法所遮蔽,但不能用一個(gè)非靜態(tài)方法來覆蓋一個(gè)靜態(tài)方法 5.4.3 訪問

22、修飾符protected的進(jìn)一步說明 一個(gè)類一個(gè)類A A中的中的protectedprotected成員變量和方法可以被它的直接子類成員變量和方法可以被它的直接子類 和間接子類繼承,比如和間接子類繼承,比如B B是是A A的子類,的子類,C C是是B B的子類的子類 ,D D又是又是C C 的子類,那么的子類,那么B B、C C和和D D類都繼承了類都繼承了A A的的 protectedprotected成員變量和成員變量和 方法。方法。 如果用如果用D D類在類在D D本身中創(chuàng)建了一個(gè)本身中創(chuàng)建了一個(gè)D D類的對(duì)象(類的對(duì)象(在在D D中創(chuàng)建中創(chuàng)建A A的的 對(duì)象不一定能訪問對(duì)象不一定能訪問

23、protectedprotected成員,取決于成員,取決于A A和和D D是否在同一是否在同一 個(gè)包個(gè)包),那么該對(duì)象總是可以通過),那么該對(duì)象總是可以通過“.”.”運(yùn)算符訪問繼承的運(yùn)算符訪問繼承的 或自己定義的或自己定義的protectedprotected變量和變量和protectedprotected方法的,但是,如方法的,但是,如 果在另外一個(gè)類中,比如果在另外一個(gè)類中,比如E E類,用類,用D D類創(chuàng)建了一個(gè)對(duì)象類創(chuàng)建了一個(gè)對(duì)象objectobject, 該對(duì)象通過該對(duì)象通過“.”.”運(yùn)算符訪問運(yùn)算符訪問protectedprotected變量和變量和protectedprotec

24、ted方方 法的權(quán)限如下列(法的權(quán)限如下列(a a)、()、(b b)所述。)所述。 (a a)子類)子類D D的的protectedprotected成員變量和方法,如果不是從成員變量和方法,如果不是從 父類繼承來的,父類繼承來的,objectobject訪問這些訪問這些protectedprotected成員變量和方法成員變量和方法 時(shí),只要時(shí),只要E E類和類和D D類在同一個(gè)包中就可以了。類在同一個(gè)包中就可以了。 (b b)如果子類)如果子類D D的對(duì)象的的對(duì)象的protectedprotected成員變量或成員變量或 protectedprotected方法是從父類繼承的,那么就要一

25、直追溯到該方法是從父類繼承的,那么就要一直追溯到該 protectedprotected成員變量或方法的成員變量或方法的“祖先祖先”類,即類,即A A類,如果類,如果E E類類 和和A A類在同一個(gè)包中,類在同一個(gè)包中,objectobject對(duì)象能訪問繼承的對(duì)象能訪問繼承的protectedprotected 變量和變量和protectedprotected方法。方法。 例子:例子:ProtectRightProtectRight ProtectSubProtectSub this this用來引用當(dāng)前變量和方法。用來引用當(dāng)前變量和方法。 訪問成員變量。訪問成員變量。 如:this.vari

26、able; 調(diào)用方法。調(diào)用方法。 如:this.Method(paramlist); 調(diào)用類的其他構(gòu)造方法。調(diào)用類的其他構(gòu)造方法。 如:this(paramlist); 5.5 關(guān)鍵字super java中通過中通過super來實(shí)現(xiàn)對(duì)來實(shí)現(xiàn)對(duì)父類成員父類成員的訪問,的訪問,super用用 來引用當(dāng)前對(duì)象的父類。來引用當(dāng)前對(duì)象的父類。 訪問父類被隱藏的成員變量。訪問父類被隱藏的成員變量。 如:super.variable; 調(diào)用父類中被重寫的方法。調(diào)用父類中被重寫的方法。 如:super.Method(paramlist); 調(diào)用父類的構(gòu)造方法。調(diào)用父類的構(gòu)造方法。 如:super(paraml

27、ist); 例例5-6 、Inheritance. java 、SuperTest.java 5.5 關(guān)鍵字super 注意:注意: 如果在父類中沒有無參數(shù)的構(gòu)造函數(shù),則在子如果在父類中沒有無參數(shù)的構(gòu)造函數(shù),則在子 類的構(gòu)造函數(shù)中必須用類的構(gòu)造函數(shù)中必須用super顯式調(diào)用父類的顯式調(diào)用父類的 某個(gè)構(gòu)造函數(shù)某個(gè)構(gòu)造函數(shù) 例子:例子:RDemoTest.java 5.5 關(guān)鍵字super 一種常見的做法是子類中的一個(gè)覆蓋得到的方法完成一一種常見的做法是子類中的一個(gè)覆蓋得到的方法完成一 些預(yù)備的工作,然后再交由父類中的覆蓋方法來完成任些預(yù)備的工作,然后再交由父類中的覆蓋方法來完成任 務(wù)務(wù) clas

28、s Animal void eat (Food f) /消化食物消化食物 class Cat extends Animal void eat (Food f) / 檢查是否可信用檢查是否可信用 super.eat(f); 5.6 final 類和final方法 final final類不能被繼承,即不能有子類,如:類不能被繼承,即不能有子類,如: final class A final class A 一個(gè)方法被修飾為一個(gè)方法被修飾為finalfinal方法,則這個(gè)方法不能被重寫,即方法,則這個(gè)方法不能被重寫,即 不允許子類通過重寫隱藏繼承的不允許子類通過重寫隱藏繼承的finalfinal方法

29、。方法。 5.7 對(duì)象的上轉(zhuǎn)型對(duì)象 假設(shè),假設(shè),B B是是A A的子類或間接子類,當(dāng)我們用子類的子類或間接子類,當(dāng)我們用子類B B創(chuàng)建一個(gè)創(chuàng)建一個(gè) 對(duì)象,并把這個(gè)對(duì)象的引用放到對(duì)象,并把這個(gè)對(duì)象的引用放到A A類聲明的對(duì)象引用中時(shí),類聲明的對(duì)象引用中時(shí), 比如:比如: A aA a; B b = new B();B b = new B(); a=b; a=b; 則則a a是子類對(duì)象是子類對(duì)象b b的的上轉(zhuǎn)型對(duì)象上轉(zhuǎn)型對(duì)象,對(duì)象的上轉(zhuǎn)型對(duì)象的,對(duì)象的上轉(zhuǎn)型對(duì)象的實(shí)實(shí) 體是子類負(fù)責(zé)創(chuàng)建體是子類負(fù)責(zé)創(chuàng)建的,但上轉(zhuǎn)型對(duì)象會(huì)失去原對(duì)象的一的,但上轉(zhuǎn)型對(duì)象會(huì)失去原對(duì)象的一 些屬性和功能。些屬性和功能。 5

30、.7 對(duì)象的上轉(zhuǎn)型對(duì)象 (1 1)上轉(zhuǎn)型對(duì)象不能操作子類聲明定義的成)上轉(zhuǎn)型對(duì)象不能操作子類聲明定義的成 員變量;也不能使用子類聲明定義的方法。員變量;也不能使用子類聲明定義的方法。 (2 2)上轉(zhuǎn)型對(duì)象可以調(diào)用子類重寫的)上轉(zhuǎn)型對(duì)象可以調(diào)用子類重寫的實(shí)例實(shí)例方方 法。法。 (3 3)上轉(zhuǎn)型對(duì)象可以調(diào)用子類繼承的成員變)上轉(zhuǎn)型對(duì)象可以調(diào)用子類繼承的成員變 量和隱藏的成員變量。量和隱藏的成員變量。 (4 4)可以將對(duì)象的上轉(zhuǎn)型對(duì)象再強(qiáng)制轉(zhuǎn)換到)可以將對(duì)象的上轉(zhuǎn)型對(duì)象再強(qiáng)制轉(zhuǎn)換到 一個(gè)子類對(duì)象,這時(shí),該子類對(duì)象又具備了子類一個(gè)子類對(duì)象,這時(shí),該子類對(duì)象又具備了子類 所有屬性和功能所有屬性和功能 (

31、5 5)如果子類重寫了父類中的)如果子類重寫了父類中的類類方法,通過方法,通過 上轉(zhuǎn)型對(duì)象引用的是父類中的類方法上轉(zhuǎn)型對(duì)象引用的是父類中的類方法 對(duì)象的上轉(zhuǎn)型對(duì)象 可以將對(duì)象的上轉(zhuǎn)型對(duì)象再可以將對(duì)象的上轉(zhuǎn)型對(duì)象再強(qiáng)制轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換到一個(gè)子類對(duì)象,這時(shí),到一個(gè)子類對(duì)象,這時(shí), 該子類對(duì)象又具備了子類所有屬性和功能。該子類對(duì)象又具備了子類所有屬性和功能。 例子例子 Example8.java 不要將父類創(chuàng)建的對(duì)象和子類對(duì)象的上轉(zhuǎn)型對(duì)象混淆。不要將父類創(chuàng)建的對(duì)象和子類對(duì)象的上轉(zhuǎn)型對(duì)象混淆。 子類對(duì)象子類對(duì)象 對(duì)象的上轉(zhuǎn)型對(duì)象對(duì)象的上轉(zhuǎn)型對(duì)象 繼承或隱藏的成員變量繼承或隱藏的成員變量 繼承或覆蓋的方法繼

32、承或覆蓋的方法 新增的變量新增的變量 新增的方法新增的方法 上轉(zhuǎn)型對(duì)象的特點(diǎn)圖上轉(zhuǎn)型對(duì)象的特點(diǎn)圖 5.15 內(nèi)部類(Inner Class) 內(nèi)部類內(nèi)部類 匿名類匿名類 1 內(nèi)部類 定義:內(nèi)部類是在一個(gè)類的內(nèi)部嵌套定義的類。定義:內(nèi)部類是在一個(gè)類的內(nèi)部嵌套定義的類。 范圍:范圍: 可以是其它類的成員可以是其它類的成員 在一個(gè)語句塊的內(nèi)部定義在一個(gè)語句塊的內(nèi)部定義 在表達(dá)式內(nèi)部匿名定義在表達(dá)式內(nèi)部匿名定義 特性:特性: 一般用在定義它的類或語句塊之內(nèi),在外部引用它一般用在定義它的類或語句塊之內(nèi),在外部引用它 時(shí)必須給出時(shí)必須給出完整的名稱完整的名稱,名字不能與包含它的類名,名字不能與包含它的類名

33、 相同。相同。 內(nèi)部類的特性 可以聲明為可以聲明為abstract 、public、private、default或或 protected 。 內(nèi)部類都是一個(gè)獨(dú)立的類,編譯完后的內(nèi)部類都是一個(gè)獨(dú)立的類,編譯完后的.class文件名以文件名以“外外 部類類名部類類名$內(nèi)部類類名內(nèi)部類類名.class”的形式出現(xiàn)的形式出現(xiàn) 編譯如下例子:編譯如下例子: class Animal class Brain 編譯生成了兩個(gè)編譯生成了兩個(gè).class文件:文件:Animal.class和和 Animal$Brain.class ; 編譯器將內(nèi)部類創(chuàng)建為一個(gè)正常的頂級(jí)類,并為之命名編譯器將內(nèi)部類創(chuàng)建為一個(gè)正

34、常的頂級(jí)類,并為之命名 內(nèi)部類(Inner Class) 定義:內(nèi)部類是在一個(gè)類的內(nèi)部嵌套定義的類。定義:內(nèi)部類是在一個(gè)類的內(nèi)部嵌套定義的類。 種類:種類: 非靜態(tài)內(nèi)部類:作為類的成員非靜態(tài)內(nèi)部類:作為類的成員 靜態(tài)內(nèi)部類:作為類的靜態(tài)成員靜態(tài)內(nèi)部類:作為類的靜態(tài)成員 局部內(nèi)部類:存在某個(gè)方法內(nèi)部的類局部內(nèi)部類:存在某個(gè)方法內(nèi)部的類 匿名類:存在某個(gè)類的內(nèi)部,但無名稱的類匿名類:存在某個(gè)類的內(nèi)部,但無名稱的類 1.非靜態(tài)內(nèi)部類 非靜態(tài)成員內(nèi)部類作為外部類或外部接口的成員,非靜態(tài)成員內(nèi)部類作為外部類或外部接口的成員, 不帶有關(guān)鍵字不帶有關(guān)鍵字static。 定義非靜態(tài)成員內(nèi)部類等同于定義一個(gè)類的

35、非靜定義非靜態(tài)成員內(nèi)部類等同于定義一個(gè)類的非靜 態(tài)成員屬性或方法態(tài)成員屬性或方法 1.非靜態(tài)內(nèi)部類 非靜態(tài)成員內(nèi)部類有如下性質(zhì)非靜態(tài)成員內(nèi)部類有如下性質(zhì) (1) 在非靜態(tài)成員內(nèi)部類中,如果是訪問自己定義的屬在非靜態(tài)成員內(nèi)部類中,如果是訪問自己定義的屬 性,可以直接訪問,也可以通過性,可以直接訪問,也可以通過this關(guān)鍵字來訪問。關(guān)鍵字來訪問。 1.非靜態(tài)內(nèi)部類 非靜態(tài)成員內(nèi)部類有如下性質(zhì)非靜態(tài)成員內(nèi)部類有如下性質(zhì) (2) 在非靜態(tài)成員內(nèi)部類中,可以訪問外部類的所有在非靜態(tài)成員內(nèi)部類中,可以訪問外部類的所有 成員,包括成員,包括private修飾的以及修飾的以及靜態(tài)成員靜態(tài)成員。 1.非靜態(tài)內(nèi)部

36、類 非靜態(tài)成員內(nèi)部類有如下性質(zhì)非靜態(tài)成員內(nèi)部類有如下性質(zhì) (3) 在非靜態(tài)成員內(nèi)部類中,如果外部類和內(nèi)部類定義的屬在非靜態(tài)成員內(nèi)部類中,如果外部類和內(nèi)部類定義的屬 性同名,可以通過性同名,可以通過“外部類類名外部類類名.this.外部類成員變量名外部類成員變量名” 的形式來訪問。的形式來訪問。 1.非靜態(tài)成員內(nèi)部類 非靜態(tài)成員內(nèi)部類有如下性質(zhì)非靜態(tài)成員內(nèi)部類有如下性質(zhì) (4) 在非靜態(tài)成員內(nèi)部類中,不能聲明靜態(tài)成員。在非靜態(tài)成員內(nèi)部類中,不能聲明靜態(tài)成員。 1.非靜態(tài)成員內(nèi)部類 非靜態(tài)成員內(nèi)部類的實(shí)例化非靜態(tài)成員內(nèi)部類的實(shí)例化 只有創(chuàng)建了外部類對(duì)象的情況下才能創(chuàng)建非只有創(chuàng)建了外部類對(duì)象的情況下

37、才能創(chuàng)建非靜態(tài)靜態(tài)內(nèi)部內(nèi)部 類對(duì)象類對(duì)象。 2. 靜態(tài)內(nèi)部類 用用static修飾的內(nèi)部類叫靜態(tài)內(nèi)部類修飾的內(nèi)部類叫靜態(tài)內(nèi)部類 靜態(tài)內(nèi)部類相當(dāng)于是一個(gè)外部定義的類,可聲明靜態(tài)成員或非靜態(tài)內(nèi)部類相當(dāng)于是一個(gè)外部定義的類,可聲明靜態(tài)成員或非 靜態(tài)成員靜態(tài)成員 2. 靜態(tài)內(nèi)部類 靜態(tài)內(nèi)部類可以被視為頂層類的靜態(tài)成員,可在不創(chuàng)建頂層類靜態(tài)內(nèi)部類可以被視為頂層類的靜態(tài)成員,可在不創(chuàng)建頂層類 對(duì)象的情況下被使用,這是與非靜態(tài)內(nèi)部類的區(qū)別對(duì)象的情況下被使用,這是與非靜態(tài)內(nèi)部類的區(qū)別 2. 靜態(tài)內(nèi)部類 靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)變量或靜態(tài)方法,非靜態(tài)的靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)變量或靜態(tài)方法,非靜態(tài)的 不能訪問不能訪問 2. 靜態(tài)內(nèi)部類 靜態(tài)內(nèi)部類可以作為接口的一部分靜態(tài)內(nèi)部類可以作為接口的一部分 3. 局部內(nèi)部類 局部內(nèi)部類也叫方法內(nèi)部類,即在方法內(nèi)部定義的內(nèi)部類局部內(nèi)部類也叫方法內(nèi)部類,即在方法內(nèi)部定義的內(nèi)部類 不能用訪問修飾符修飾,只能加不能用訪問修飾符修飾,只能加final、abstract修飾修飾 3. 局部內(nèi)部類 局部內(nèi)部類有如下性質(zhì)局部內(nèi)部類有如下性質(zhì) (1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論