類、繼承與多態(tài)方案課件_第1頁
類、繼承與多態(tài)方案課件_第2頁
類、繼承與多態(tài)方案課件_第3頁
類、繼承與多態(tài)方案課件_第4頁
類、繼承與多態(tài)方案課件_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2023/9/17

在面向?qū)ο蟪绦蛟O(shè)計(jì)中,繼承是最為顯著的一個(gè)特征。繼承機(jī)制模仿了現(xiàn)實(shí)中IS-A關(guān)系(層次關(guān)系).繼承就是以原有某個(gè)類為基礎(chǔ)生成新的類,增加一些新的成員變量和方法,使新的類功能更趨完善的一種高效編程機(jī)制。新生成的類被稱為子類(或派生類),原有的這個(gè)類被稱為子類的父類(基類,也稱為超類).通常把某一組相似對(duì)象的基礎(chǔ)的、共有的、通用的屬性設(shè)計(jì)成父類,再通過繼承生成新的子類,代碼重用性得到了提高.

例如,水果和梨,動(dòng)物和烏龜,食品和罐頭,交通工具和轎車等注意,Java頂層父類是Object.3.2繼承在面向?qū)ο蟪绦蛟O(shè)計(jì)中,繼承是最為顯著的一個(gè)特征。繼承2023/9/17類的定義語法是:[修飾符]class類名[extends父類][implements接口名]{

類成員變量定義類方法定義}類的修飾符用來說明類的特殊性質(zhì)。分為三種:訪問控制符:public或無抽象類說明符:abstract最終類說明符:final接口名跟在implements關(guān)鍵字后面,用來說明當(dāng)前類中實(shí)現(xiàn)了哪個(gè)接口定義的功能和方法。接口是Java語言用來實(shí)現(xiàn)多重繼承的一種特殊機(jī)制。3.2.1類的定義

類的定義語法是:類的修飾符用來說明類的特殊性質(zhì)。分為三種:接2023/9/17如定義一個(gè)Person類和子類StudentclassPerson{ Stringname; intage;publicvoideat(){}publicvoidsleep(){}}classStudentextendsPerson{privateStringshoolNO;privatevoiddoHomework();}如定義一個(gè)Person類和子類Student2023/9/173.2.2成員變量和方法成員變量用來描述類創(chuàng)建的對(duì)象的屬性,而成員方法則刻畫了對(duì)象特有的行為。

Java中的成員變量根據(jù)不同的修飾符有3種類型:

-實(shí)例變量,隨對(duì)象被訪問

-類變量,隨類被訪問

-常量注意,Java成員變量隨對(duì)象被創(chuàng)建而產(chǎn)生,對(duì)于全局靜態(tài)變量,則與類屬于同等層次概念。3.2.2成員變量和方法2023/9/17舉例說明,見【例3.3】舉例說明,見【例3.3】2023/9/17就對(duì)象的方法而言,可分為構(gòu)造方法和普通方法。而構(gòu)造方法是在類創(chuàng)建對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用。與成員變量一樣,方法也有實(shí)例方法和類方法之分。

-實(shí)例方法,隨對(duì)象而調(diào)用

-類方法,隨類而調(diào)用 方法的定義語法是:

[修飾符][返回值]<方法名>([參數(shù)列表]){

方法體

}

其中,修飾符共4種情況:

public,protected,private或不提供.就對(duì)象的方法而言,可分為構(gòu)造方法和普通方法。而構(gòu)造方法是在類2023/9/17要使用對(duì)象,必須先創(chuàng)建對(duì)象。Java中的對(duì)象是通過構(gòu)造方法來創(chuàng)建的。構(gòu)造方法有以下特性:①構(gòu)造方法的方法名與類名相同。②構(gòu)造方法沒有返回值,當(dāng)然也沒有返回類型。③構(gòu)造方法的主要作用是完成對(duì)類對(duì)象的初始化工作。④構(gòu)造方法一般不能由編程人員顯式地直接調(diào)用。⑤在創(chuàng)建一個(gè)類的新對(duì)象的同時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類的構(gòu)造方法,為新對(duì)象初始化。⑥一個(gè)類可以有多個(gè)構(gòu)造方法,可以有0個(gè)、1個(gè)或多個(gè)參數(shù)。

⑦構(gòu)造方法總是和new運(yùn)算符一起被調(diào)用。

