版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第5章章 類與類的關(guān)系類與類的關(guān)系 5.1 類與類的關(guān)系類與類的關(guān)系 5.2 類的繼承類的繼承 5.3抽象類與抽象方法抽象類與抽象方法 5.4接口接口 5.5包包 5.1 類與類的關(guān)系類與類的關(guān)系 使用關(guān)系使用關(guān)系 包含關(guān)系包含關(guān)系 繼承關(guān)系繼承關(guān)系 類間的使用關(guān)系類間的使用關(guān)系 當(dāng)類當(dāng)類A需要從需要從 B類對象中獲得信息時(shí),稱類類對象中獲得信息時(shí),稱類A與類與類B之間存在使用關(guān)系。一般情況下,之間存在使用關(guān)系。一般情況下,當(dāng)在類當(dāng)在類A的一個(gè)方法中創(chuàng)建、接收或返回類的一個(gè)方法中創(chuàng)建、接收或返回類B的對象時(shí),稱類的對象時(shí),稱類A使用類使用類B。 TestPerson.javagetName(
2、)setName()main()創(chuàng)建Person類對象調(diào)用Person類的方法TestPerson類Person類使用包含關(guān)系包含關(guān)系 當(dāng)類當(dāng)類A中的一個(gè)屬性是類中的一個(gè)屬性是類B的對象時(shí),稱類的對象時(shí),稱類A與類與類B存在包含關(guān)系,包容關(guān)系是一個(gè)存在包含關(guān)系,包容關(guān)系是一個(gè)“有有一個(gè)一個(gè)”關(guān)系,如果類關(guān)系,如果類A包含類包含類B,可以稱類,可以稱類A中有一個(gè)類中有一個(gè)類B。 例如例如car類和類和engine類類 /域定義Engine e;int speed;Engine類Car類包含繼承關(guān)系繼承關(guān)系 繼承是面向?qū)ο蟮囊粋€(gè)重要特性,當(dāng)類繼承是面向?qū)ο蟮囊粋€(gè)重要特性,當(dāng)類A是是類類B的特例時(shí),
3、稱類的特例時(shí),稱類A繼承了類繼承了類B。子類與父。子類與父類之間存在類之間存在“是一個(gè)是一個(gè)”的關(guān)系,子類繼承自的關(guān)系,子類繼承自父類,因此子類也是一個(gè)父類。父類,因此子類也是一個(gè)父類。 吉普車是汽車的一個(gè)特例,它具有汽車的屬吉普車是汽車的一個(gè)特例,它具有汽車的屬性,同時(shí)具有自己的一些特性。性,同時(shí)具有自己的一些特性。 Employer類Manager類5.2 類的繼承類的繼承 存在兩個(gè)類:類存在兩個(gè)類:類A與類與類B,如果類如果類B中擁有類中擁有類A中所中所有的域與方法,有的域與方法,就稱這兩個(gè)類之間存在繼承關(guān)系,就稱這兩個(gè)類之間存在繼承關(guān)系,并稱類并稱類B繼承于類繼承于類A。其中,類。其中
4、,類B被稱為子類,類被稱為子類,類A叫做超類(叫做超類(superclass),也叫做基類(),也叫做基類(base class)或父類()或父類(parent class)。)。 子類繼承父類的屬性時(shí),不能改變父類中類成員子類繼承父類的屬性時(shí),不能改變父類中類成員的訪問權(quán)限,即繼承自父類中類成員的權(quán)限在子的訪問權(quán)限,即繼承自父類中類成員的權(quán)限在子類中仍然保持不變。類中仍然保持不變。 生物類鳥類人類植物類動物類農(nóng)民工人.自然界生物類的繼承關(guān)系圖 子類的創(chuàng)建和使用子類的創(chuàng)建和使用 類繼承是用關(guān)鍵字類繼承是用關(guān)鍵字extends來實(shí)現(xiàn)的來實(shí)現(xiàn)的 public class Worker extend
5、s Person 子類父類TestInheritance.java 域:x1,x2,x3方法:add_x1, add_x2, add_x3,get_x3,get_x3方法:sub_x1,sub_x2,sub_x3域:x1,x2,x3方法:add_x1, add_x2, add_x3,get_x3,get_x3SuperAClassB類繼承的傳遞性類繼承的傳遞性 類繼承具有傳遞性,如果類類繼承具有傳遞性,如果類B繼承類繼承類A,而,而類類C又繼承類又繼承類B,那么類,那么類C中不僅擁有類中不僅擁有類B中中的所有成員,還擁有類的所有成員,還擁有類A中的所有成員。中的所有成員。 域的隱藏域的隱藏 父
6、類父類A和子類和子類B中都定義了名稱相同的成員變量中都定義了名稱相同的成員變量x,稱為域的隱藏。稱為域的隱藏。 在域的隱藏中,子類和父類中的該變量名稱必須在域的隱藏中,子類和父類中的該變量名稱必須相同,而變量的類型可以不同相同,而變量的類型可以不同 JavaJava規(guī)定,當(dāng)執(zhí)行從父類繼承的方法時(shí),處理的規(guī)定,當(dāng)執(zhí)行從父類繼承的方法時(shí),處理的是繼承自父類的變量;當(dāng)子類執(zhí)行由自己定義的是繼承自父類的變量;當(dāng)子類執(zhí)行由自己定義的方法時(shí),處理的是自己定義的成員變量,而將繼方法時(shí),處理的是自己定義的成員變量,而將繼承自父類的名稱相同的域隱藏起來。承自父類的名稱相同的域隱藏起來。 class A int
7、x=3; public void m() x+; System.out.println(“the x of A is ”+x); class B extends A int x=20; public void n() x-; System.out.println(“the x of B is ”+x); class Bint x;int x; /從類從類A繼承的域繼承的域 public void m() /從類從類A繼承方法繼承方法 x+; System.out.print(“the x of A is ”+x);public void n() x-; System.out.println(“
8、the x of B is ”+x); 等價(jià)于等價(jià)于/類類A的的x/類類B的的x域的隱藏域的隱藏 類中發(fā)生域的隱藏后,子類中的域覆蓋了父類中發(fā)生域的隱藏后,子類中的域覆蓋了父類中同名的域,如果想要訪問被隱藏的域,類中同名的域,如果想要訪問被隱藏的域,必須在域前面添加前綴,前綴用關(guān)鍵字必須在域前面添加前綴,前綴用關(guān)鍵字super加圓點(diǎn)操作符。加圓點(diǎn)操作符。 B.javaB.java 方法的覆蓋方法的覆蓋 方法的覆蓋是在子類和父類中方法名相同、參數(shù)方法的覆蓋是在子類和父類中方法名相同、參數(shù)表相同和返回值類型相同的方法,這時(shí),子類中表相同和返回值類型相同的方法,這時(shí),子類中的方法將會覆蓋父類中的同名
9、方法。的方法將會覆蓋父類中的同名方法。 子類和父類中的方法必須滿足以下三個(gè)條件才能子類和父類中的方法必須滿足以下三個(gè)條件才能實(shí)現(xiàn)方法的覆蓋:實(shí)現(xiàn)方法的覆蓋: 相同的方法名 相同的方法返回類型 相同的參數(shù)表,即參數(shù)的個(gè)數(shù)、順序和參數(shù)的類型必須完全相同。 super關(guān)鍵字關(guān)鍵字 關(guān)鍵字關(guān)鍵字super在在Java中,表示當(dāng)前對象的直中,表示當(dāng)前對象的直接父類,是當(dāng)前對象的直接父類對象的引用。接父類,是當(dāng)前對象的直接父類對象的引用。在類繼承中,使用super關(guān)鍵字可以訪問超類中子類隱藏的域和被子類覆蓋的方法。程序V.java 繼承關(guān)系中的構(gòu)造方法繼承關(guān)系中的構(gòu)造方法 在類繼承過程中,子類繼承了父類的
10、所有成在類繼承過程中,子類繼承了父類的所有成員,但是子類不能顯式使用父類的構(gòu)造方法。員,但是子類不能顯式使用父類的構(gòu)造方法。 例如:例如: V b = new A(); /V b = new A(); /錯誤的用法錯誤的用法 子類對父類構(gòu)造方法的繼承遵循下面的子類對父類構(gòu)造方法的繼承遵循下面的規(guī)則:規(guī)則: 創(chuàng)建子類對象實(shí)例時(shí),系統(tǒng)可以自動調(diào)用父類的無參數(shù)構(gòu)造方法初始化屬于父類的數(shù)據(jù)。 對于父類中帶參數(shù)的構(gòu)造方法,系統(tǒng)不能自動調(diào)用它們,只能通過在子類構(gòu)造方法中使用關(guān)鍵字super進(jìn)行調(diào)用,并且,super語句必須是子類構(gòu)造方法中的第一個(gè)可執(zhí)行語句 UseConstru.java 類對象之間的類型
11、轉(zhuǎn)換類對象之間的類型轉(zhuǎn)換 類作為一種復(fù)合數(shù)據(jù)類型,與基本數(shù)據(jù)類型類作為一種復(fù)合數(shù)據(jù)類型,與基本數(shù)據(jù)類型的變量一樣,不同類型的類對象之間也可以的變量一樣,不同類型的類對象之間也可以進(jìn)行類型轉(zhuǎn)換。類型轉(zhuǎn)換也分為顯式類型轉(zhuǎn)進(jìn)行類型轉(zhuǎn)換。類型轉(zhuǎn)換也分為顯式類型轉(zhuǎn)換和隱式類型轉(zhuǎn)換。換和隱式類型轉(zhuǎn)換。 類型轉(zhuǎn)換只能在父類對象和子類對象之間進(jìn)類型轉(zhuǎn)換只能在父類對象和子類對象之間進(jìn)行行 父類與子類對象之間的類型轉(zhuǎn)換規(guī)則是:父類與子類對象之間的類型轉(zhuǎn)換規(guī)則是: 類對象轉(zhuǎn)換為父類類型時(shí),可以進(jìn)行隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換。父類對象轉(zhuǎn)換為子類類型時(shí),必須進(jìn)行顯式類型轉(zhuǎn)換。例如:B ref_b,b = new B()
12、;A a;a=b;ref_b=(B)a; 類型轉(zhuǎn)換的一個(gè)問題類型轉(zhuǎn)換的一個(gè)問題 如果在程序中創(chuàng)建父類如果在程序中創(chuàng)建父類A的對象,將它進(jìn)行的對象,將它進(jìn)行類型轉(zhuǎn)換為子類類型類型轉(zhuǎn)換為子類類型B。雖然編譯時(shí)不會出。雖然編譯時(shí)不會出錯,運(yùn)行時(shí)將會拋出一個(gè)異常。錯,運(yùn)行時(shí)將會拋出一個(gè)異常。 Java.lang.ClassCastException 將將D.java改為如下代碼:改為如下代碼:class D public static void main(String args) B ref_b; A a = new A(); ref_b=(B)a; class D public static voi
13、d main(String args) B ref_b; B b = new B(); A a; a=b; ref_b=(B)a; 類型轉(zhuǎn)換的一個(gè)問題類型轉(zhuǎn)換的一個(gè)問題 為了避免這種情況發(fā)生,可以采用為了避免這種情況發(fā)生,可以采用instanceof運(yùn)算符來檢查對象是不是要轉(zhuǎn)換運(yùn)算符來檢查對象是不是要轉(zhuǎn)換類的實(shí)例。將上面類類的實(shí)例。將上面類D的代碼改為如下代碼,的代碼改為如下代碼,在進(jìn)行類型轉(zhuǎn)換時(shí),先進(jìn)行類型檢查,避免在進(jìn)行類型轉(zhuǎn)換時(shí),先進(jìn)行類型檢查,避免了異常的發(fā)生:了異常的發(fā)生:class D public static void main(String args) B ref_b; A
14、a = new A(); if (a instanceof B) ref_b=(B)a; System.out.println(a.x=+a.x); System.out.println(ref_b.x=+ref_b.x+, ref_b.y= +ref_b.y); 抽象類與抽象方法抽象類與抽象方法 在面向?qū)ο蟪绦蛟O(shè)計(jì)中,越是處在繼承結(jié)構(gòu)在面向?qū)ο蟪绦蛟O(shè)計(jì)中,越是處在繼承結(jié)構(gòu)的頂層的類,就越概括、越抽象。我們常常的頂層的類,就越概括、越抽象。我們常常需要定義一些表示抽象概念的類,這些類為需要定義一些表示抽象概念的類,這些類為子類提供一個(gè)實(shí)現(xiàn)框架,本身卻不能提供具子類提供一個(gè)實(shí)現(xiàn)框架,本身卻不能提
15、供具體的實(shí)例體的實(shí)例, ,這稱為抽象類。這稱為抽象類。 JavaJava中用關(guān)鍵字中用關(guān)鍵字abstractabstract表示抽象意義,表示抽象意義,abstractabstract可以修飾類和方法??梢孕揎楊惡头椒?。 抽象類與抽象方法抽象類與抽象方法 用用abstract修飾的方法稱為抽象方法,抽象修飾的方法稱為抽象方法,抽象方法只有方法頭,沒有方法體定義,也就是方法只有方法頭,沒有方法體定義,也就是說,抽象方法沒有具體的實(shí)現(xiàn)。說,抽象方法沒有具體的實(shí)現(xiàn)。 用用abstract修飾的類稱為抽象類,抽象類是修飾的類稱為抽象類,抽象類是一種沒有完全實(shí)現(xiàn)的類,即在抽象類中擁有一種沒有完全實(shí)現(xiàn)的類
16、,即在抽象類中擁有抽象方法。包含抽象方法的類必須被聲明為抽象方法。包含抽象方法的類必須被聲明為抽象類,并且不能用抽象類聲明具體的實(shí)例抽象類,并且不能用抽象類聲明具體的實(shí)例對象。對象。抽象類抽象類 抽象類是本身不能被實(shí)例化的類,它只能作抽象類是本身不能被實(shí)例化的類,它只能作為其它類的超類。為其它類的超類。 在面向?qū)ο缶幊讨?,抽象類的設(shè)計(jì)是為了使在面向?qū)ο缶幊讨?,抽象類的設(shè)計(jì)是為了使程序的結(jié)構(gòu)更加清晰,功能更加明確。程序的結(jié)構(gòu)更加清晰,功能更加明確。 例例如:如:GSMGSM手機(jī)用戶管理系統(tǒng)中用戶類的設(shè)計(jì)。手機(jī)用戶管理系統(tǒng)中用戶類的設(shè)計(jì)。 GsmUserPostGsmUserPreGsmUser抽
17、象類的特點(diǎn)抽象類的特點(diǎn) 是一種非完整類,它不能實(shí)例化一個(gè)對象是一種非完整類,它不能實(shí)例化一個(gè)對象 抽象類定義時(shí)被關(guān)鍵字抽象類定義時(shí)被關(guān)鍵字abstractabstract修飾。修飾。 抽象類中不一定擁有抽象方法,但擁有抽象抽象類中不一定擁有抽象方法,但擁有抽象方法的類一定是抽象類。方法的類一定是抽象類。 如果抽象類的子類不是抽象的,它必須實(shí)現(xiàn)如果抽象類的子類不是抽象的,它必須實(shí)現(xiàn)抽象類中的所有抽象方法。抽象類中的所有抽象方法。抽象方法抽象方法 抽象方法是在抽象類中只有方法頭而沒有方抽象方法是在抽象類中只有方法頭而沒有方法體的方法。例如:法體的方法。例如: public abstract boo
18、lean dial(); 利用抽象方法,抽象類可以提供一個(gè)完整的利用抽象方法,抽象類可以提供一個(gè)完整的編程界面,即在抽象類中提供子類中需要實(shí)編程界面,即在抽象類中提供子類中需要實(shí)現(xiàn)的方法的聲明,而將方法的實(shí)現(xiàn)細(xì)節(jié)留給現(xiàn)的方法的聲明,而將方法的實(shí)現(xiàn)細(xì)節(jié)留給子類實(shí)現(xiàn)。子類實(shí)現(xiàn)。 定義抽象方法時(shí),需要注意:定義抽象方法時(shí),需要注意: 抽象方法必須在抽象類中進(jìn)行定義。抽象方法必須在抽象類中進(jìn)行定義。 不能用關(guān)鍵字不能用關(guān)鍵字abstract來修飾構(gòu)造方法來修飾構(gòu)造方法 關(guān)鍵字關(guān)鍵字static和和private不能與不能與abstract組合組合使用。使用。 關(guān)鍵字關(guān)鍵字final不能與不能與abst
19、ract組合使用。組合使用。 接口接口 接口(接口(interface)與類相似,它是)與類相似,它是Java中中的一種復(fù)合數(shù)據(jù)類型。界面也稱為一種特殊的一種復(fù)合數(shù)據(jù)類型。界面也稱為一種特殊的、完全沒有實(shí)現(xiàn)的類,的、完全沒有實(shí)現(xiàn)的類, 與抽象類不同,接口中定義的所有方法都是與抽象類不同,接口中定義的所有方法都是抽象方法,并且接口中定義的所有域都是常抽象方法,并且接口中定義的所有域都是常量。量。 接口接口定義的語法如下:定義的語法如下:public interface interfaceName extends superinterface1, superinterface2,superinte
20、rfacen/界面體界面體 /域定義域定義 publicstaticfinal type constName = constValue; /方法定義方法定義 p u b l i c a b s t r a c t r e t u r n t y p e functionName(pariList)throws exceptionList;包包 包是一組相關(guān)類和接口的集合。不同于繼承、包是一組相關(guān)類和接口的集合。不同于繼承、包含關(guān)系,包內(nèi)的類之間具有松散的使用關(guān)包含關(guān)系,包內(nèi)的類之間具有松散的使用關(guān)系。系。 可以對復(fù)雜系統(tǒng)中大量的類和接口進(jìn)方便地、可以對復(fù)雜系統(tǒng)中大量的類和接口進(jìn)方便地、有效的管
21、理,提高了類和接口的安全性,更有效的管理,提高了類和接口的安全性,更好地體現(xiàn)類的封裝特性好地體現(xiàn)類的封裝特性 Java中對包的管理類似于操作系統(tǒng)中對文件中對包的管理類似于操作系統(tǒng)中對文件系統(tǒng)的目錄管理。系統(tǒng)的目錄管理。Java中通過多個(gè)層次的包中通過多個(gè)層次的包把各種類文件(后綴為把各種類文件(后綴為.class的類文件)組的類文件)組織在一起,包的層次在計(jì)算機(jī)中保存為目錄。織在一起,包的層次在計(jì)算機(jī)中保存為目錄。 在包語句中,用圓點(diǎn)(在包語句中,用圓點(diǎn)(.)指明包的層次。例)指明包的層次。例如,如下的包語句:如,如下的包語句: package java.io.event; 表示java.io
22、.event包內(nèi)的類文件存儲在目錄 javaawtevent下。包的創(chuàng)建包的創(chuàng)建 Java中,包的定義用關(guān)鍵字中,包的定義用關(guān)鍵字package實(shí)現(xiàn),包定實(shí)現(xiàn),包定義的語法如下:義的語法如下: package pk1.pk2pk3 pk1,pk2等為包的名字,方括號等為包的名字,方括號 中的內(nèi)容是可中的內(nèi)容是可選的,采用圓點(diǎn)(選的,采用圓點(diǎn)(.)表示包的層次。)表示包的層次。 例:例: package mypk; class ExtenComputeE. class ComputeE. 表示定義了一個(gè)名為表示定義了一個(gè)名為mypk的包,它將的包,它將ExtenComputeE類和類和 Comp
23、uteE類都封裝在包類都封裝在包mypk中中 。包的引用包的引用1.采用前綴包名法,是在要引用其它的類名前面,添加這個(gè)類所屬的包名采用前綴包名法,是在要引用其它的類名前面,添加這個(gè)類所屬的包名和圓點(diǎn)操作符(和圓點(diǎn)操作符(.)。例如:)。例如:/ AcPublicclass.javapublic class AcPublicclass public static void main(String a) mypack.t.PublicClass m = new mypack.t.PublicClass(); /添添加包名前綴加包名前綴 pc.changex(2.0f); System.out.pr
24、intln(pc.i = +pc.i); pc.i+; System.out.println(pc.i = +pc.i); 程序中程序中AcPublicclass,需要使用,需要使用PublicClass類,在創(chuàng)建該類對象的類,在創(chuàng)建該類對象的時(shí)候,需要使用包名做前綴來定位時(shí)候,需要使用包名做前綴來定位PublicClass類。前綴包名法很少使類。前綴包名法很少使用,一般用來區(qū)別不同包中的同名類。用,一般用來區(qū)別不同包中的同名類。包的引用包的引用2. 用引入語句也可以使用其它包中的類,引入語句用關(guān)鍵字用引入語句也可以使用其它包中的類,引入語句用關(guān)鍵字import實(shí)現(xiàn),實(shí)現(xiàn),實(shí)現(xiàn)語法如下:實(shí)現(xiàn)語法如下:import packageName.Classname;packageName為要引入類所屬包的名字,為要引入類所屬包的名字,Classname為類的名字。為類的名字。前面的程序前面的程序AcPublicclass.java用引入語句實(shí)現(xiàn)如下:用引入語句實(shí)現(xiàn)如下:im
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版二零二五年度教育信息化設(shè)備采購合同范本4篇
- 2024送餐員電動車及裝備租賃服務(wù)合同協(xié)議3篇
- 2025版危險(xiǎn)品運(yùn)輸駕駛員聘用及福利待遇合同3篇
- 2025版信用社貸款合同貸款合同解除及終止合同3篇
- 2025版醫(yī)療器械生產(chǎn)委托合同實(shí)施細(xì)則3篇
- 二零二五年度建筑材料供應(yīng)商質(zhì)量保證與綠色環(huán)保施工協(xié)議3篇
- 2024苗木采購合同書
- 專屬經(jīng)營委托協(xié)議樣本(2024)版B版
- 2025年度智能社區(qū)安防監(jiān)控系統(tǒng)采購與實(shí)施合同3篇
- 科技助力下的城市水系保護(hù)工程
- 2024年公需科目培訓(xùn)考試題及答案
- 2024年江蘇鑫財(cái)國有資產(chǎn)運(yùn)營有限公司招聘筆試沖刺題(帶答案解析)
- 2024年遼寧石化職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
- 廣西桂林市2023-2024學(xué)年高二上學(xué)期期末考試物理試卷
- 財(cái)務(wù)指標(biāo)與財(cái)務(wù)管理
- 部編版二年級下冊道德與法治第三單元《綠色小衛(wèi)士》全部教案
- 【京東倉庫出庫作業(yè)優(yōu)化設(shè)計(jì)13000字(論文)】
- 保安春節(jié)安全生產(chǎn)培訓(xùn)
- 初一語文上冊基礎(chǔ)知識訓(xùn)練及答案(5篇)
- 血液透析水處理系統(tǒng)演示
- GB/T 27030-2006合格評定第三方符合性標(biāo)志的通用要求
評論
0/150
提交評論