第3章面向?qū)ο蟮暮诵奶匦訽第1頁
第3章面向?qū)ο蟮暮诵奶匦訽第2頁
第3章面向?qū)ο蟮暮诵奶匦訽第3頁
第3章面向?qū)ο蟮暮诵奶匦訽第4頁
第3章面向?qū)ο蟮暮诵奶匦訽第5頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

上海大學(xué)CIMS和機(jī)器人中心Java在工程中的應(yīng)用本科生課程:09326080劉麗蘭2023年2月6日姓名:劉麗蘭學(xué)科專業(yè):機(jī)械制造及自動化聯(lián)系電話:56331763E-Mail:llliu@

上海大學(xué)機(jī)電工程與自動化學(xué)院2023年2月6日第3章面向?qū)ο蟮暮诵奶匦?.1類和對象3.2類的封裝性3.3類的繼承性3.4類的多態(tài)性3.5抽象類和最終類第3章面向?qū)ο蟮暮诵奶匦?.1類和對象3.2類的封裝性3.3類的繼承性3.4類的多態(tài)性3.5抽象類和最終類面向?qū)ο蟮母拍睢獙ο髮ο笥袃蓚€層次的概念:現(xiàn)實生活中對象指的是客觀世界的實體;程序中對象就是一組變量和相關(guān)方法的集合,其中變量表明對象的狀態(tài),方法表明對象所具有的行為。變量方法3.1類和對象現(xiàn)實生活中的對象可以將現(xiàn)實生活中的對象經(jīng)過抽象,映射為程序中的對象。對象在程序中是通過一種抽象數(shù)據(jù)類型來描述的,這種抽象數(shù)據(jù)類型稱為類(Class)。classCar{intcolor_number;intdoor_number;intspeed;

voidbrake(){…}voidspeedUp(){…}voidslowDown(){…}}

抽象數(shù)據(jù)類型3.1類和對象面向?qū)ο蟮母拍睢獙ο竺嫦驅(qū)ο蟮母拍睢愵愂敲枋鰧ο蟮摹盎驹汀?,它定義一類對象所能擁有的數(shù)據(jù)和能完成的操作。在面向?qū)ο蟮某绦蛟O(shè)計中,類是程序的基本單元。相似的對象可以歸并到同一個類中去,就像傳統(tǒng)語言中的變量與類型關(guān)系一樣。

程序中的對象是類的一個實例,是一個軟件單元,它由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操作構(gòu)成。3.1類和對象……Carcar1;Carcar2;……CarcarN;3.1類和對象

面向?qū)ο蟮母拍睢愖兞浚褐笇ο蟮乃赖臓顟B(tài)。方法:指對象的功能單元。消息 軟件對象通過相互間傳遞消息來相互作用和通信,一個消息由三部分組成:

1.接受消息的對象

2.接收對象要采取的方法

3.方法需要的參數(shù)對象B對象A消息3.1類和對象

面向?qū)ο蟮母拍睢愐粋€例子在程序中所操作的對象是類的一個實例。創(chuàng)建一個對象:Helloobj=newHello();調(diào)用方法:obj.showString();

調(diào)用對象的方法相當(dāng)于給對象發(fā)送消息,收到消息的對象通過改變自身的狀態(tài)或者向其它對象發(fā)送消息來響應(yīng)消息。classHello{

}privateStrings;publicvoidshowString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;}變量方法showString()方法changeString()3.1類和對象

面向?qū)ο蟮母拍睢?/p>

為什么要使用類?采用簡單數(shù)據(jù)類型表示現(xiàn)實世界中概念存在很大的局限性。例如:采用int型數(shù)據(jù)表示一個日期概念,需要使用3個變量:

intday,month,year;如果要表示2個人的生日,就要使用6個變量并且在使用中必須時刻注意三者的聯(lián)系和約束關(guān)系同時在使用日期概念時要同時對三個變量進(jìn)行訪問

使用類可以把現(xiàn)實問題中的對象映射為程序中的一個整體——類。3.1類和對象