3.2.3對(duì)象的構(gòu)造和初始化過程

*!*要使用對(duì)象,必須先創(chuàng)建對(duì)象。Java中的對(duì)象是通過構(gòu)造

3.2023/9/17當(dāng)沒有為類提供一個(gè)構(gòu)造方法時(shí),則編譯器會(huì)自動(dòng)加入一個(gè)不帶參數(shù)的構(gòu)造方法,稱為默認(rèn)構(gòu)造方法。例如,

classPerson{

Person(){super();} }classStudentextendsPerson{

Student(){super();} //系統(tǒng)自動(dòng)行為

publicstaticvoidmain(String[]args){newStudent(); //(1)創(chuàng)建子類對(duì)象

}}問題,上述語句(1)會(huì)不會(huì)創(chuàng)建父類對(duì)象?要注意區(qū)分構(gòu)造方法和new操作的不同作用!classObject{

Object(){}}當(dāng)沒有為類提供一個(gè)構(gòu)造方法時(shí),則編譯器會(huì)自動(dòng)加入一個(gè)不帶參數(shù)2023/9/17

構(gòu)造方法的執(zhí)行過程當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),對(duì)象的各個(gè)變量根據(jù)其類型被設(shè)置為相應(yīng)的默認(rèn)初始值,然后調(diào)用構(gòu)造方法。下面是執(zhí)行步驟:①調(diào)用父類的構(gòu)造方法,這個(gè)過程會(huì)重復(fù)下去.②按聲明順序?qū)Τ蓡T變量進(jìn)行初始化.③執(zhí)行構(gòu)造方法中的各語句.

構(gòu)造器調(diào)用的順序保證所有的父類構(gòu)造方法都得到調(diào)用,保證其基類的成員得到正確的初始化并執(zhí)行相關(guān)語句,然后對(duì)本對(duì)象的域(變量)進(jìn)行初始化。構(gòu)造方法的作用就是初始化.

