Java基礎Java類設計課件_第1頁
Java基礎Java類設計課件_第2頁
Java基礎Java類設計課件_第3頁
Java基礎Java類設計課件_第4頁
Java基礎Java類設計課件_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java類設計講師:佟剛新浪微博:尚硅谷-佟剛Java類設計講師:佟剛1本章內(nèi)容Java類的繼承方法的重寫、覆蓋訪問控制super關鍵字多態(tài)性及其應用Object類及其主要方法本章內(nèi)容Java類的繼承2本章內(nèi)容Java類的繼承方法的重寫、覆蓋多態(tài)性及其應用成員訪問控制對象的創(chuàng)建和初始化細節(jié)幾種常用的Java類本章內(nèi)容Java類的繼承3類的繼承(1)

為描述和處理個人信息,定義類Person:publicclassPerson{publicStringname;publicintage;publicDatebirthDate;publicStringgetInfo(){...}}Person+name:String+age:int+birthDate:Date+getInfo():String類的繼承(1)為描述和處理個人信息,定義類Person4類的繼承(2)

為描述和處理學生信息,定義類Student:publicclassStudent{publicStringname;publicintage;publicDatebirthDate;

publicStringschool;publicStringgetInfo(){...}}Student+name:String+age:int+birthDate:Date+school:String+getInfo():String類的繼承(2)為描述和處理學生信息,定義類Studen5類的繼承(3)

通過繼承,簡化Student類的定義:publicclassPerson{publicStringname;publicintage;publicDatebirthDate;publicStringgetInfo(){...}}publicclassStudentextendsPerson{publicStringschool;}//Student類繼承了父類Person的所有屬性和方法,并增加了一個屬性school。Person中的屬性和方法,Student都可以利用。Person+name:String+age:int+birthDate:Date+getInfo():StringStudent+school:String類的繼承(3)通過繼承,簡化Student類的定義:p6類的繼承(4)類繼承語法規(guī)則:

<修飾符>class<子類名稱>[extends<父類>]

{ <屬性和方法的聲明>}類的繼承(4)類繼承語法規(guī)則:7類的繼承(5)Java只支持單繼承,不允許多重繼承一個子類只能有一個父類一個父類可以派生出多個子類類的繼承(5)Java只支持單繼承,不允許多重繼承8單繼承舉例Person+name:String+age:int+birthDate:Date+getInfo():StringStudent+school:StringSoldierOfficerGraduate+major:String+register():void父類子類孫子類單繼承舉例Person+name:String+get9類的繼承(6)子類繼承了父類,就繼承了父類的方法和屬性。在子類中,可以使用父類中定義的方法和屬性,也可以創(chuàng)建新的數(shù)據(jù)和方法。因而,子類通常比父類的功能更多。在Java中,繼承的關鍵字用的是“extends”,即子類不是父類的子集,而是對父類的“擴展”。關于繼承的規(guī)則:子類不能繼承父類中私有的(private)的成員變量和方法。類的繼承(6)子類繼承了父類,就繼承了父類的方法和屬性。關10練習11.(1)定義一個ManKind類,包括成員變量intsex和intsalary;方法voidmanOrWorman():根據(jù)sex的值顯示“man”(sex==1)或者“women”(sex==0);方法voidemployeed():根據(jù)salary的值顯示“nojob”(salary==0)或者“job”(salary!=0)。

(2)定義類Kids1繼承ManKind,并包括成員變量intyearsOld;方法printAge()打印yearsOld的值。

(3)在Kids1類的main方法中實例化Kids1的對象someKid,用該對象訪問其父類的成員變量及方法。練習11.(1)定義一個ManKind類,包括11練習12.根據(jù)下圖實現(xiàn)類。在TestCylinder類中創(chuàng)建Cylinder類的對象,設置圓柱的底面半徑和高,并輸出圓柱的體積。Circle(圓)-radius:doubleCircle():

構造方法,將radius屬性初始化為1+setRadius(doubleradius):void+getRadius():double+findArea():double計算圓的面積Cylinder(圓柱)-length:doubleCylinder():