面向?qū)ο蟮母拍睢愵愔胁坏凶兞?,還有與之相關(guān)的操作所定義的方法。將變量和方法封裝在一個類中,可以對成員變量進(jìn)行隱藏,外部對類成員的訪問都通過方法進(jìn)行,能夠保護(hù)類成員不被非法修改。classBirthDate{publicintday,month,year;publicinttomorrow(){……}}BirthDatemybirth,yourbirth;BirthDatedate;外部要獲得當(dāng)前日期的后一天時,只要調(diào)用:date.tomorrow();3.1類和對象

面向?qū)ο蟮母拍睢?/p>

封裝把對象的所有組成部分組合在一起私有數(shù)據(jù)

方法

方法數(shù)據(jù)對象A對象B公有數(shù)據(jù)封裝定義程序如何引用對象的數(shù)據(jù),封裝實際上使用方法將類的數(shù)據(jù)隱藏起來,控制用戶對類的修改和訪問數(shù)據(jù)的程度。3.1類和對象

面向?qū)ο蟮母拍睢庋b子類是作為另一個類的擴(kuò)充或修正而定義的一個類。bicycle(superclass)MountainbikesRacingbikesTandembikessubclass3.1類和對象

面向?qū)ο蟮母拍睢^承繼承是子類利用父類中定義的方法和變量,就像它們屬于子類本身一樣。classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){…}publicvoidadd_oil(){…}}

classTrash_CarextendsCar{doubleamount;publicvoidfill_trash(){…}}3.1類和對象

面向?qū)ο蟮母拍睢^承覆蓋使得在子類中可以重新定義父類中已有的方法,從而體現(xiàn)出子類自己的行為。classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){speed=0;}publicvoidadd_oil(){…}}

classTrash_CarextendsCar{doubleamount;publicvoidfill_trash(){…}

publicvoidpush_break(){speed=speed–10;}}3.1類和對象

面向?qū)ο蟮母拍睢椒ǖ母采w重載指的是在同一個類中至少有兩個方法用同一個名字,但有不同的參數(shù)。類voidshow(intint_num)voidshow(doubledouble_num)voidshow(intint_num,floatfloat_num)1231.23123,1.233.1類和對象

面向?qū)ο蟮母拍睢椒ǖ闹剌d(多態(tài)性)3.1類和對象publicclassCar{intcar_number;voidset_number(intcar_num){car_number=car_num;}voidshow_number(){System.out.println(“MycarNo.is:”+car_number);}publicstaticvoidmain(Stringargs[]){CarDemocar=newCar();Democar.set_number(3838);Democar.show_number();}}輸出結(jié)果:MycarNo.is:3838閱讀程序,給出結(jié)果3.1類和對象Java定義類

類定義的格式:

類聲明+類主體類聲明{

成員變量的聲明;

成員方法的聲明及實現(xiàn);}1)聲明類[修飾符]class類<泛型>[extends父類][implements接口列表]修飾類的關(guān)鍵字:[public][abstract|final]類名首字母大寫例:publicclassDate1聲明了一個類Date1;該類是公有類,可被所有類訪問。classHello{

}privateStrings;publicvoidshowString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;}變量方法showString()方法changeString()第4周回顧字符串雙引號,Stringstr=“abc”;字符串長度:str.length字符串比較:str.equals(Stringstrb)指定位置字符:str.charAt(i)字符串的子串:str.substring(int,int)對象、類的概念客觀世界的對象是物理實體類是對客觀對象的抽象:狀態(tài)→變量,行為→方法;程序中的對象是類的實例;面向?qū)ο蟮娜齻€特性:封裝、繼承、多態(tài)3.1類和對象Java定義類2)聲明成員變量[修飾符][static][final][transient]數(shù)據(jù)類型變量;例如:publicclassDate1 //類聲明{intyear,month,day; //聲明成員變量}[public|protected|private]類成員變量常量臨時變量3.1類和對象Java定義類3)聲明成員方法方法聲明語法[修飾符]