下面舉例說明.【例3.1】構(gòu)造方法和對(duì)象初始化構(gòu)造方法的執(zhí)行過程【例3.1】構(gòu)造方法和對(duì)象初始化2023/9/17程序運(yùn)行結(jié)果是:?下面,將對(duì)繼承情況下父-子類之間的初始化進(jìn)行分析.程序運(yùn)行結(jié)果是:?2023/9/17publicclassaparent{intheight=170;intweight;aparent(){height=160;weight=130;}}classaboyextendsaparent{protectedintcomhei=120;aboy(){weight=(int)(120f/height*weight);}}當(dāng)創(chuàng)建一個(gè)類型為aboy的對(duì)象時(shí),其創(chuàng)建和初始化的步驟如下表所示。例如,創(chuàng)建一個(gè)子類對(duì)象時(shí)publicclassaparent{例如,創(chuàng)建一2023/9/17類、繼承與多態(tài)方案課件2023/9/17Java的類加載過程和對(duì)象初始化順序,按照如下步驟進(jìn)行:首先,當(dāng)類被加載時(shí)執(zhí)行靜態(tài)變量初始化、靜態(tài)初始化塊.

然后,非靜態(tài)變量初始化、非靜態(tài)初始化塊被執(zhí)行.

最后,構(gòu)造方法被執(zhí)行。從父類的構(gòu)造方法遞歸執(zhí)行.

即,依次執(zhí)行:

(靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構(gòu)造方法

Java的類加載過程和對(duì)象初始化順序,按照如下步驟進(jìn)行:2023/9/17注意,(1)在繼承情況下,并不是父類完全初始化完畢后才進(jìn)行子類的初始化!

(2)靜態(tài)變量和靜態(tài)初始化塊是依照他們?cè)陬愔械亩x順序進(jìn)行初始化的。同樣,變量和初始化塊也遵循這個(gè)規(guī)律.

下面舉例說明.【例3.2】類加載和對(duì)象初始化注意,【例3.2】類加載和對(duì)象初始化2023/9/173.2.4上轉(zhuǎn)型對(duì)象梨子-水果,烏龜-動(dòng)物,學(xué)生-人等概念具有從屬關(guān)系,前者是后者的一種。例如,對(duì)于Person類和子類Student;當(dāng)創(chuàng)建Student子類對(duì)象時(shí),并把這個(gè)對(duì)象的引用放到類Person聲明的對(duì)象中,即:

Personp=newStudent();或者

Personp;Students=newStudent();p=s;則稱對(duì)象p是子類對(duì)象s的上轉(zhuǎn)型對(duì)象.

類似地,也可以將創(chuàng)建的間接子類Graduate對(duì)象放到Person對(duì)象引用中。對(duì)象的上轉(zhuǎn)型對(duì)象的實(shí)體是子類負(fù)責(zé)創(chuàng)建的,只是失去了原對(duì)象的一些屬性和方法,其特點(diǎn)如圖所示:3.2.4上轉(zhuǎn)型對(duì)象2023/9/17原對(duì)象和上轉(zhuǎn)型對(duì)象之間關(guān)系上轉(zhuǎn)型對(duì)象的特點(diǎn)是:a.上轉(zhuǎn)型對(duì)象不能操作子類新增的變量和方法.b.上轉(zhuǎn)型對(duì)象可以操作子類繼承或隱藏的成員變量,也可以使用子類繼承或重寫的方法.c.可將上轉(zhuǎn)型對(duì)象再轉(zhuǎn)換到一個(gè)子類對(duì)象,這時(shí)該子類對(duì)象又具備了子類的所有屬性和功能.【例3.3】上轉(zhuǎn)型對(duì)象原對(duì)象和上轉(zhuǎn)型對(duì)象之間關(guān)系【例3.3】上轉(zhuǎn)型對(duì)象2023/9/17上轉(zhuǎn)型對(duì)象應(yīng)用舉例.問題:下列語句正確嗎?Students=newPerson();上轉(zhuǎn)型對(duì)象是父類對(duì)象嗎?上轉(zhuǎn)型對(duì)象應(yīng)用舉例.問題:2023/9/173.2.5this和superthis,super分別指代當(dāng)前對(duì)象和父類對(duì)象,通常出現(xiàn)在構(gòu)造方法中。例如,classPerson{Stringname=“zhangshan”;publicPerson(){//super(name); //顯式調(diào)用父類帶參的構(gòu)造方法

this(name); //調(diào)用重載的構(gòu)造方法,Person(name)?}publicPerson(Stringname){=name;//為同名的成員變量賦值

}…}3.2.5this和super2023/9/17注意以下幾點(diǎn):1)在一個(gè)構(gòu)造方法中使用了this或super語句,那么它必須作為構(gòu)造方法的第一條語句.2)只能在構(gòu)造方法(非其他實(shí)例方法)中用this語句來調(diào)用類的其他構(gòu)造方法,且不能通過方法名來直接調(diào)用構(gòu)造方法.如果調(diào)用父類構(gòu)造方法也只能用super而不是父類名.3)this,super對(duì)象不能出現(xiàn)在靜態(tài)方法中.publicstaticvoidmain(String[]args){this.play();//×}注意以下幾點(diǎn):2023/9/173.3多態(tài)多態(tài)是指一個(gè)名稱具有多種功能。即同名但擁有不同的方法體。分重載(overloading)和覆蓋(overriding)兩種。重載,又稱編譯時(shí)多態(tài),在一個(gè)類中通過不同參數(shù)個(gè)數(shù)或不同類型參數(shù)來體現(xiàn)。如:

sum(bytea,byteb);sum(inta,intb);sum(doublea,doubleb);…3.3多態(tài)多態(tài)是指一個(gè)名稱具有多種功能。即同名但擁有不同的2023/9/17構(gòu)造方法的重載構(gòu)造方法重載的目的是以不同的方法對(duì)類進(jìn)行初始化。例如,為類Person編寫構(gòu)造方法:publicPerson(){}publicPerson(Stringname){}publicPerson(intID){}publicPerson(Stringname,StringID){}…

為Student子類編寫構(gòu)造方法:publicStudent(){}publicStudent(Stringname,Stringno){}…如果構(gòu)造方法有返回值類型(包括void)修飾,那它不再是構(gòu)造方法而成了普通方法,一般不提倡這么做。構(gòu)造方法可以被繼承嗎?可以用static修飾嗎?構(gòu)造方法的重載構(gòu)造方法可以被繼承嗎?2023/9/17方法覆蓋,又稱運(yùn)行時(shí)多態(tài),只有在運(yùn)行時(shí)(非編譯時(shí))根據(jù)對(duì)象的類型來決定是調(diào)用父類的同名方法還是子類重寫的方法。例如,狗叫,貓叫,老虎叫,獅子叫聲都不一樣!

方法覆蓋條件:

1)方法名相同;2)方法的參數(shù)列表完全相同;3)返回值必須相同;舉例說明如下:方法的訪問修飾符有影響嗎?對(duì)照想一想,方法重載的條件呢?【例3.4】方法重載方法覆蓋,又稱運(yùn)行時(shí)多態(tài),只有在運(yùn)行時(shí)(非編譯時(shí))根據(jù)對(duì)象的2023/9/17【例3.5】方法覆蓋【例3.5】方法覆蓋2023/9/17下面修改一下上述main方法中的幾個(gè)語句,如上圖所示,則運(yùn)行結(jié)果呢?Animala=newAnimal();Animalc=newCat();Animald=newDog();a.sound();c.sound();d.sound();下面修改一下上述main方法中的幾個(gè)語句,如上圖所示,則運(yùn)行2023/9/17關(guān)于方法覆蓋(重寫)Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的對(duì)象,來決定調(diào)用哪個(gè)方法。對(duì)于子類的一個(gè)對(duì)象,如果子類重寫了父類的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法;如果子類繼承了父類的方法(未重寫),則運(yùn)行時(shí)系統(tǒng)調(diào)用父類的方法。private方法可以被覆蓋嗎?final方法可以被覆蓋嗎?注意,方法覆蓋還存在訪問權(quán)限的問題。關(guān)于方法覆蓋(重寫)Java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的對(duì)象,2023/9/17變量覆蓋或稱變量隱藏,只要變量名相同就實(shí)現(xiàn)了隱藏。其修飾符和類型可以不同。例如,問題,這樣賦值可以嗎?woman.aveHight=170.5f;變量覆蓋或稱變量隱藏,只要變量名相同就實(shí)現(xiàn)了隱藏。其修飾符2023/9/173.4修飾符3.4.1