構造方法,將length屬性初始化為1+setLength(doublelength):void+getLength():double+findVolume():double計算圓柱體積練習12.根據(jù)下圖實現(xiàn)類。在TestCylinder類中12本章內(nèi)容Java類的繼承訪問控制方法的重載、覆蓋super關鍵字多態(tài)性及其應用Object類及其主要方法本章內(nèi)容Java類的繼承13訪問控制修飾符同一個類同一個包子類整體privateYesdefaultYesYesprotectedYesYesYespublicYesYesYesYes可以對Java類中定義的屬性和方法進行訪問控制----規(guī)定不同的保護等級:public、protected、default、private訪問控制修飾符同一個類同一個包子類整體privateYesd14訪問控制舉例(1)classParent{

privateintf1=1;intf2=2;

protectedintf3=3;

publicintf4=4;

privatevoidfm1(){System.out.println("infm1()f1="+f1);}voidfm2(){System.out.println("infm2()f2="+f2);}

protectedvoidfm3(){System.out.println("infm3()f3="+f3);}

publicvoidfm4(){System.out.println("infm4()f4="+f4);} }訪問控制舉例(1)classParent{15訪問控制舉例(2)classChildextendsParent{//設父類和子類在同一個包內(nèi)

privateintc1=21; publicintc2=22; privatevoidcm1(){System.out.println("incm1()c1="+c1);} publicvoidcm2(){System.out.println("incm2()c2="+c2);} publicstaticvoidmain(Stringargs[]){ inti; Parentp=newParent(); i=p.f2; // i=p.f3; i=p.f4; p.fm2();// p.fm3(); p.fm4();

Childc=newChild(); i=c.f2; // i=c.f3; i=c.f4;

i=c.c1; // i=c.c2;

c.cm1();//c.cm2();c.fm2();c.fm3();c.fm4() }}訪問控制舉例(2)classChildextendsP16訪問控制分析f2_defaultc2_publicf3_protectedf4_publicc1_private子類對象可以訪問的數(shù)據(jù)子類的對象可以調(diào)用的方法fm2()_defaultfm3()_protectedfm4()_publiccm2()_publiccm1()_private父類Parent和子類Child在同一包中定義時:訪問控制分析f2_defaultc2_publicf3_pr17本章內(nèi)容Java類的繼承訪問控制方法的重寫、覆蓋super關鍵字多態(tài)性及其應用Object類及其主要方法本章內(nèi)容Java類的繼承18覆蓋方法在子類中可以根據(jù)需要對從父類中繼承來的方法進行改造—覆蓋方法(方法的重置、重寫),在程序執(zhí)行時,子類的方法將覆蓋父類的方法。覆蓋方法必須和被覆蓋方法具有相同的方法名稱、參數(shù)列表和返回值類型。覆蓋方法不能使用比被覆蓋方法更嚴格的訪問權限。覆蓋方法在子類中可以根據(jù)需要對從父類中繼承來的方法進行改造—19覆蓋方法舉例(1)publicclassPerson{ publicStringname; publicintage;

publicStringgetInfo()

{ return"Name:"+name+"\n"+"age:"+age; }}publicclassStudentextendsPerson{publicStringschool;

publicStringgetInfo()

{ //覆蓋方法

return"Name:"+name+"\nage:"+age +"\nschool:"+school; } publicstaticvoidmain(Stringargs[]){ Students1=newStudent(); ="Bob"; s1.age=20; s1.school="school2"; System.out.println(s1.getInfo());//Name:Bobage:20school:school2 }}Personp1=newPerson();p1.getInfo();//調(diào)用Person類的getInfo()方法Students1=newStudent();s1.getInfo();//調(diào)用Student類的getInfo()方法這是一種“多態(tài)性”:同名的方法,用不同的對象來區(qū)分調(diào)用的是哪一個方法。覆蓋方法舉例(1)publicclassPerson{20覆蓋方法舉例(2)classParent{

publicvoidmethod1(){}}classChildextendsParent{

privatevoidmethod1(){}//非法,子類中的method1()的訪問權限private比被覆蓋方法的訪問權限public弱}publicclassUseBoth{ publicvoiddoOtherThing(){ Parentp1=newParent();

Childp2=newChild(); p1.method1(); p2.method1(); }}覆蓋方法舉例(2)classParent{21

修改練習1中定義的類Kids1,在Kids1中重新定義employed()方法,覆蓋父類ManKind中定義的employed()方法,輸出“Kidsshouldstudyandnojob.”練習2修改練習1中定義的類Kids1,在Kids1中重新定義e22本章內(nèi)容Java類的繼承訪問控制方法的重載、覆蓋super關鍵字super關鍵字子類對象的實例化過程多態(tài)性及其應用Object類及其主要方法本章內(nèi)容Java類的繼承23關鍵字super在Java類中使用super來引用父類的成分super可用于訪問父類中定義的屬性super可用于調(diào)用父類中定義的成員方法super可用于在子類構造方法中調(diào)用父類的構造方法super的追溯不僅限于直接父類關鍵字super在Java類中使用super來引用父類的成分24關鍵字super舉例

publicclassPerson{ privateStringname; privateintage; publicStringgetInfo(){ return"Name:"+name+"\nage:"+age; }}publicclassStudentextendsPerson{ privateStringschool="NewOriental"; publicStringgetSchool(){returnschool;} publicStringgetInfo(){

//調(diào)用父類的方法

returnsuper.getInfo()+"\nschool:"+school; }}關鍵字super舉例publicclassPers251.修改練習3中定義的類Kids1中employed()方法,在該方法中調(diào)用父類ManKind的employed()方法,然后再輸出“butKidsshouldstudyandnojob.”2.修改練習1中定義的Cylinder類,在Cylinder類中覆蓋findArea()方法,計算圓柱的表面積。考慮:findVolume方法怎樣做相應的修改? 在TestCylinder類中創(chuàng)建Cylinder類的對象,設置圓柱的底面半徑和高,并輸出圓柱的表面積和體積。

附加題:在TestCylinder類中創(chuàng)建一個Circle類的對象,設置圓的半徑,計算輸出圓的面積。體會父類和子類成員的分別調(diào)用。練習41.修改練習3中定義的類Kids1中employed()26構造方法不能繼承子類繼承父類所有的成員變量和成員方法,但不繼承父類的構造方法在一個Java類中可以通過兩種方式獲得構造方法使用系統(tǒng)默認的無參數(shù)構造方法顯式定義一個或多個構造方法一旦顯式定義了構造方法,則系統(tǒng)不再提供默認構造方法構造方法不能繼承子類繼承父類所有的成員變量和成員方法,但不繼27調(diào)用父類構造方法在子類的構造方法中可使用super(參數(shù)列表)語句調(diào)用父類的構造方法如果子類的構造方法中沒有顯示地調(diào)用父類構造方法,也沒有使用this關鍵字調(diào)用重載的其它構造方法,則系統(tǒng)默認調(diào)用父類無參數(shù)的構造方法如果子類構造方法中既未顯式調(diào)用父類構造方法,而父類中又沒有無參的構造方法,則編譯出錯調(diào)用父類構造方法在子類的構造方法中可使用super(參數(shù)列表28調(diào)用父類構造方法舉例(1)1publicclassPerson{2 3 privateStringname;4 privateintage;5 privateDatebirthDate; 67 publicPerson(Stringname,intage,Dated){8 =name;9 this.age=age;10 this.birthDate=d;11 }12 publicPerson(Stringname,intage){13 this(name,age,null);14 }15 publicPerson(Stringname,Dated){16 this(name,30,d);17 }18 publicPerson(Stringname){19 this(name,30);20 }21 //……22}調(diào)用父類構造方法舉例(1)1publiccl29調(diào)用父類構造方法舉例(2)1publicclassStudentextendsPerson{2 privateStringschool;34 publicStudent(Stringname,intage,Strings){5 super(name,age);6 school=s;7 }8 publicStudent(Stringname,Strings){9 super(name);10 school=s;11 }publicStudent(Strings){

//編譯出錯:nosuper(),系統(tǒng)將調(diào)用父類無參數(shù)的構造方法。13 school=s;14 }15}調(diào)用父類構造方法舉例(2)1publiccl30思考1).為什么super(…)和this(…)調(diào)用語句不能同時在一個構造函數(shù)中出現(xiàn)?

2).為什么super(…)或this(…)調(diào)用語句只能作為構造函數(shù)中的第一句出現(xiàn)?子類對象的實例化過程思考1).為什么super(…)和this(…)調(diào)用語句不31練習7

修改練習1中定義的Circle類和Cylinder類的構造方法,利用構造方法參數(shù)為對象的所有屬性賦初值。練習7修改練習1中定義的Circle類和Cylinder32本章內(nèi)容Java類的繼承方法的重載、覆蓋訪問控制super關鍵字多態(tài)性及其應用多態(tài)instanceof運算符類型轉(zhuǎn)換異常Object類及其主要方法本章內(nèi)容Java類的繼承33多態(tài)性(1)多態(tài)—在Java中,子類的對象可以替代父類的對象使用一個變量只能有一種確定的數(shù)據(jù)類型一個引用類型變量可能指向(引用)多種不同類型的對象

Personp=newStudent(); Objecto=newPerson();//Object類型的變量o,指向Person類型的對象

o=newStudent();//Object類型的變量o,指向Student類型的對象父類類型的變量可以指向子類的對象多態(tài)性(1)多態(tài)—在Java中,子類的對象可以替代父類的對象34多態(tài)性(2)一個引用類型變量如果聲明為父類的類型,但實際引用的是子類對象,那么該變量就不能再訪問子類中添加的屬性和方法

Studentm=newStudent(); m.school=“pku”; //合法,Student類有school成員變量

Persone=newStudent(); e.school=“pku”; //非法,Person類沒有school成員變量

屬性是在編譯時確定的,編譯時e為Person類型,沒有school成員變量,因而編譯錯誤。多態(tài)性(2)一個引用類型變量如果聲明為父類的類型,但實際引用35虛擬方法調(diào)用(VirtualMethodInvocation)

正常的方法調(diào)用

Persone=newPerson(); e.getInfo(); Studente=newStudent(); e.getInfo();

虛擬方法調(diào)用(多態(tài)情況下)

Persone=newStudent(); e.getInfo(); //調(diào)用Student類的getInfo()方法編譯時類型和運行時類型編譯時e為Person類型,而方法的調(diào)用是在運行時確定的,所以調(diào)用的是Student類的getInfo()方法。——動態(tài)綁定虛擬方法調(diào)用(VirtualMethodInvocati36多態(tài)性應用舉例方法聲明的形參類型為父類類型,可以使用子類的對象作為實參調(diào)用該方法publicclassTest{ publicvoidmethod(Persone){

//…… e.getInfo(); } publicstaticvoidmain(Stirngargs[]){ Testt=newTest(); Studentm=newStudent(); t.method(m);//子類的對象m傳送給父類類型的參數(shù)e }}多態(tài)性應用舉例方法聲明的形參類型為父類類型,可以使用子類的對37instanceof

操作符xinstanceofA:檢驗x是否為類A的對象,返回值為boolean型。要求x所屬的類與類A必須是子類和父類的關系,否則編譯錯誤。如果x屬于類A的子類B,xinstanceofA值也為true。publicclassPersonextendsObject{…}publicclassStudentextendsPerson{…}publicclassGraduateextendsPerson{…}-------------------------------------------------------------------publicvoidmethod1(Persone){ if(einstanceofPerson)

//處理Person類及其子類對象

if(einstanceofStudent)

//處理Student類及其子類對象

if(einstanceofGraduate)

//處理Graduate類及其子類對象}instanceof操作符xinstanceofA:檢38classPerson{ protectedStringname="person"; protectedintage=50; publicStringgetInfo(){ return"Name:"+name+"\n"+"age:"+age; }}classStudentextendsPerson{ protectedStringschool="pku"; publicStringgetInfo(){ return"Name:"+name+"\nage:"+age +"\nschool:"+school; }

}classGraduateextendsStudent{ publicStringmajor="IT"; publicStringgetInfo() { return"Name:"+name+"\nage:"+age +"\nschool:"+school+"\nmajor:"+major; }}練習8建立TestInstance類,在類中定義方法method1(Persone);在method1中:(1)根據(jù)e的類型調(diào)用相應類的getInfo()方法。(2)根據(jù)e的類型執(zhí)行:如果e為Person類的對象,輸出:“aperson”;如果e為Student類的對象,輸出“astudent”“aperson”如果e為Graduate類的對象,輸出:“agraduatedstudent”“astudent”“aperson”(ex8)classPerson{練習8建立TestInstanc39對象類型轉(zhuǎn)換(Casting)基本數(shù)據(jù)類型的Casting:小的數(shù)據(jù)類型可以自動轉(zhuǎn)換成大的數(shù)據(jù)類型如longg=20;doubled=12.0f可以把大的數(shù)據(jù)類型強制轉(zhuǎn)換(casting)成小的數(shù)據(jù)類型如floatef=(float)12.0inta=(int)1200L對Java對象的強制類型轉(zhuǎn)換稱為造型從子類到父類的類型轉(zhuǎn)換可以自動進行從父類到子類的類型轉(zhuǎn)換必須通過造型(強制類型轉(zhuǎn)換)實現(xiàn)無繼承關系的引用類型間的轉(zhuǎn)換是非法的在造型前可以使用instanceof操作符測試一個對象的類型對象類型轉(zhuǎn)換(Casting)基本數(shù)據(jù)類型的Castin40對象類型轉(zhuǎn)換舉例publicclassTest{ publicvoidmethod(Persone){ //設Person類中沒有getschool()方法

System.out.pritnln(e.getschool());//非法,編譯時錯誤

if(einstanceofStudent){ Studentme=(Student)e; //將e強制轉(zhuǎn)換為Student類型

System.out.pritnln(me.getschool()); } } publicstaticvoidmain(Stirngargs[]){ Testt=newTest(); Studentm=newStudent(); t.method(m); }}對象類型轉(zhuǎn)換舉例publicclassTest{41本章內(nèi)容Java類的繼承方法的重載、覆蓋訪問控制super關鍵字多態(tài)性及其應用Object類及其主要方法Object類equals()方法toString()方法封裝類本章內(nèi)容Java類的繼承42Object

類Object類是所有Java類的根父類如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為Object類

publicclassPerson{ ... }

等價于:publicclassPersonextendsObject{...}例:

method(Objectobj){…}//可以接收任何類作為其參數(shù)Objecto=newPerson;method(o);Object類Object類是所有Java類的根父類43==操作符與equals方法==操作符與equals方法的區(qū)別:==:引用類型比較引用(是否指向同一個對象);

Personp1=newPerson();Personp2=newPerson(); if(p1==p2){…}

基本類型比較值;inta=5;if(a==6){…}用"=="進行比較時,符號兩邊的數(shù)據(jù)類型必須一致(可自動轉(zhuǎn)換的基本數(shù)據(jù)類型除外),否則編譯出錯;equals()方法是Object類的方法,由于所有類都繼承Object類,也就繼承了equals()方法。只能比較引用類型,其作用與“==”相同,比較是否指向同一個對象。格式:obj1.equals(obj2)特例:當用equals()方法進行比較時,對類File、String、Date及封裝類(WrapperClass)來說,是比較類型及內(nèi)容而不考慮引用的是否是同一個對象;

原因:在這些類中覆蓋了equals()方法。==操作符與equals方法==操作符與equals方法的區(qū)44==操作符與equals方法舉例classTestEquals{publicstaticvoidmain(String[]args){ MyDatem1=newMyDate(14,3,1976); MyDatem2=newMyDate(14,3,1976); if(m1==m2){ System.out.println("m1==m2"); }else{ System.out.println("m1!=m2");//m1!=m2 } if(m1.equals(m2)){ System.out.println("m1isequaltom2");//m1isequaltom2 }else{ System.out.println("m1isnotequaltom2"); }}}請給據(jù)以下代碼自行定義能滿足需要的MyDate類,在MyDate類中覆蓋equals方法,使其判斷當兩個MyDate類型對象的年月日都相同是,結果為ture,否則為false。publicbooleanequals(Objecto)==操作符與equals方法舉例classTestEq45toString方法toString()方法在Object類中定義,其返回值是String類型,返回類名和它的引用地址。在進行String與其它類型數(shù)據(jù)的連接操作時,自動調(diào)用toString()方法

Datenow=newDate(); System.out.println(“now=”+now);

相當于System.out.println(“now=”+now.toString());//now=Date@122345可以根據(jù)需要在用戶自定義類型中重寫toString()方法 如String類重寫了toString(

溫馨提示

  • 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

提交評論