返回值類型方法([參數(shù)列表])[throws異常類]{

語句序列;[return[返回值]];}[public|protected|private][static][final|abstract][native][synchronized]返回值類型可以是任意的Java數(shù)據(jù)類型,當(dāng)一個方法不需要返回值時,返回值類型為void。參數(shù)的類型可以是簡單數(shù)據(jù)類型,也可以是引用數(shù)據(jù)類型(數(shù)組、類或接口)。方法聲明中的參數(shù)為形式參數(shù),僅限于聲明它的方法之內(nèi)。方法體是對方法的實現(xiàn)。它包括局部變量的聲明以及所有合法的Java指令。方法體:方法的內(nèi)容3.1類和對象Java定義類3)聲明成員方法方法體中的局部變量方法體中聲明的變量為局部變量;作用域限制在方法體中;不能為其賦初值方法體中用return語句返回值方法聲明了返回值類型,必須用return;結(jié)果值的數(shù)據(jù)類型必須與方法聲明的返回值類型一致;方法聲明沒有返回值,return省略;return通常作為方法體的最后一條語句。4)聲明main方法程序從main()方法開始執(zhí)行。必須聲明如下:publicstaticvoidmain(Stringargs[])3.1類和對象Java使用對象:聲明對象->實例化對象->引用對象的成員變量和調(diào)用對象方法->釋放對象。1)聲明對象類對象Date1aday; //聲明aday是Date1類的一個對象2)對象實例化對象=new類的構(gòu)造方法([參數(shù)列表])Date1aday;aday=newDate1();創(chuàng)建類的實例必須調(diào)用類的構(gòu)造方法。使用new創(chuàng)建類的實例,為之分配內(nèi)存并初始化。等價于:Date1aday=newDate1();publicclassDate1{intyear,month,day;voidsetDate(inty,intm,intd){}}3.1類和對象Java使用對象3)引用對象的成員變量和調(diào)用對象方法對象.成員變量對象.成員方法([參數(shù)列表])對象與其成員變量或方法之間使用運算符“.”分割。如:aday.year=2006; //引用對象的成員變量aday.setDate(2006,1,28);//調(diào)用對象的方法3.1類和對象使用對象4)對象的引用模型:類是引用數(shù)據(jù)類型3.1類和對象使用對象5)方法調(diào)用時的參數(shù)傳遞原則基本數(shù)據(jù)類型參數(shù)傳遞值;引用數(shù)據(jù)類型參數(shù)傳遞引用。6)釋放對象Java語言具有資源回收機(jī)制,能夠跟蹤存儲單元的使用情況,自動收回不再被使用的資源。3.1類和對象publicclassTransdata{staticvoidchange(Strings,StringBuffersb){s=“aaaa”;

sb.setLength(0);sb.append(“aaaa”);}publicstaticvoidmain(Stringargs[]){Strings=“bbbb”;StringBuffersb=newStringBuffer(“bbbb”);change(s,sb);System.out.println(s);System.out.println(sb);}}輸出結(jié)果:bbbbaaaa例:第3章面向?qū)ο蟮暮诵奶匦?.1類和對象3.2類的封裝性3.3類的繼承性3.4類的多態(tài)性3.5抽象類和最終類3.2類的封裝性類的封裝性的含義:將數(shù)據(jù)和對數(shù)據(jù)的操作組合起來構(gòu)成類,類是一個不可分割的獨立單位;類中既要提供與外部聯(lián)系的方法,又要盡可能隱藏類的實現(xiàn)細(xì)節(jié)。封裝性的作用:是面向?qū)ο蟮暮诵奶卣髦?,提供信息隱藏技術(shù)。提供軟件模塊化的設(shè)計機(jī)制。使得類的設(shè)計和使用相分離。3.2類的封裝性構(gòu)造方法與析構(gòu)方法構(gòu)造方法 類的構(gòu)造方法是類中一種特殊的成員方法,用于創(chuàng)建類的實例并初始化對象。聲明構(gòu)造方法

構(gòu)造方法與類同名,返回該類的實例,不需要寫返回值類型。

