第四章上繼承_第1頁
第四章上繼承_第2頁
第四章上繼承_第3頁
第四章上繼承_第4頁
第四章上繼承_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

繼承第四章(上)方法重載應(yīng)遵循三大原則;適當(dāng)?shù)刂剌d構(gòu)造方法,可以使初始化對象的方式更為靈活;this引用總是指向調(diào)用成員方法的對象本身;靜態(tài)成員(包括靜態(tài)成員屬性和靜態(tài)成員方法)屬于類而不是屬于某個對象,可以在實(shí)例化對象之前通過類名訪問;使用package關(guān)鍵字打包;使用import關(guān)鍵字導(dǎo)入包或類?;仡櫛菊孪嚓P(guān)詞匯(藍(lán)色為關(guān)鍵字)單詞說明protected受保護(hù)的extends擴(kuò)充,擴(kuò)展super上一級的,超級的access訪問inheritance繼承,遺傳baseclass基類/父類derivedclass子類/派生類modifier修飾符本章目標(biāo)對象數(shù)組(補(bǔ)充)理解什么是繼承在Java中實(shí)現(xiàn)繼承,extends關(guān)鍵字4種訪問控制權(quán)限publicprotectedprivate缺省繼承中的構(gòu)造方法super關(guān)鍵字對象數(shù)組在Java中不但可以聲明由原始數(shù)據(jù)組成的數(shù)組,還可以聲明由對象組成的數(shù)組;聲明對象數(shù)組的方式如:但上述方式類似于C語言中的:

structStudent**p=NULL; p=(structStudent**)malloc(5*sizeof(structStudent*));

//只是聲明了一個指針數(shù)組,沒有任何實(shí)際的結(jié)構(gòu)體變量//假設(shè)已經(jīng)定義了一個Student類/*聲明由5個Student對象組成的數(shù)組*/Student[]stdAry=newStudent[5];對象數(shù)組==引用數(shù)組錯誤的理解方式學(xué)生對象的實(shí)例學(xué)生對象的實(shí)例學(xué)生對象的實(shí)例學(xué)生對象的實(shí)例學(xué)生對象的實(shí)例01234堆棧stdAry堆棧stdAry正確的理解方式對象的引用01234對象的引用對象的引用對象的引用對象的引用對象數(shù)組示例/*對象數(shù)組示例,假設(shè)已經(jīng)定義了Student類*/public

static

void

main(String[]args){

/*創(chuàng)建包含有5個Student引用的數(shù)組*/Student[]stdAry=newStudent[5];

/*逐一為每個引用創(chuàng)建對象實(shí)例*/stdAry[0]=newStudent("張三",18);stdAry[1]=newStudent("李四",20);stdAry[2]=newStudent("王五",24);stdAry[3]=newStudent("鄭六",21);stdAry[4]=newStudent("田七",19);

for(inti=0;i<stdAry.length;i++){

stdAry[i].display();}}對象數(shù)組的存放形式堆棧stdAry0123stdAry[0]stdAry[1]stdAry[2]stdAry[3]stdAry[4]4張三18李四20王五24鄭六21田七19面向?qū)ο蟮娜筇卣髅嫦驅(qū)ο蟮某绦蛟O(shè)計有三大特征:封裝:解決了數(shù)據(jù)的安全性問題繼承:解決了代碼的重用問題多態(tài):解決了程序的擴(kuò)展問題前面的章節(jié)我們已經(jīng)學(xué)習(xí)了有關(guān)于封裝的各個概念,這一章我們來討論第二大特征——繼承。繼承的概念在現(xiàn)實(shí)生活中的繼承,可以理解為兒子繼承了父親的財產(chǎn),即財產(chǎn)重用;面向?qū)ο蟪绦蛟O(shè)計中的繼承,則是代碼重用;繼承是利用現(xiàn)有的類創(chuàng)建新類的過程,現(xiàn)有的類稱作基類(或父類),創(chuàng)建的新類稱作派生類(子類)。基類方法和屬性派生類基類方法+

附加方法大學(xué)系統(tǒng)人員分類樹人學(xué)生老師大學(xué)生研究生繼承的概念(續(xù))最高層是最普遍的、最一般的情況,往下每一層都比上一層更具體,并包含有高層的特征,通過這樣的層次結(jié)構(gòu)使下層的類能自動享用上層類的特點(diǎn)和性質(zhì);繼承其實(shí)就是自動地共享基類中成員屬性和成員方法的機(jī)制。在Java中實(shí)現(xiàn)繼承在Java中實(shí)現(xiàn)繼承需要使用到extends關(guān)鍵字;實(shí)現(xiàn)繼承的一般語法是:

[訪問修飾符]class

派生類名extends

基類名{

成員列表

}如:

classStudentextendsPerson { …… }實(shí)現(xiàn)繼承示例classPerson{//定義人類

publicStringmName;//姓名

public

int

mAge;//年齡

public

voiddining(){

System.out.println("吃飽了...");}//吃飯的方法}classStudentextendsPerson{//學(xué)生類繼承于人類

public

float

mGrade;//成績

public

voidexamination(){

System.out.println("考試及格了...");}//考試的方法}classTeacherextendsPerson{//教師類繼承于人類

public

float

mSalary;//薪水

public

void

prelection(){

System.out.println("上課很累...");}//上課的方法}public

class

InheritanceDemo{//該類用于容納main方法

public

static

void

main(String[]args){Studentstd=newStudent();//實(shí)例化學(xué)生對象

std.mName="張三";std.mAge=18;//為姓名和年齡賦值,訪問的是父類中的成員

std.dining();//調(diào)用吃飯的方法,訪問的是父類中的成員

std.examination();//調(diào)用考試方法,訪問的是子類中的成員

Teachertea=newTeacher();//實(shí)例化教師對象

tea.mName="譚浩強(qiáng)";tea.mAge=65;

tea.dining();

tea.prelection();}}繼承的作用當(dāng)今軟件設(shè)計的特征:軟件規(guī)模越來越大;軟件設(shè)計者越來越多;軟件設(shè)計分工越來越細(xì)。引入繼承,實(shí)現(xiàn)了代碼重用;引入繼承,實(shí)現(xiàn)了遞增式的程序設(shè)計。繼承的作用(續(xù))繼承是能自動傳播代碼和重用代碼的有力工具;繼承能夠在某些比較一般的類的基礎(chǔ)上建造、建立和擴(kuò)充新類;能減少代碼和數(shù)據(jù)的重復(fù)冗余度,并通過增強(qiáng)一致性來減少模塊間的接口和界面,從而增強(qiáng)了程序的可維護(hù)性;能清晰地體現(xiàn)出類與類之間的層次結(jié)構(gòu)關(guān)系。與繼承有關(guān)的注意事項(xiàng)繼承是單方向的,即派生類可以繼承和訪問基類中的成員,但基類則無法訪問派生類中的成員;在Java中只允許單一繼承方式,即一個派生類只能繼承于一個基類,而不能象C++中派生類繼承于多個基類的多重繼承方式。類成員的訪問控制權(quán)限信息隱藏是面向?qū)ο蟪绦蛟O(shè)計的重要特點(diǎn)之一,它可以:防止類的使用者意外損壞數(shù)據(jù);對任何實(shí)現(xiàn)細(xì)節(jié)所作的修改不會影響到使用該類的其它代碼;使類更易于使用。在Java中實(shí)現(xiàn)信息隱藏的是訪問控制權(quán)限機(jī)制;訪問控制權(quán)限包括4個訪問修飾符:public、protected、private和缺??;可以使用上述訪問修飾符修飾類的成員。訪問修飾符不受任何限制,本類或非本類均可隨意訪問。public本類及其子類可以訪問(父子友好),同一個包中的其它類也可訪問(包內(nèi)友好)。protected只有相同包中的類可以訪問(包內(nèi)友好)。缺省只有本類可以訪問,其余都不可以。private訪問控制權(quán)限(列表)publicprotected缺省private本類可以可以可以可以同包子類可以可以可以不可以同包非子類可以可以可以不可以不同包子類可以可以不可以不可以不同包且非子類可以不可以不可以不可以訪問修飾符位置課堂練習(xí)1源文件BaseClass.javapackage

mypkg;public

class

BaseClass{

public

int

pubA;

protected

int

proB;

int

defC;

private

int

priD;}源文件DerivedClass.javapackage

mypkg;public

class

DerivedClass

extends

BaseClass{

public

voidfun(){

pubA=10;

proB=20;

defC=30;

priD=40;}}√√√×課堂練習(xí)2源文件Frist.javapublic

class

Frist{

public

int

pubA;

protected

int

proB;

int

defC;

private

int

priD;}public

classSecond{

public

voidfun(){

Frist

obj;

obj=new

Frist();

obj.pubA=10;

B=20;

obj.defC=30;

obj.priD=40;}}源文件Second.java√√×√課堂練習(xí)3源文件SuperClass.javapackage