訪問修飾符在定義類,成員變量,方法時(shí),可以在其前面加上修飾符。有訪問修飾符和非訪問修飾符之分。訪問修飾符是一組限定類,成員變量或方法能在多大范圍內(nèi)被訪問的修飾符。類的訪問修飾符只有兩種,而成員變量和方法可以擁有4種不同的修飾符.如圖所示:3.4修飾符3.4.1訪問修飾符2023/9/17

類的訪問修飾符

(2種)

public(公共訪問)缺省包訪問成員變量與方法的訪問修飾符

(4種)

符號(hào)publicprotected無private

含義公共訪問保護(hù)訪問缺省包訪問私有訪問

類的訪問修飾符(2種)

public(公共訪問)缺省包2023/9/17(1)公共訪問修飾符-public用來修飾類時(shí),即公有類,表明它可以被所有的其他類所訪問和引用.

這里訪問和引用是指這個(gè)類作為整體是可見和可使用的,可以創(chuàng)建這個(gè)類的對(duì)象、訪問這個(gè)類內(nèi)部可見的成員變量和調(diào)用它的可見的方法。一個(gè)類作為整體對(duì)程序的其他部分可見,并不能代表類內(nèi)的所有屬性和方法也同時(shí)對(duì)程序的其他部分可見,前者只是后者的必要條件,類的屬性和方法能否為所有其他類所訪問,還要看這些屬性和方法自己的訪問修飾符。

(1)公共訪問修飾符-public用來修飾類時(shí),即公有類,表2023/9/17(2)缺省訪問修飾符-default

假如一個(gè)類沒有訪問修飾符,說明該類只能被同一個(gè)包中的類訪問。這種缺省的訪問修飾規(guī)定該類只能被同一個(gè)包中的類訪問和引用,而不可以被其他包中的類使用,這就是包訪問特性。

類的默認(rèn)訪問修飾符是default.

通過聲明類的訪問修飾符可以使整個(gè)程序結(jié)構(gòu)清晰、嚴(yán)謹(jǐn),減少可能產(chǎn)生類間干擾和錯(cuò)誤。(2)缺省訪問修飾符-default假如一個(gè)類沒2023/9/17(3)保護(hù)訪問控制符-protected用protected修飾的成員變量或方法可以被三種類所引用:該類自身;

與它在同一個(gè)包中的其他類;

在其他包中的該類的子類;