publicclassDate2{

publicDate2(inty,intm,intd) //聲明構(gòu)造方法

{//構(gòu)造方法與類同名,構(gòu)造方法返回該類的一個實例

year=y;month=m;day=d;}}使用new調(diào)用構(gòu)造方法,參數(shù)必須符合構(gòu)造方法的聲明。如:Date2aday=newDate2(2006,1,28);3.2類的封裝性構(gòu)造方法與析構(gòu)方法構(gòu)造方法關(guān)于構(gòu)造方法聲明和使用的幾點說明如果沒有聲明構(gòu)造方法,Java自動為該類生成一個無參數(shù)的構(gòu)造方法;如果聲明了有參數(shù)的構(gòu)造方法,則Java不再自動生成無參數(shù)構(gòu)造方法;如果需要有多種參數(shù)的構(gòu)造方法,需要將構(gòu)造方法重載。構(gòu)造方法與成員方法的不同之處作用不同:構(gòu)造方法用于創(chuàng)建類的實例+成員變量初始化;成員方法實現(xiàn)對類中成員變量的操作;調(diào)用方式不同:構(gòu)造方法需通過new運算符調(diào)用;成員方法通過對象調(diào)用。3.2類的封裝性構(gòu)造方法與析構(gòu)方法析構(gòu)方法:

也是類中一種特殊的成員方法,作用與構(gòu)造方法相反,用于釋放類的實例并執(zhí)行特定操作。

publicvoidfinalize() //析構(gòu)方法{

語句序列;}注意:一般不需要設(shè)計析構(gòu)方法;不能使用已被析構(gòu)方法釋放的對象;一個類只能有一個finalize()方法,且不允許重載。3.2類的封裝性方法的重載重載的含義一個類中有多個同名的方法帶有不同的參數(shù)表,稱為方法的重載。重載的價值:雖然一個方法有多種聲明形式,但都表示相同的含義。程序運行時,調(diào)用與參數(shù)相匹配的重載方法。例:print();publicvoidprint(booleanb)publicvoidprint(charc)publicvoidprint(inti)publicvoidprint(doubled)3.2類的封裝性方法的重載成員方法重載參數(shù)列表必須不同,即以不同的參數(shù)個數(shù)、參數(shù)類型、參數(shù)次序來區(qū)別重載方法;返回值可以相同,也可以不同,不能以不同的返回值來區(qū)別重載方法。例:publicsetDate(inty,intm,intd)publicsetDate(intm,intd) //重載方法,參數(shù)個數(shù)不同publicsetDate(intd)publicsetDate(Date1aday)publicsetDate(inty,intm,intd)publicsetDate(intm,intd,inty) //錯誤重載,參數(shù)列表相同3.2類的封裝性方法的重載構(gòu)造方法重載

publicclassDate2{ publicDate2() { //無參數(shù)的構(gòu)造方法

year=2006; month=1; day=1; } publicDate2(inty,intm,intd){ //指定參數(shù)的構(gòu)造方法,重載

year=y; month=m; day=d; } publicDate2(Date2aday){ //拷貝構(gòu)造方法,重載

year=aday.year; month=aday.month; day=aday.day; }}3.2類的封裝性方法的重載構(gòu)造方法重載Date2aday1=newDate2();Date2aday2=newDate2(2006,2,28);Date2aday3=newDate2(aday2); //由已知對象創(chuàng)建新對 象圖3.2使用拷貝構(gòu)造方法復(fù)制對象3.2類的封裝性this引用和instanceof對象運算符this引用:三種用法指代對象本身語法:this例:publicbooleanequals(Date2aday2){ Date2aday1=this;//this指調(diào)用本方法的當(dāng)前對象

