Java語言程序設計基礎教程課件(第4章)_第1頁
Java語言程序設計基礎教程課件(第4章)_第2頁
Java語言程序設計基礎教程課件(第4章)_第3頁
Java語言程序設計基礎教程課件(第4章)_第4頁
Java語言程序設計基礎教程課件(第4章)_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第4章繼承、接口和內(nèi)部類繼承、超類和子類抽象類和接口內(nèi)部類Class類4.1繼承、超類和子類繼承是一種由已有的類創(chuàng)建新類的機制。運用繼承,可以先創(chuàng)建一個通用類,它定義一組相關屬性的一般特性。該類可以具體類繼承,每個具體類都增加一些自己特有的東西。被繼承的類叫超類(superclass),繼承超類的類叫子類(subclass)。子類不能繼承父類中訪問權限為private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量。Java不支持多重繼承,即一個類從多個超類派生的能力。通過繼承可實現(xiàn)代碼復用。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的4.1.1子類繼承一個類,要用extends關鍵字指定要繼承的父類。創(chuàng)建子類的一般格式為:classSubClass[extendsSuperClass]{…}classStudentsextendsPeople{}4.1.2子類的繼承子類通過隱藏父類的成員變量和重寫父類的方法,可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。例如:classSuperClass{

intx;…

voidsetX(){x=0;}…}classSubClassextendsSuperClass{

intx;

voidsetX(){

x=5;}…}隱藏了父類同名成員變量重寫了父類的同名同參方法思考:1、在定義一個類中,當局部變量和成員變量同名時,會怎么樣?如何使用同名成員變量?2、在定義一個類中,多次定義同名不同參的方法時,會怎么樣?在這些方法中,如何使用前面被定義的同名不同參的方法?

2、在定義一個子類時,當子類定義了和父類同名的成員變量和方法時,會怎么樣?如何使用父類中同名的成員變量和方法?方法重寫及重寫規(guī)則子類定義了和父類同名、同參、同返回類型的方法,稱為子類重寫了父類的方法規(guī)則:子方法的名稱、參數(shù)類型及順序、返回類型必須與重寫方法相同不能降低的重寫方法的訪問性

不能比重寫方法拋出更多的異常4.1.3super關鍵字關鍵字super表示父類對象。在子類中使用super做前綴可以引用被子類隱藏的父類變量或被子類重寫的父類方法子類不能繼承父類的構造方法,但在子類可用super關鍵字調(diào)用父類的構造方法。此時必須是方法體中第一條語句。1.Super的使用方法訪問父類被隱藏的成員變量

super.variable;調(diào)用父類中被重寫的方法super.Method([paramlist]);在子類的構造方法中,調(diào)用父類的構造方法

super([paramlist]);P86【例4-2】P87【例4-3】利用supers操作父類的構造方法。若子類在定義構造方法中,沒有使用super調(diào)用父類的某個構造方法,則系統(tǒng)默認有“super()”,即調(diào)用父類不帶參數(shù)的構造方法,產(chǎn)生一個調(diào)用父類構造函數(shù)的數(shù)據(jù)鏈。最終發(fā)生的是父類構造函數(shù)(可能幾個)將在鏈中的任何子類構造函數(shù)前執(zhí)行。Java規(guī)定如果在一個類中含有一個或多個構造方法,系統(tǒng)不提供默認的構造方法(不含參數(shù)的構造方法),所以當在父類中定義了多個構造方法時,應考慮包括一個不帶參數(shù)的構造方法,以防止子類省略super關鍵字時出現(xiàn)錯誤。對象的上轉型對象假設B類是A類子類或間接子類,當我們用子類B創(chuàng)建一個對象,并把這個對象的引用賦值給A類的對象時:Aa;Bb=newB();a=b;

稱這個A類對象:a,是子類對象b的上轉型對象

Aa=newB();對象的上轉型對象的實體是子類負責創(chuàng)建的,但上轉型對象會失去原子類對象的一些屬性和功能。對象的上轉型對象子類對象子類新增的變量子類新增的方法子類重寫或繼承的變量子類重寫或繼承的方法如果子類重寫了父類的某個方法后,對象的上轉型對象調(diào)用這個方法時,一定是調(diào)用了子類重寫的方法??梢詫ο蟮纳限D型對象再強制轉換到原子類對象(下轉換對象),這時,該子類對象又具備了子類所有屬性和功能。class動物{voidcry(){}}class狗extends動物{voidcry(){

System.out.println("汪汪.....");}}class貓extends動物{voidcry(){

System.out.println("喵喵.....");}}classExample{publicstaticvoidmain(String

args[]){

動物dongwu;

if(Math.random()>=0.5){

dongwu=new狗();

dongwu.cry();}else{

dongwu=new貓();

ongwu.cry();}}}多態(tài)性父類的某個方法被多個子類重寫時,相同的調(diào)用(上轉型對象的調(diào)用)可以產(chǎn)生各自不同的行為(結果)。動物dongwu1,dongwu2;dongwu1=new狗();dongwu2=new貓()dongwu1.cry();dongwu2.cry();instanceof