使用protected修飾符的主要作用是允許其他包中的它的子類來訪問父類的特定屬性。(3)保護(hù)訪問控制符-protected2023/9/17(4)私有訪問控制符-private用private修飾的成員變量或方法只能被該類自身所訪問和修改,而不能被任何其他類,包括該類的子類,來獲取和引用。

在下面的情況下可以選擇私有方法:

1)與類的使用者無關(guān)的那些方法。

2)如果類的實(shí)現(xiàn)改變了,不容易維護(hù)的那些方法如果構(gòu)造方法被聲明為private型的,會(huì)發(fā)生什么情況呢?(4)私有訪問控制符-private2023/9/17成員變量和方法的訪問修飾符可以有4個(gè),其訪問特性如下表所示:注意,成員變量和方法默認(rèn)修飾符是default,即具有包訪問權(quán)限.下面舉例說明.【例3.6】訪問修飾符舉例成員變量和方法的訪問修飾符可以有4個(gè),其訪問特性如下表所示2023/9/17在同一個(gè)包中的訪問情況程序運(yùn)行結(jié)果?在同一個(gè)包中的訪問情況程序運(yùn)行結(jié)果?2023/9/17在不同包中的訪問情況程序運(yùn)行結(jié)果?在不同包中的訪問情況程序運(yùn)行結(jié)果?2023/9/173.4.2非訪問修飾符1.類的非訪問修飾符可以使用abstract,final修飾一個(gè)類,當(dāng)為內(nèi)部類時(shí),還可以用static予以修飾。2.成員變量和方法的非訪問修飾符可以使用static,final來修飾變量,使用static,final和abstract修飾方法,具體如下表所示:

*3.4.2非訪問修飾符1.類的非訪問修飾符*2023/9/17static變量和static方法用static修飾的成員變量,也稱類變量;相反,則為實(shí)例變量.

用static修飾的成員方法,也稱類方法;相反,則為實(shí)例方法.它們是屬于整個(gè)類的,使用類名作前綴進(jìn)行訪問,它們隨類的裝載而初始化,為該類的所有對(duì)象所共享.注意,在類方法中可以操縱類變量和調(diào)用其他類方法,但不能操縱實(shí)例變量和調(diào)用實(shí)例方法(當(dāng)然可以通過對(duì)象名來操縱).同樣地,在類方法中不能出現(xiàn)this,super的引用.static的作用體現(xiàn)在不必創(chuàng)建對(duì)象的前提下就可以調(diào)用那個(gè)方法.還有static常量!問題,實(shí)例變量和實(shí)例方法會(huì)共享嗎?【例3.7】非訪問修飾符static變量和static方法【例3.7】非訪問修飾符2023/9/17abstract類和abstract方法當(dāng)一個(gè)類被聲明為abstract時(shí),這個(gè)類被稱為是抽象類。所謂抽象類就是沒有具體實(shí)例對(duì)象的類。例如,

abstractclass{}

如果將抽象類中的方法聲明為abstract,這個(gè)方法即為抽象方法。抽象方法只含有一個(gè)聲明,沒有方法體。例如,

abstractvoiddisplay();

abstract類不允許創(chuàng)建對(duì)象且必須被繼承,抽象類允許方法擁有方法體,但抽象方法必須存在于抽象類中。例如,

abstractclassabsClass{abstractvoiddisplay();voidprintX(){System.out.println(“Thisisanabstractclass”);}}abstract類和abstract方法2023/9/17抽象類的例子1)用戶類(管理員,VIP用戶,普通用戶,…)2)形狀類(點(diǎn),線,圓,…)3)工具類(轎車,汽車,火車,…)4)...

【例3.8】非訪問修飾符2

抽象類的例子【例3.8】非訪問修飾符22023/9/17非訪問修飾符舉例程序運(yùn)行結(jié)果?非訪問修飾符舉例程序運(yùn)行結(jié)果?2023/9/17final類,final方法,final變量如果一個(gè)類被聲明為final,則稱final類,意味著它不能被繼承。若用來修飾一個(gè)方法,則稱final方法,該方法不允許被覆蓋!

若用來修飾一個(gè)變量,則稱final變量,這種變量只能被賦值一次。例如,

finalclassfinalClass{finaldoublePI=3.1415926;...

}問題,一個(gè)類能不能既被聲明為abstract又被聲明為final型?【例3.9】非訪問修飾符3