ruturnaday1.year==aday2.year; }訪問本類的成員變量和成員方法this.成員變量this.成員方法([參數(shù)列表])當(dāng)沒有同名成員時,this引用可以省略。當(dāng)成員方法的參數(shù)與成員變量同名時,this不可省略。如:publicclassDate1{intyear,month,day;voidsetDate(inty,intm,intd){year=y;month=m;day=d;}}publicclassDate1{intyear,month,day;voidsetDate(inty,intm,intd){this.year=y;this.month=m;this.day=d;}}等價于publicclassDate1{intyear,month,day;voidsetDate(intyear,intmonth,intday){

this.year=year;

this.month=month;

this.day=day;}}this不能省略3.2類的封裝性this引用和instanceof對象運算符this引用:三種用法調(diào)用本類重載的構(gòu)造方法this引用可用在重載的構(gòu)造方法中,調(diào)用本類已定義的構(gòu)造方法。this([參數(shù)列表]),如:publicDate2(inty,intm,intd){//指定參數(shù)的構(gòu)造方法

year=y; month=m; day=d;}publicDate2(){ this(2006,1,1);//調(diào)用本類已定義的構(gòu)造方法}注:在構(gòu)造方法中,this()引用必須是第一行語句。3.2類的封裝性this引用和instanceof對象運算符instanceof對象運算符判斷一個對象是否屬于指定類及其子類,返回boolean類型。例如:Date2aday=newDate2(2006,5,1);adayinstanceofDate2//返回true,aday是Date2類對象3.1類和對象課堂練習(xí):引用數(shù)據(jù)類型作為方法的參數(shù)和返回值。要求:隨機(jī)生成一個數(shù)組.

inttable[];找出數(shù)組中的最大值,輸出.

intmax(inttable[])為數(shù)組從小到大排序,輸出.

voidselectsort(inttable[])程序結(jié)構(gòu):publicclassArray1{ int[]random(intn){//隨機(jī)生成一個數(shù)組 聲明數(shù)組;

for循環(huán)隨機(jī)生成數(shù)組; 返回數(shù)組地址;

} intmax(inttable[]){//找出數(shù)組中的最大值 聲明最大值變量,賦初值;

for循環(huán),取得最大值; 返回最大值變量;

} voidselectsort(inttable[]){ //為數(shù)組元素排序

2個for循環(huán)嵌套; 無返回值;

} publicstaticvoidmain(Stringargs[]){ //主函數(shù),入口 創(chuàng)建Array1的實例對象; 實例對象調(diào)用random方法,生成數(shù)組; 實例對象調(diào)用max方法,輸出最大值; 實例對象調(diào)用selectsort方法,輸出;

}}第5周回顧定義類:[修飾符]class類<泛型>[extends父類][implements接口列表][修飾符][static][final][transient]數(shù)據(jù)類型變量;[修飾符]返回值類型方法([參數(shù)列表])[throws異常類]{}使用對象:

類對象=new類的構(gòu)造方法([參數(shù)列表]);類的封裝性構(gòu)造方法和析構(gòu)方法方法的重載:一般方法、構(gòu)造方法This3.2類的封裝性類及其成員的訪問權(quán)限類中成員的訪問權(quán)限注:public等訪問權(quán)限不能修飾方法體中的局部變量。publicclassA{publicvoidB(inti){

publicintj; //錯誤

}}權(quán)限修飾符同一類同一包不同包的子類所有類public(公有)protected(保護(hù))缺省private(私有)3.2類的封裝性類及其成員的訪問權(quán)限類的訪問權(quán)限:只有public和缺省兩種publicclassDate1 //公有的類classDate1_ex //默認(rèn)的類注:一個源程序文件中可以聲明多個類,但用public修飾的類只能有1個,并且該類名必須與文件名相同。程序結(jié)構(gòu)I:publicclassArray1{ int[]random(intn) {

} intmax(inttable[]) { } voidselectsort(inttable[]) { } publicstaticvoidmain(Stringargs[]) { }}程序結(jié)構(gòu)II:publicclassArray1{ int[]random(intn) {

} intmax(inttable[]) { } voidselectsort(inttable[]) { }}classArray1_ex{ publicstaticvoidmain(Stringargs[]){ }}3.2類的封裝性類及其成員的訪問權(quán)限訪問權(quán)限填空舉例:一個源程序文件Date1.java()classDate1{

()intyear,month,day;

()voidsetYear(){

()inty; this.year=y; }}()classDate1_ex{ publicstaticvoidmain(Stringargs[]){ }}答案:(public)classDate1{ (public)intyear,month,day; (private) (protected) (public)voidsetYear(){ ()inty; this.year=y; }}()classDate1_ex{ publicstaticvoidmain(Stringargs[]){ }}實例成員與類成員

static