aaa;public

class

SuperClass{

public

int

pubA;

protected

int

proB;

int

defC;

private

int

priD;}源文件SubClass.javapackage

bbb;import

aaa.SuperClass;public

class

SubClass

extends

SuperClass{

public

voidfun(){

pubA=10;

proB=20;

defC=30;

priD=40;}}√√××類的訪問權(quán)限還可以在定義類時為類添加訪問修飾符,對類進(jìn)行訪問權(quán)限控制;對類使用的訪問修飾符只有public和缺省兩種;被public修飾的類可以從任何地方訪問,不受限制;不加訪問修飾符,缺省修飾的類只能從本包中訪問,不同包則無法訪問到;但要注意的是:在一個源文件中只能有一個被public修飾的類,并且文件名必須與public的類同名;如果要定義多個public的類,則必須分別寫在不同的源文件中,一個源文件只寫一個類是良好的編程習(xí)慣。繼承中的構(gòu)造方法父類中的構(gòu)造方法不能被子類繼承,即便它是public的;父類的構(gòu)造方法負(fù)責(zé)初始化屬于它的成員變量,而子類的構(gòu)造方法則只需考慮屬于自己的成員變量,不必去關(guān)注父類的情況。繼承中的構(gòu)造方法示例class

ParentClass{//定義父類

public

ParentClass(){//構(gòu)造方法

System.out.println("這是父類的構(gòu)造方法。");}}class

ChildClass

extends

ParentClass{//子類繼承于父類

public

ChildClass(){//構(gòu)造方法

System.out.println("這是子類的構(gòu)造方法。");}}public

class

ConstructorTest{//該類用于容納main方法

public

static

void

main(String[]args){

ChildClasscc=new

ChildClass();//實(shí)例化子類對象

}}構(gòu)造方法的執(zhí)行順序當(dāng)實(shí)例化子類的對象時,必須先執(zhí)行父類的構(gòu)造方法,然后再執(zhí)行子類的構(gòu)造方法;如果父類還有更上級的父類,就會先調(diào)用最高父類的構(gòu)造方法,再逐個依次地將所有繼承關(guān)系的父類構(gòu)造方法全部執(zhí)行;如果父類的構(gòu)造方法執(zhí)行失敗,那么子類的對象也將無法實(shí)例化。案例classPoint{//定義"點(diǎn)"類

//x軸坐標(biāo)和y軸坐標(biāo),由于準(zhǔn)備用于繼承,故修飾為protected

protected

float

mX,mY;

public

Point(floatx,floaty){//構(gòu)造方法

mX=x;

mY=y;}}classCircleextendsPoint{//定義"圓"類繼承于"點(diǎn)"類

protected

float

mRadius;//半徑

public

Circle(floatr){//構(gòu)造方法

mRadius=r;}}public

classDemo{

public

static

void

main(String[]args){Circlec=newCircle(2.5f);//實(shí)例化"圓"類對象

}}本例將報出錯誤案例分析在實(shí)例化Circle類對象時,虛擬機(jī)一定會先調(diào)用其父類(Point類)的構(gòu)造方法;Point類的構(gòu)造方法需要兩個參數(shù)來初始化其成員,但此時并沒有獲得這兩個參數(shù),造成Point類的構(gòu)造方法無法執(zhí)行;父類的構(gòu)造方法執(zhí)行失敗從而導(dǎo)致子類(Circle類)的對象也無法創(chuàng)建;問題的關(guān)鍵是:在實(shí)例化子類對象時,如何將參數(shù)傳遞給父類的構(gòu)造方法?這將使用到super關(guān)鍵字。super關(guān)鍵字的第一種用途在Java中,super關(guān)鍵字有兩個主要用途;第一種用途是:在子類的構(gòu)造方法中,super關(guān)鍵字可以顯式地調(diào)用父類的構(gòu)造方法,用于將參數(shù)傳遞給它;其一般語法是:

super(實(shí)際參數(shù));需要注意的是:該語句必須是子類構(gòu)造方法的第一條語句。super關(guān)鍵字示例1classPoint//定義"點(diǎn)"類{

protected

float

mX,mY;//x軸坐標(biāo)和y軸坐標(biāo)

public

Point(floatx,floaty)//構(gòu)造方法

{

mX=x;

mY=y;}……}classCircleextendsPoint//定義"圓"類繼承于"點(diǎn)"類{

protected

float

mRadius;//半徑

public

Circle(fl

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論