final類,final方法,final變量【例3.9】2023/9/173.5內(nèi)部類和匿名內(nèi)部類定義在一個(gè)類的類體中的類被稱為內(nèi)部類。內(nèi)部類有靜態(tài)內(nèi)部類和匿名內(nèi)部類等形式,內(nèi)部類具有以下特點(diǎn):

內(nèi)部類相當(dāng)于外圍類的成員,可以訪問外圍類的成員!3.5內(nèi)部類和匿名內(nèi)部類定義在一個(gè)類的類體中的類被稱為內(nèi)部2023/9/17內(nèi)部類更多的反映的是類/對(duì)象之間的關(guān)系,一般用來生成事件適配器,用于事件處理。其定義有三種方式:

(1)是其它類的成員; //(2)在一個(gè)語句塊的內(nèi)部定義; //(3)在表達(dá)式內(nèi)部匿名定義; //匿名內(nèi)部類注意,a.若內(nèi)部類被聲明為static,就變成了頂層類,不能再使用局部變量.b.若想在內(nèi)部類中聲明任何static成員,則該內(nèi)部類必須聲明為static.【例3.10】?jī)?nèi)部類及其創(chuàng)建1

內(nèi)部類更多的反映的是類/對(duì)象之間的關(guān)系,一般用來生成事件適配2023/9/17內(nèi)部類應(yīng)用舉例1在外圍類方法中創(chuàng)建內(nèi)部類對(duì)象.程序運(yùn)行結(jié)果??jī)?nèi)部類應(yīng)用舉例1在外圍類方法中創(chuàng)建內(nèi)部類對(duì)象.2023/9/17內(nèi)部類應(yīng)用舉例2由外圍類對(duì)象創(chuàng)建內(nèi)部類對(duì)象.程序運(yùn)行結(jié)果?當(dāng)一個(gè)類繼承了內(nèi)部類時(shí),內(nèi)部類的構(gòu)造方法不會(huì)自動(dòng)調(diào)用!如何完成子類對(duì)象創(chuàng)建?Java提供了enclosingClassReference.super();來說明內(nèi)部類與外部類對(duì)象引用之間的關(guān)聯(lián).內(nèi)部類應(yīng)用舉例2由外圍類對(duì)象創(chuàng)建內(nèi)部類對(duì)象.當(dāng)一個(gè)類繼承了2023/9/17靜態(tài)內(nèi)部類

publicclassoutClass{//…publicstaticclassstatInnerClass(){…//不可以訪問外部類的實(shí)例變量

}classinnerClass{

…//可以訪問外部類的實(shí)例變量

}}

此時(shí),與其他靜態(tài)變量、靜態(tài)方法一樣與對(duì)象無關(guān),靜態(tài)內(nèi)部類只可以訪問外圍類的靜態(tài)變量和靜態(tài)方法,而不能直接引用定義在外圍類中的實(shí)例變量或者方法,但可以通過對(duì)象的引用來使用它們。靜態(tài)內(nèi)部類2023/9/17匿名內(nèi)部類(anonymousinner-class)

匿名類就是沒有名字的內(nèi)部類,將把繼承類與實(shí)例化子類對(duì)象在一個(gè)表達(dá)式里完成。其定義語法如下:

new類或接口(){//類的主體}

這種形式的new語句聲明一個(gè)匿名內(nèi)部類,它對(duì)一個(gè)給定的類進(jìn)行擴(kuò)展,或者實(shí)現(xiàn)一個(gè)給定的接口;它還創(chuàng)建匿名內(nèi)部類的一個(gè)對(duì)象,并把這個(gè)對(duì)象作為new語句的返回值.

匿名內(nèi)部類有兩種實(shí)現(xiàn)方式:第1種,繼承一個(gè)類,重寫其方法;

第2種,實(shí)現(xiàn)一個(gè)接口,實(shí)現(xiàn)其中的方法.

下面舉例說明之.匿名內(nèi)部類(anonymousinner-class)2023/9/17注意匿名內(nèi)部類的定義方式.程序運(yùn)行結(jié)果?注意匿名內(nèi)部類的定義方式.2023/9/173.6接口接口類似抽象類,只包含常量和方法的聲明,而沒有方法的實(shí)現(xiàn)。接口是由常量和抽象方法組成的特殊類,接口的定義包括接口聲明和接口體。接口聲明的格式如下:

[public]interfaceinterfaceName[extendslistOfSuperInterface]{…}

extends子句與類聲明的extends子句基本相同,不同的是一個(gè)接口可有多個(gè)父接口,用逗號(hào)隔開,而一個(gè)類只能有一個(gè)父類。例如,

interfacepower{booleanonoff=false;voidon();voidoff();}

interfacewater_powerextendspower{floatwaterline=139f;intadjust_waterline(floatnewvalue);}接口中方法和變量各有什么特點(diǎn)?3.6接口接口類似抽象類,只包含常量和方法的聲明,而沒有方2023/9/17接口的實(shí)現(xiàn)在類的聲明中用implements子句來表示一個(gè)類實(shí)現(xiàn)某個(gè)接口.classpowerManagerimplementspower{…voidon(){…}voidoff(){…}}一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,在implements子句中用逗號(hào)分開.classpowerManagerimplementswater_power,fire_power{…voidon(){…}voidoff(){…}intadajust_waterline(){…}…}一個(gè)類實(shí)現(xiàn)某個(gè)接口,就必須實(shí)現(xiàn)接口中聲明的所有方法,包括繼承的接口.interfacefire_powerextendspower{floatadjust_temperature(floatnewvalue);}接口的實(shí)現(xiàn)在類的聲明中用implements子句來表示一個(gè)類2023/9/17接口的用處1)通過接口實(shí)現(xiàn)不相關(guān)類的相同行為,而無需考慮這些類之間的關(guān)系。2)通過接口指明多個(gè)類需要實(shí)現(xiàn)的方法。3)通過接口了解對(duì)象的交互界面,而無需了解對(duì)象所對(duì)應(yīng)的類。與抽象類的比較抽象類必須被繼承,接口必須被實(shí)現(xiàn)抽象類允許方法的實(shí)現(xiàn),而接口只有方法的聲明沒有方法體類只有單根繼承,而接口可以多重繼承抽象類,接口可用作變量的類型。抽象類的維護(hù)比接口要簡(jiǎn)單些抽象類可以賦予方法默認(rèn)行為.如果接口變動(dòng)了?接口的用處與抽象類的比較抽象類可以賦予方法默認(rèn)行為.2023/9/17接口類型的使用作為一種引用類型來使用任何實(shí)現(xiàn)該接口的類的實(shí)例都可以存儲(chǔ)在該接口類型的變量中通過這些變量可以訪問類所實(shí)現(xiàn)的接口中的方法下面舉例說明.【例3.11】接口應(yīng)用

接口類型的使用作為一種引用類型來使用【例3.11】接口應(yīng)2023/9/17程序運(yùn)行結(jié)果呢?程序運(yùn)行結(jié)果呢?2023/9/17接口舉例接口舉例2023/9/17接口舉例接口舉例2023/9/17一個(gè)類實(shí)現(xiàn)多個(gè)接口一個(gè)類實(shí)現(xiàn)多個(gè)接口2023/9/171.包及其作用包是一組相關(guān)類和接口的集合,通常稱為“類庫”,是一個(gè)較為松散的集合。包提供了命名空間管理和訪問保護(hù),將實(shí)現(xiàn)某方面功能的一組類和接口組織在一起,形成包。Java語言提供了一些系統(tǒng)級(jí)基本包,例如:3.7程序包1.包及其作用3.7程序包2023/9/172.自定義包創(chuàng)建一個(gè)包的方法非常簡(jiǎn)單,只要將一個(gè)包的聲明放在Java源程序的第一個(gè)語句即可。其語法是:

packagebook;

package語句的作用范圍是整個(gè)源文件,而且同一個(gè)package聲明可以放到多個(gè)源文件中,所有定義在這些源文件中的類和接口都屬于這個(gè)包的成員。這些源程序經(jīng)編譯后產(chǎn)生.class文件,它們屬于同一個(gè)包,包名是book,這就是包book的作用.在Java中有“無名包”(default)和“有名包”之分,前者是系統(tǒng)的默認(rèn)對(duì)待,即沒有package語句。因?yàn)闆]有名字,所以它不能被其他包所引用,因此經(jīng)常要求創(chuàng)建“有名包”.