在變量或方法之前,表明它們是屬于類的,稱為類方法(靜態(tài)方法)或類變量(靜態(tài)變量)。若無static修飾,則是實例方法和實例變量。類變量在各實例間共享classABCD{chardata;

staticintshare_data;}classDemo{ABCDa,b,c,d;}objectachardataobjectcchardataObjectbchardatastaticintshare_dataobjectdchardata3.2類的封裝性3.2類的封裝性實例成員與類成員實例成員變量與類成員變量兩者聲明時的差別 使用static聲明的為類成員變量,沒有使用static聲明的為實例成員變量publicclassPerson1{Stringname;//姓名,實例成員變量

intage; //年齡,實例成員變量

staticintcount;//人數(shù),類成員變量}類變量的生存期不依賴于對象,相當(dāng)于C語言中全局變量的作用。其它類可以不用通過創(chuàng)建該類的實例,直接通過類名訪問它們。3.2類的封裝性實例成員與類成員實例成員變量與類成員變量兩者存儲結(jié)構(gòu)的差別:1個和多個創(chuàng)建一個對象時,系統(tǒng)會為每一個對象的每一個實例成員變量分配一個存儲單元;而為每一個類成員變量只分配一個存儲單元,所有對象共用一個類成員變量。Person1p1=newPerson1(“李大明”,21);Person1p2=newPerson1(“王大偉”,19);圖3.4實例成員變量與類成員變量的存儲結(jié)構(gòu)不同3.2類的封裝性實例成員與類成員實例成員變量與類成員變量兩者引用方式的差別:對象和類實例成員變量屬于對象,必須通過對象訪問;類成員變量屬于類,既可以通過對象,也可以通過類訪問。; //通過對象訪問實例成員變量p1.count; //通過對象訪問類成員變量Person1.count //通過類訪問類成員變量3.2類的封裝性實例成員與類成員實例成員方法與類成員方法兩者聲明時的差別

聲明方法時,使用static聲明的為類成員方法,沒有使用static聲明的為實例成員方法:publicstaticinthowMany() //類成員方法{returncount;//類成員方法只能訪問類成員變量}類方法則相當(dāng)于C語言中的全局函數(shù),其他的類可以直接通過類名來訪問類方法。(Java程序的入口方法main()就是一個類方法)?如何修改?實例成員與類成員實例成員方法與類成員方法兩者方法體中語句的差別類成員方法只能訪問類成員變量;實例成員方法既可以訪問類成員變量,也可以訪問實例成員變量;在類成員方法體中,不能使用this引用。例:publicclassStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){

System.out.println(mystring);}}3.2類的封裝性解決辦法1:將變量改成類變量publicclassNoStaticError{

staticStringmystring=“hello”;publicstaticvoidmain(Stringargs[]){System.out.println(mystring);}}解決的辦法2:先創(chuàng)建一個類的實例publicclassNoStaticError{Stringmystring=“hello”;publicstaticvoidmain(Stringargs[]){NoStaticErrornoError=newNoStaticError();System.out.println(noError.mystring);}}StaticError.java:6:無法從靜態(tài)上下文中引用非靜態(tài)變量mystringSystem.out.println(mystring);//錯誤^3.2類的封裝性實例成員與類成員實例成員方法與類成員方法兩者調(diào)用方式的差別實例成員方法只能通過對象調(diào)用;類成員方法通過類調(diào)用,也可以通過對象調(diào)用Person1.howMany();//通過類名調(diào)用類成員方法p1.howMany();//通過對象調(diào)用類成員方法閱讀P83,【例3.3】第3章面向?qū)ο蟮暮诵奶匦?.1類和對象3.2類的封裝性3.3類的繼承性3.4類的多態(tài)性3.5抽象類和最終類3.3類的繼承性什么是繼承繼承性是面向?qū)ο蟮暮诵奶卣髦?,是實現(xiàn)軟件可重用性的最重要手段。繼承的概念由一個已有的類定義一個新類,稱為新類繼承已有的類。圖3.5類的繼承性注:子類自動擁有父類的全部成員,包括成員變量和方法,使父類成員得以傳承和延續(xù);子類可以更改父類成員,使父類成員適應(yīng)新的需求;子類可以增加自己的成員,使類的功能得以擴(kuò)充;子類不能刪除父類成員。3.3類的繼承性什么是繼承繼承的作用單重繼承方式下,父類和子類是一對多的關(guān)系。通常將通用性的功能設(shè)計在祖先類中,將特殊性的功能設(shè)計在后代類中。繼承原則子類繼承父類的成員變量,包括實例成員變量和類成員變量。子類繼承父類除構(gòu)造方法以外的成員方法,包括實例成員方法和類成員方法。子類不能繼承父類的構(gòu)造方法。因為父類構(gòu)造方法創(chuàng)建的是父類對象,子類必須聲明自己的構(gòu)造方法,創(chuàng)建子類自己的對象。子類能夠繼承父類的析構(gòu)方法。子類不能刪除父類成員。子類可以增加自己的成員變量和成員方法。子類可以重定義父類成員。何時選擇繼承?一個很好的經(jīng)驗:“B是一個A嗎?”如果是則讓B做A的子類。常犯的錯誤:A有一個B嗎?例如讓汽車輪子成為汽車的子類是錯誤的3.3類的繼承性3.3類的繼承性定義繼承的類聲明繼承的類[修飾符]class類<泛型>[extends