操作符用于判斷一個實例對象是否屬于一個類,即若某個實例對象是某個類或其子類的實例時,返回真格式:對象instanceof

類publicvoidmethod(Employeee){if(einstanceofManager){//Managem=(Manage)e;…}elseif(einstanceofContractor){//Contractorc=(Contractor)e;

…}else{//temporaryemployee}}在你接收父類的一個引用時,你可以通過使用Instanceof運算符判定該對象實際上是你所要的子類,并可以用向下類型轉換該引用的辦法來恢復對象的全部功能如果不用instanceof做測試,就會有類型轉換失敗的危險4.2抽象類和接口Java語言中,用abstract關鍵字修飾的類叫做抽象類用abstract關鍵字來修飾的方法叫做抽象方法含有抽象方法的類必須定義為抽象類格式如下:abstractclassabstractclass{…}abstractreturnType

abstractMethod([paramlist])為什么要定義抽象類?——圖形類4.2.1抽象類抽象類不能使用new方法進行實例化AbstractClassa1=new

AbstratClass();AbstractClassa1=newSubClass();抽象方法沒有方法體當一個方法為抽象方法時,此這個方法必須被子類的方法所重寫,否則子類也是抽象的。抽象類中不一定包含抽象方法,但是包含抽象方法的類一定要被聲明為抽象類。構造方法、靜態(tài)方法不能聲明為抽象的×√需要注意的是:抽象類不能用final來修飾,即一個類不能既是最終類又是抽象類。abstract不能與private、static、final并列修飾同一個方法。P89【例4-5】定義抽象類Animal,從抽象類派生子類Horse和Dog,實現(xiàn)父類的抽象方法。4.2.2接口接口是抽象類的一種,只包含常量和方法的定義,沒有變量,且方法都是抽象方法。為什么要用接口?:

通過接口定義不相關類的相同行為,而無需考慮這些類之間的關系。通過接口了解對象的交互界面,而無需了解對象所對應的類是如何實現(xiàn)的。請問?那些地方需要收費功能?公交車、出租車、飛機、電影院、公園等為什么不用抽象類定義?考慮機動車抽象類定義收費功能,合理嗎?機動車有轎車、卡車、客車、拖拉機等4.2.3接口的定義接口的定義包括接口聲明和接口體。接口聲明的格式如下:

[public]interface

interfaceName

[extends

SuperInterfaceList]{…}和類不同的是:一個接口可有多個父接口,用逗號隔開接口體包括常量定義和方法定義常量被實現(xiàn)該接口的多個類共享,具有public,final,static的屬性

typeNAME=value;方法體具有public和abstract屬性

returnType

methodName([paramlist]);4.2.4接口的實現(xiàn)在類的聲明中用implements子句來表示一個類實現(xiàn)某個接口,在類體中可以使用接口中定義的常量,但必須實現(xiàn)接口中定義的所有方法。P91【例4-6】接口實現(xiàn)案例4.3內(nèi)部類內(nèi)部類是在一個類的內(nèi)部定義的類,其作為外部類的一個成員,并且依附于外部類而存在內(nèi)部類根據(jù)定義的位置不同,可以作為某個類的成員(成員內(nèi)部類),也可以在一個語句塊的內(nèi)部定義(局部內(nèi)部類),還可以在表達式內(nèi)部定義(匿名內(nèi)部類)。//成員內(nèi)部類:與成員變量和方法并列publicclassOutClass{

成員變量、成員方法定義;

classInnerClass{ … }}作為外部類的一個成員存在,與外部類的屬性、方法并列//局部內(nèi)部類:方法中定義publicclassOutClass{ … publicvoidmothod(){if(true){ … classInnerClass{ … } }}publicclassOuter2{ privateint

outer_i=10; voidtest(){ Innerin=newInner();

in.display();}classInner{ privateint

inner_i=5; voiddisplay(){

System.out.println((outer_i+inner_i)); } } publicstaticvoidmain(String

args[]){Outer2outer=newOuter2();

outer.test(); }}為什么使用內(nèi)部類?當?shù)谝粋€類(外)中的程序代碼要用到第二個類(內(nèi))的實例對象,而第二個類(內(nèi))中的程序代碼又要訪問第一個類(外)中的成員,將第二個類(內(nèi))作為第一個類(外)的內(nèi)部類,程序代碼更容易實現(xiàn),這種情況在實際應用中非常多。1、成員內(nèi)部類類似于成員屬性和方法,可用protected和private修飾可以用static修飾嗎?在成員內(nèi)部類中可以定義和外部類同名的成員變量和方法嗎?若可以如何區(qū)分?//Outer6.javapublicclassOuter6{ privatestaticinti=1; privateintj=10; publicvoidouter_f1(){} classInner{

intj=100; voidinner_f1(){

System.out.println(i);

System.out.println(j);

System.out.println(this.j); System.out.println(Outer6.this.j); outer_f1(); } }//外部類的非靜態(tài)方法訪問成員內(nèi)部類