2.自定義包2023/9/173.編譯和生成包帶有包名的源程序,在編譯時(shí)需帶上參數(shù)-d.,及生成對(duì)應(yīng)包名的類文件。例如,3.編譯和生成包2023/9/17當(dāng)編譯器在編譯一個(gè)java源文件時(shí),會(huì)自動(dòng)在以下位置查找所要用到的類文件:當(dāng)前目錄系統(tǒng)環(huán)境變量classpath指定的目錄,稱之為類路徑JDK的運(yùn)行庫rt.jar,該庫在JDK安裝目錄的jre\lib子目錄中也可以在編譯時(shí)指定類文件的搜索路徑,例如:E:\javapractice>javac–classpath.;D:\test.java當(dāng)編譯器在編譯一個(gè)java源文件時(shí),會(huì)自動(dòng)在以下位置查找所要2023/9/174.運(yùn)行帶包名的類要運(yùn)行帶有包名的類,有下面兩種方法:

1)將當(dāng)前目錄設(shè)置為包名的上一級(jí)目錄,然后以小數(shù)點(diǎn)作為連接符將包名作為Java類的前綴名,再運(yùn)行。例如,

packagecom.mypackage;

將當(dāng)前目錄設(shè)置為com的上一級(jí)目錄,然后輸入命令:>Javacom.mypackage.類名

2)使用帶參數(shù)的java命令運(yùn)行之。例如,

>java-classpath.;com.mypackage類名當(dāng)需要引入其他包中的類時(shí),使用import語句即可。例如,

importcom.mypackage.*;//引入這個(gè)包中所有類 4.運(yùn)行帶包名的類2023/9/175.嵌套包,是指一個(gè)包嵌套在另一個(gè)包中。例如,包java.util.Date嵌套在包java.util中。

注意,在引入包時(shí),不會(huì)自動(dòng)引入嵌套包中的類和接口!6.包中類的可見性一個(gè)包中的public類或public接口可以被包外代碼訪問;非public的類型則以包作為作用域,在同一包內(nèi)可以訪問,對(duì)外是隱藏的.5.嵌套包,是指一個(gè)包嵌套在另一個(gè)包中。例如,包java.2023/9/17選擇題-1(1)程序test.java的代碼如下,其中正確的是()classA{}classBextendsA{}publicclasstest{publicstaticvoidmain(String[]args){Aa=newA();Bb=(B)a;}A.通過編譯并運(yùn)行B.編譯時(shí)出錯(cuò)

C.編譯通過,但運(yùn)行時(shí)出錯(cuò)

D.編譯器報(bào)告找不到test.java練習(xí)題選擇題-1練習(xí)題2023/9/17選擇題-2(2)關(guān)于類demo的描述正確的是()publicclassDemoextendsBase{privateintcount;publicDemo(){System.out.println(“ADemoobjecthasbeencreated”);}protectedvoidaddOne(){count++;}A.當(dāng)創(chuàng)建一個(gè)Demo類的對(duì)象時(shí),count的值是0B.當(dāng)創(chuàng)建一個(gè)Demo類的對(duì)象時(shí),count的值不確定

C.Base類型的對(duì)象中可包含改變count值的方法

D.Demo的子類對(duì)象可以訪問count選擇題-22023/9/17(3)寫出下列程序的運(yùn)行結(jié)果正確答案:?(3)寫出下列程序的運(yùn)行結(jié)果正確答案:?2023/9/17(4)閱讀下面的程序,其中正確的是()

classperson{Stringname;StringnickName;publicperson(Stringa,Stringb){name=a;nickName=b;

}publicStringtoString(){

returnname+"nickName="+nickName;

}}

(4)閱讀下面的程序,其中正確的是()2023/9/17publicclassemployeeextendsperson{

Stringrank;

publicemployee(Stringa,Stringb,Stringc){

super(a,b);

rank=c;}publicStringtoString(){

returnname+"nickName="+nickName+"rank="+rank;}

publicclassemployeeextends2023/9/17publicpublicstaticvoidmain(String[]args){personone=newperson("Wang","Zhang");persontwo=newemployee("Bob","Tom","manager");employeethree=newemployee("Jack","David","CEO");System.out.println("oneis"+one.toString());System.out.println("twois"+two.toString());System.out.println("threeis"+three.toString());}}

類、繼承與多態(tài)方案課件2023/9/17

A.編譯時(shí)會(huì)出現(xiàn)錯(cuò)誤

溫馨提示

  • 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)論