父類][implements接口列表]publicclassStudent1extendsPerson1

{Stringspeciality; //專業(yè)}publicclassTeacher1extendsPerson1{ Stringdepartment; //系別}根據(jù)繼承原則,Student1和Teacher1繼承了父類Person1的變量name、age和方法;同時又增加了自己的變量。Java只支持單重繼承方式,即一個類只能有一個父類。3.3類的繼承性定義繼承的類Java中的類都是Object的子類,因此不需要聲明。publicclassPerson1extendsObject類的賦值相容性“即是”性質(zhì):子類對象即是父類對象,反之不成立Person1p1=newPerson1(“李小明”,21);Student1s1=newStudent1(“王大偉”,19);p1instanceofPerson1 //trues1instanceofPerson1 //true,子類對象即是父類對象p1instanceofStudent1 //false,父類對象不是子類對象父類對象能夠被賦值為子類對象,反之不成立Person1p1=newStudent1(); //賦值相容,子類對象即是父類對象Student1s1=newPerson1(); //賦值不相容,父類對象不是子類對 象3.3類的繼承性定義繼承的類子類對象對父類成員的訪問權(quán)限子類對父類的私有成員(private)沒有訪問權(quán)限;子類對父類的公有成員(public)和保護(hù)成員(protected)具有訪問權(quán)限。子類對父類中缺省權(quán)限成員的訪問分兩種情況,對同一包中父類的缺省權(quán)限成員具有訪問權(quán)限,而對不同包中父類的缺省權(quán)限成員則沒有訪問權(quán)限。子類重定義從父類繼承來的成員子類重定義父類的同名成員變量,同名成員之間不會產(chǎn)生沖突和混亂。父類對象引用父類成員。子類對象引用子類成員。3.3類的繼承性定義繼承的類子類重定義從父類繼承來的成員子類隱藏父類成員變量子類重定義父類的同名成員變量,則稱子類隱藏了父類成員變量。子類覆蓋父類成員方法子類重定義父類同名方法,參數(shù)列表完全相同時,稱為覆蓋。子類繼承并重載父類成員方法子類重定義父類的同名方法,參數(shù)列表不同時,子類繼承了父類的成員方法,并重載了繼承來的該成員方法。即子類有兩個重載的同名方法,參數(shù)列表不同。3.3類的繼承性super引用在子類的成員方法中,可以用super引用父類成員。調(diào)用父類的構(gòu)造方法子類不能繼承父類的構(gòu)造方法,但可以用super調(diào)用。super([參數(shù)列表])引用父類同名成員若存在重定義,則需使用super。子類隱藏父類成員變量super.成員變量子類覆蓋父類成員方法super.成員方法([參數(shù)列表])重載時不需要,為什么?因為當(dāng)重載時,能夠通過調(diào)用時的實際參數(shù)相互區(qū)別,不存在歧義,因此重載時不需要用super。3.3類的繼承性舉例說明:publicclassStudent1extendsPerson1{ privateStringspeciality; //子類私有成員變量

publicStudent1(Stringname,intage,Stringspec) {//子類構(gòu)造方法

super(name,age); //調(diào)用父類的構(gòu)造方法

speciality=spec; } publicstaticvoidmain(Stringargs[]) { Person1p1=newPerson1("李小明",21); Student1s1=newStudent1(“王大偉”,10,“計算機(jī)”);System.out.println(+“比”++“大”+p1.olderThen(s1)+“歲”); //通過對象調(diào)用父類的方法

s1=null; Person1.howMany(); //調(diào)用父類的類成員方法

}}第7周回顧對象、類的概念客觀世界的對象是物理實體類是對客觀對象的抽象:狀態(tài)→變量,行為→方法;定義類:[修飾符]class類<泛型>[extends父類][implements接口列表]類對象=new類的構(gòu)造方法([參數(shù)列表]);類的封裝性構(gòu)造方法和析構(gòu)方法訪問權(quán)限:public,protected,private類的繼承性[修飾符]class類<泛型>[extends

父類]單重繼承,super第3章面向?qū)ο蟮暮诵奶匦?.1類和對象3.2類的封裝性3.3類的繼承性3.4類的多態(tài)性3.5抽象類和最終類3.4類的多態(tài)性什么是多態(tài)多態(tài)性是面向?qū)ο蟮暮诵奶卣髦?,提供類中方法設(shè)計的靈活性和執(zhí)行的多樣性。多態(tài)性是指一個方法可以有多種實現(xiàn)版本,即“一種定義,多種實現(xiàn)”。方法的多態(tài)性主要有方法的重載和方法的覆蓋。方法的重載重載(overload)是指同一個類中的多個方法可以同名但參數(shù)列表必須不同。方法的覆蓋覆蓋(override)是指子類聲明并實現(xiàn)父類中的同名方法并且參數(shù)列表也完全相同。Java執(zhí)行方法的原則:從對象所屬的類開始,尋找匹配的方法執(zhí)行;如果當(dāng)前類中沒有匹配的方法,則逐層向上依次在父類或祖先類尋找匹配的方法,直到Object類。3.4類的多態(tài)性什么是多態(tài)舉例判斷:覆蓋?重載?3.4類的多態(tài)性運行時多態(tài)性多態(tài)性有兩種:編譯時多態(tài)性和運行時多態(tài)性。對于多個同名方法,如果在編譯時能確定執(zhí)行同名方法中的哪一個,稱為編譯時多態(tài)性,否則為運行時多態(tài)性。方法的重載都是編譯時多態(tài)性方法的覆蓋表現(xiàn)出兩種多態(tài)性:編譯時多態(tài)性:對象獲得本類實例Person1p1=newPerson1(“李小明”,21);//對象獲得本類的實例, 對象與其獲得的實例類型一致Student1s1=newStudent2("王大偉",19);p1.print(); //編譯時多態(tài)性,執(zhí)行Person1類的方法s1.print(); //編譯時多態(tài)性,執(zhí)行Student2類的方法3.4類的多態(tài)性運行時多態(tài)性運行時多態(tài)性:父類對象獲得子類的實例Person1p2=newStudent2();//p2獲得子類對象,對象 與其獲得的實例類型不一致p2.print(); //運行時多態(tài),執(zhí)行Student2類覆蓋的方法此時,父類對象只能執(zhí)行那些在父類中聲明、子類覆蓋的子類方法。如:p2.set(“胡東東”,20);//正確,調(diào)用Person1類的set()方法p2.set(“胡東東”,20,“計算機(jī)”) //編譯錯,Person1類沒有該方法3.5類的抽象性3.5類的抽象性抽象類(abstract)聲明抽象類與抽象方法關(guān)鍵字:abstractpublicabstractclassClosedFigure//閉合圖形抽象類{publicabstractdoublearea(); //計算面積,抽象方

法,分號";"必不可少

溫馨提示

  • 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

提交評論