publicvoidouter_f2(){ Innerinner=newInner(); inner.inner_f1(); }}//InnerTest.javapublicclassInnerTest{publicstaticvoidmain(String[]args){ Outer6out=newOuter6(); Outer6.Inneroutin=out.newInner(); outin.inner_f1(); }}Outer6.java編譯后生成兩個單獨文件:Outer6.class和Outer7$Inner.class2、局部內(nèi)部類與局部變量類似,局部內(nèi)部類不能有訪問控制符;它可以訪問當前代碼塊內(nèi)的用final修飾的常量,和外部類所有的成員不能在局部代碼塊之外建立內(nèi)部類實例//Outer7.javapublicclassOuter7{ privateints=100; publicvoidf(final

intk){

int

i=1;//變量內(nèi)部類不能訪問

finalintj=10;//常量內(nèi)部類可以訪問

classInner{

ints=300;

Inner(intk){

inner_f(k); }

voidinner_f(intk){

System.out.println(j);

System.out.println(s);

System.out.println(this.s); System.out.println(Outer7.this.s); } } newInner(k); } publicstaticvoidmain(String[]args){ Outer7out1=newOuter7(); out1.f(3); //Outer7.Innerinner1=out1.newInner(3); }}Outer7.java編譯后生成兩個單獨文件:Outer7.class和Outer7$1Inner.class4.3.2匿名類的定義和使用匿名類是一種特殊的內(nèi)部類,它的類的定義包含在一個表達式內(nèi)部當一個內(nèi)部類的類聲名只是在創(chuàng)建此類對象時用了一次,而且要產(chǎn)生的新類需繼承于一個已有的父類或實現(xiàn)一個接口,才能考慮用匿名類。由于匿名類本身無名,因此它也就不需要構造方法,它會調(diào)用一個無參的父類的構造方法,并且重寫父類的某個方法。P94例4-8靜態(tài)內(nèi)部類——嵌套類用static修飾內(nèi)部類,此內(nèi)部類就變成了頂層類,不能使用外部類的非靜態(tài)成員(類似于類的靜態(tài)方法)。若在InnerClass中聲明任何static成員,則該InnerClass必須聲明為static。創(chuàng)建嵌套類的實例不需要外部類的實例publicclassOuter8{ privatestaticint

i=1; privateint

j=10; publicstaticvoidouter_f1(){ } publicvoidouter_f2(){} staticclassInner{ staticint

inner_i=100;

int

inner_j=200; staticvoidinner_f1(){

System.out.println("Outer.i"+i); outer_f1(); } }

publicvoidouter_f3(){

//外部類訪問內(nèi)部類的靜態(tài)成員:內(nèi)部類名.靜態(tài)成員

System.out.println(Inner.inner_i); Inner.inner_f1(); newInner(); }}publicclassInnerTest2{ publicstaticvoidmain(String[]args){ Outer8.Innerinner1=newOuter8.Inner();inner1.inner_f1(); }}4.4Class類

Class是java.lang包中的final類,該類的實例用來封裝對象運行時的狀態(tài)。當一個類被加載且創(chuàng)建對象時,和該類相關的一個類型為Class的對象就會自動創(chuàng)建。4.4.1通過Class獲取類的相關信息Class類本身不提供構造方法,不能用new運算符和構造方法創(chuàng)建一個Class對象。任何對象調(diào)用getClass()方法都可以獲取和該對象相關的一個Class對象,這個Class對象調(diào)用如下的方法可以獲取創(chuàng)建對象的類的有關信息,比如,類的名字、類中的方法名稱、成員變量的名稱等。常用方法如下所示:StringgetName();返回類的名字Constructor[]getDeclaredConstructor();返回類的全部構造方法Field[]getDeclaredFields();返回類的全部成員變量Method[]getDeclaredMethods();返回類的全部方法P95【例4-9】使用相應的Class對象列出全部成員變量和方法的名稱。4.4.2使用Class實例化一個對象為了得到一個類的對象,先要得到一個和該類相關的Class對象,使用Class的類方法:publicstaticClassforName(String

className)throwClassNotFoundException可以返回一個和參數(shù)className指定的類相關的Class對象。再讓這個Class對象調(diào)用:publicObjectnewInstance()throwInstantiationException,IllegalAccessException方法就可以得到一個className類的對象,注意:className類必須有無參數(shù)的構造方法。

Classcs=Class.forName("RectA");

RectArect=(RectA)cs.newInstance(); rect.width=100; rect.height=200; System.out.println("rect的面積"+rect.getArea());classRectA{ doublewidth,height,area; publicdoublegetArea(){ area=height*width; returnarea; }}packagecom.mine.base;publicclassFather{

int

def_height; protectedint

pro_money; publicint

pub_weight; publicFather(intm){

pro_money=m; } protectedint

getMoney(){ returnpro_money; } voidsetMoney(intn){

pro_money=n; }}訪問修飾符packagecom.mine.acess;importcom.mine.base.Father;publicclassJerryextendsFather{ publicJerry(){ super(20); } publicstaticvoidmain(String[]arg

溫馨提示

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

評論

0/150

提交評論