版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第3章類的封裝、繼承和多態(tài)3.1類和對(duì)象3.2類的封裝性3.3類的繼承性3.4類的多態(tài)性3.5類的抽象性第3章類的封裝、繼承和多態(tài)內(nèi)容和要求:類的聲明和封裝,對(duì)象引用模型。類的繼承原則,多態(tài)(重載和覆蓋)。抽象類和抽象方法,最終類和最終方法。重點(diǎn):類的封裝、繼承、多態(tài)和抽象性。難點(diǎn):繼承,運(yùn)行時(shí)多態(tài)。3.1類和對(duì)象類(class)是既包括數(shù)據(jù)又包括作用于數(shù)據(jù)的一組操作的封裝體。對(duì)象(object)是類的實(shí)例(instance)。類具有封裝性、繼承性、多態(tài)性和抽象性。3.1.1類聲明類類聲明{
成員變量的聲明;
成員方法的聲明及實(shí)現(xiàn);}[修飾符]class
類[<泛型>][extends父類][implements接口列表]2.聲明成員變量和成員方法[修飾符][<泛型>]返回值類型方法([形式參數(shù)列表])[throws異常類]{
語(yǔ)句序列;[return[返回值]];}《Java程序設(shè)計(jì)實(shí)用教程(第5版)》第3章6日期類MyDate
publicclassMyDate//類聲明{
intyear,month,day;//成員變量
voidset(inty,intm,intd)//成員方法,設(shè)置日期值
{year=y;month=m;day=d;}}《Java程序設(shè)計(jì)實(shí)用教程(第5版)》第3章73.成員方法重載一個(gè)類中可以聲明多個(gè)同名、但參數(shù)列表不同的成員方法,稱為類的成員方法重載,為一種功能提供多種實(shí)現(xiàn)。重載方法之間的參數(shù)列表(數(shù)據(jù)類型、參數(shù)個(gè)數(shù)、參數(shù)次序)必須不同。voidset(inty,intm,intd)voidset(intm,intd)//重載方法,參數(shù)個(gè)數(shù)不同voidset(intd)voidset(MyDatedate)//重載方法,參數(shù)的數(shù)據(jù)類型不同voidset(intm,intd,inty)//語(yǔ)法錯(cuò),參數(shù)列表相同voidset(inty=0,intm=0,intd=0)//語(yǔ)法錯(cuò),參數(shù)不能指定默認(rèn)值3.1.2對(duì)象聲明對(duì)象類對(duì)象創(chuàng)建實(shí)例對(duì)象=new
類的構(gòu)造方法([實(shí)際參數(shù)列表])引用對(duì)象的成員變量和調(diào)用對(duì)象方法對(duì)象.成員變量對(duì)象.成員方法([實(shí)際參數(shù)列表])Java語(yǔ)言自動(dòng)釋放對(duì)象。4.對(duì)象的引用模型【例3.1】聲明日期類
及使用日期對(duì)象。【答】②表達(dá)式y(tǒng)ear+'-'+month+'-'+day的運(yùn)算結(jié)果類型是int,不能轉(zhuǎn)換成String類型,改成year+"-"+month+"-"+day【思考題3-1】①M(fèi)yDate沒(méi)有聲明構(gòu)造方法,為什么能夠使用newMyDate()創(chuàng)建實(shí)例?②如果toString()方法實(shí)現(xiàn)為如下,會(huì)怎樣?returnyear+'-'+month+'-'+day;
3.2類的封裝性3.2.1構(gòu)造方法與析構(gòu)方法3.2.2對(duì)象的引用和運(yùn)算3.2.3訪問(wèn)控制3.2.4靜態(tài)成員3.2.5淺拷貝與深拷貝3.2.1構(gòu)造方法與析構(gòu)方法聲明及調(diào)用構(gòu)造方法//指定參數(shù)的構(gòu)造方法,參數(shù)與成員變量同名publicMyDate(intyear,intmonth,intday){this.year=year;//this.year指成員變量,year指參數(shù)
this.month=month;//this引用不能省略
this.day=day;}MyDated1=newMyDate(2017,10,1);默認(rèn)構(gòu)造方法publicMyDate()3.拷貝構(gòu)造方法publicMyDate(MyDatedate){
this.year=date.year;
this.month=date.month;
this.day=date.day;}調(diào)用語(yǔ)句如下:MyDated2=newMyDate(d1);功能相當(dāng)于以下兩句:MyDated2=newMyDate();d2.set(d1);4.構(gòu)造方法重載publicMyDate(intyear,intmonth,intday)publicMyDate(){this(1970,1,1);//this引用}publicMyDate(MyDatedate){this(date.year,date.month,date.day);}5.析構(gòu)方法用于釋放實(shí)例并執(zhí)行特定操作。一個(gè)類只能有一個(gè)析構(gòu)方法,不能重載。Java約定析構(gòu)方法聲明如下:publicvoidfinalize() //析構(gòu)方法{
語(yǔ)句序列;}3.2.2對(duì)象的引用和運(yùn)算this引用指代對(duì)象本身this訪問(wèn)本類的成員變量和成員方法this.成員變量this.成員方法([實(shí)際參數(shù)列表])調(diào)用本類重載的構(gòu)造方法this([實(shí)際參數(shù)列表])instanceof對(duì)象運(yùn)算符d1instanceof
MyDate
圖3-2查看this引用實(shí)例的
成員變量值
2.對(duì)象的關(guān)系運(yùn)算與比較相等MyDate類的equals(date)方法
//比較this與date日期值是否相等publicboolean
equals(MyDatedate)
{returnthis==date||date!=null&&
this.year==date.year&&
this.month==date.month&&
this.day==date.day;//this指代調(diào)用當(dāng)前方法的對(duì)象,通過(guò)this引用訪問(wèn)當(dāng)前對(duì)象的成員變量,后三處this可省略}3.2.3訪問(wèn)控制類的訪問(wèn)權(quán)限:只有public和缺省兩種。publicclassMyDateclassMyDate_ex類中成員的訪問(wèn)權(quán)限權(quán)限修飾符同一類同一包不同包的子類所有類public(公有)protected(保護(hù))缺省private(私有)3.聲明set()和get()方法存取對(duì)象的屬性d1.month=13;//沒(méi)有語(yǔ)法錯(cuò)誤,邏輯錯(cuò)誤private
int
year,month,day;//私有成員變量voidset(intyear,intmonth,intday)voidset(MyDatedate)//設(shè)置日期值,重載int
getYear()//獲得年份int
getMonth()//獲得月份int
getDay()//獲得當(dāng)月日期3.2.4靜態(tài)成員publicclassMyDate{privateint
year,month,day;//實(shí)例成員變量
privatestatic
int
thisYear=2018;//靜態(tài)成員變量
static//靜態(tài)初始化塊,類加載時(shí)執(zhí)行一次
{
thisYear=2018;}publicstatic
int
getThisYear()//靜態(tài)成員方法{
returnthisYear;//訪問(wèn)靜態(tài)成員變量}}//注意:①在靜態(tài)成員方法體中,不能訪問(wèn)實(shí)例成員,不能使用this引用。②static不能修飾方法的局部變量?!纠?.2】封裝的日期類。本例目的:以MyDate類為例,演示類的封裝。技術(shù)要點(diǎn):重載構(gòu)造方法;為成員變量和成員方法設(shè)置訪問(wèn)控制權(quán)限;使用this引用增強(qiáng)程序的可維護(hù)性;聲明靜態(tài)成員。【例3.2】封裝的日期類。圖3-4實(shí)例成員變量與靜態(tài)成員變量的存儲(chǔ)結(jié)構(gòu)不同(1)實(shí)例成員與靜態(tài)成員(2)方法調(diào)用和返回時(shí)傳遞對(duì)象引用圖3-5方法調(diào)用與返回時(shí)傳遞對(duì)象引用【例3.2】封裝的日期類。(3)日期類的設(shè)計(jì)問(wèn)題討論(4)類封裝的優(yōu)點(diǎn)【思考題3-2】增加方法,public:int
getWeek()//返回this對(duì)應(yīng)的星期幾,范圍為0~6StringtoWeekString()//返回this對(duì)應(yīng)星期幾的中文字符串boolean
before(MyDatedate)//判斷this是否在date日期之前MyDate
daysAfter(intn)//返回this之后n天的日期MyDate
daysBefore(intn)//返回this之前n天日期int
yearsBetween(MyDatedate)//返回this與date日期相距的年數(shù)int
monthsBetween(MyDatedate)//返回this與date日期相距的月數(shù)int
daysBetween(MyDatedate)//返回this與date日期相距的天數(shù)3.2.5淺拷貝與深拷貝淺拷貝,成員變量逐域賦值publicMyDate(MyDatedate){
this.year=date.year;
this.month=date.month;
this.day=date.day;}Person類的拷貝構(gòu)造方法Stringname;
MyDate
birthdate;publicPerson(Personper)//拷貝構(gòu)造方法{=;
this.birthdate=per.birthdate;//引用賦值}2.深拷貝publicPerson(Personper){=;
this.birthdate=new
MyDate(per.birthdate);//創(chuàng)建實(shí)例}p2.birthdate=newMyDate(p1.birthdate);Java沒(méi)有提供默認(rèn)拷貝構(gòu)造方法問(wèn)題:為什么Java不提供默認(rèn)拷貝構(gòu)造方法?【答】由于Java的類采用引用模型,當(dāng)對(duì)象作為方法參數(shù)和返回值時(shí),傳遞對(duì)象引用,不需要復(fù)制對(duì)象,沒(méi)有執(zhí)行拷貝構(gòu)造方法。
C++語(yǔ)言提供默認(rèn)拷貝構(gòu)造函數(shù)。當(dāng)對(duì)象作為函數(shù)參數(shù)和返回值時(shí),需要復(fù)制對(duì)象(結(jié)構(gòu)),默認(rèn)執(zhí)行拷貝構(gòu)造方法?!纠?.3】Person類。本例目的:聲明Person類作為父類,為子類提供具有共同屬性的通用功能設(shè)計(jì)。技術(shù)要點(diǎn):采用封裝技術(shù);當(dāng)類的成員變量是對(duì)象時(shí),研究深拷貝問(wèn)題。MyEclipse設(shè)置編譯路徑:包含例3.2項(xiàng)目?!舅伎碱}3-3】
為Person類增加以下方法:int
getAge(intyear)//返回在year年的年齡int
getAge()//返回今年的年齡,重載int
older(Personper)//返回this與per
//的年齡差值,按年齡比較對(duì)象大小boolean
equals(Personper)//比較this與//per引用實(shí)例對(duì)應(yīng)成員變量值是否相等比較當(dāng)前對(duì)象與對(duì)象per是否相等publicboolean
equals(Personper){returnthis==per||per!=null&&
.equals()&&
this.birthdate.equals(per.birthdate)&&……;}3.3類的繼承性3.3.1由繼承派生類3.3.2繼承原則及作用3.3.3子類的構(gòu)造方法3.3.1由繼承派生類[修飾符]class類[<泛型>][extends父類][implements接口列表]publicclassStudent
extendsPerson{Stringspeciality; //專業(yè)}
【例3.4】Student類繼承Person類MyEclipse設(shè)置編譯路徑:包含例3.2、例3.3項(xiàng)目。Personper=newPerson("李小明",newMyDate(1994,3,15));Studentstu=newStudent();//默認(rèn)構(gòu)造方法,執(zhí)行Person()stu.set("張莉",newMyDate(1998,4,5));//調(diào)用父類的成員方法stu.speciality="計(jì)算機(jī)";Student.howMany();//執(zhí)行Person.howMany()System.out.println(per.toString()+";"+stu.toString());stu.finalize();//繼承父類的析構(gòu)方法Student.howMany();【思考題3-4】已經(jīng)為stu.speciality賦值了,為什么沒(méi)有輸出它?怎樣為Student類增加的speciality成員變量設(shè)置并輸出值?Student.howMany()方法怎樣為Student類的實(shí)例計(jì)數(shù)?3.3.2繼承原則及作用繼承原則子類繼承父類的成員變量子類繼承父類除構(gòu)造方法以外的成員方法,包括實(shí)例成員方法和靜態(tài)成員方法,包括析構(gòu)方法。子類不能繼承父類的構(gòu)造方法子類可以增加成員,可以重定義從父類繼承來(lái)的成員,但不能刪除它們。2.繼承的作用單繼承,樹(shù)結(jié)構(gòu)3.Object類publicclassObject
{publicObject() //構(gòu)造方法
publicStringtoString()//描述對(duì)象
publicboolean
equals(Object
obj)//比較對(duì)象相等
protectedvoidfinalize()throwsThrowable}Java中的類都是Object的子類publicclassPersonextendsObject【思考題】Object()有什么作用?Objectobj=newObject();4.子類對(duì)父類成員的訪問(wèn)權(quán)限子類不能訪問(wèn)父類的私有成員(private)。子類能夠訪問(wèn)父類的公有成員(public)和保護(hù)成員(protected)。子類對(duì)父類的缺省權(quán)限成員的訪問(wèn)控制,以包為界分兩種情況,可以訪問(wèn)當(dāng)前包中3.3.3子類的構(gòu)造方法使用super()調(diào)用父類構(gòu)造方法super([實(shí)際參數(shù)列表])publicStudent(Stringname,MyDate
birthdate,Stringspec){
super(name,birthdate);//調(diào)用父類同參數(shù)的構(gòu)造方法
this.speciality=spec;}默認(rèn)執(zhí)行super()publicStudent()//Java提供的默認(rèn)構(gòu)造方法{
super(); //調(diào)用父類構(gòu)造方法Person()}子類的構(gòu)造方法沒(méi)有調(diào)用super()或this(),將默認(rèn)執(zhí)行super()publicPerson(){super();//調(diào)用父類構(gòu)造方法Object()}publicStudent(){
super();//默認(rèn)調(diào)用
this.speciality="";}圖3-8子類構(gòu)造方法逐個(gè)調(diào)用成員對(duì)象和父類的構(gòu)造方法3.4類的多態(tài)性3.4.1
子類聲明多態(tài)成員3.4.2類型的多態(tài)3.4.3何時(shí)確定執(zhí)行哪個(gè)多態(tài)方法?怎樣執(zhí)行?3.4.4多態(tài)的方法實(shí)現(xiàn)3.4.1子類聲明多態(tài)成員原則(1)子類聲明的成員變量與父類同名,則隱藏(2)子類聲明的成員方法與父類同名:如果參數(shù)列表相同,則覆蓋(override);如果參數(shù)列表不同,則重載(overload)。多態(tài)成員,默認(rèn)訪問(wèn)子類聲明的成員。2.super引用(1)調(diào)用父類的構(gòu)造方法super([實(shí)際參數(shù)列表])(2)引用父類同名成員super.成員變量//引用父類成員變量(被隱藏)super.成員方法([實(shí)際參數(shù)列表])//調(diào)用父類成員方法(被覆蓋)注意:在靜態(tài)方法中不能使用super。【例3.5】Student類聲明多態(tài)成員。本例目的:聲明Student類繼承Person類,增加具有個(gè)性屬性的特定功能設(shè)計(jì);重定義從父類繼承來(lái)的成員,演示在類的繼承關(guān)系下的多態(tài)設(shè)計(jì)。技術(shù)要點(diǎn):兩種多態(tài):隱藏父類成員變量;重載、覆蓋父類成員方法?!纠?.5】Student類聲明多態(tài)成員。
【練習(xí)題1】publicclassPerson
{privateStringname;publicPerson(Stringname){=name;}publicStringtoString(){;}}publicclassStudent1extendsPerson{privateStringname;publicStudent1(Stringname){
super(name);}publicStringtoString(){;}publicstaticvoidmain(String[]args){Student1s1=newStudent1("李小明");System.out.println(s1.toString());}①運(yùn)行結(jié)果?為什么?}②toString()方法與父類的toString()方法聲明和實(shí)現(xiàn)相同,省略時(shí),運(yùn)行結(jié)果是什么?為什么?
null。李小明。//隱藏//賦值Person的name//覆蓋//取值Student的name
returnsuper.toString()+","+;//輸出兩者【練習(xí)題1】publicclassPerson
{privateStringname;publicPerson(Stringname){=name;}publicStringtoString(){;}}publicclassStudent1extendsPerson{privateStringname;//隱藏publicStudent1(Stringname){super(name);}publicstaticvoidmain(String[]args){Student1s1=newStudent1("李小明");System.out.println(s1.toString());}}//運(yùn)行結(jié)果?李小明因?yàn)椋瑯?gòu)造方法為Person的name賦值;Student類繼承toString()方法,取Person的name值?!揪毩?xí)題2】publicclassPerson
{privateStringname;publicPerson(Stringname){=name;}
publicPerson(){this(null);}publicStringtoString(){;}}publicclassStudent2extendsPerson{privateStringname;//隱藏publicStudent2(Stringname){
=name;}publicStringtoString()//覆蓋{;}publicstaticvoidmain(String[]args){Student2s2=newStudent2("李小明");System.out.println(s2.toString());}}①運(yùn)行結(jié)果?為什么?②toString()方法與父類的toString()方法聲明和實(shí)現(xiàn)相同,省略時(shí),運(yùn)行結(jié)果是什么?為什么?李小明。null。3.4.2類型的多態(tài)子類對(duì)象即是父類對(duì)象newStudent()instanceofPerson//truenewPerson()instanceofStudent//false
父類對(duì)象引用子類實(shí)例Personper=newStudent();//賦值相容Studentstu=newPerson();//語(yǔ)法錯(cuò)Objectobj=newPerson();//賦值相容已知Person類聲明
int
older(Personper)Person類的形式參數(shù)per可獲得其子類Student的對(duì)象引用。Personper=newPerson(…);Studentstu1=newStudent(…),stu2=newStudent(…);per.older(stu1)//參數(shù)為子類對(duì)象,賦值相容,
//參數(shù)傳遞等價(jià)于“形式參數(shù)per=實(shí)際參數(shù)stu1”【思考題】以下調(diào)用是否正確?為什么?stu1.older(per)stu2.older(stu1)//子類對(duì)象調(diào)用父類方法,參數(shù)為父類對(duì)象//子類對(duì)象調(diào)用父類方法,參數(shù)為子類對(duì)象,參數(shù)賦值相容3.4.3何時(shí)確定執(zhí)行哪個(gè)多態(tài)方法?怎樣執(zhí)行?編譯時(shí)多態(tài)性和運(yùn)行時(shí)多態(tài)性方法重載都是編譯時(shí)多態(tài)。方法覆蓋表現(xiàn)出兩種多態(tài)性,當(dāng)對(duì)象引用本類實(shí)例時(shí),為編譯時(shí)多態(tài),否則為運(yùn)行時(shí)多態(tài)。Personper=newPerson(……);per.toString()//執(zhí)行Person類的toString()Studentstu=newStudent(……);stu.toString() //執(zhí)行Student類的toString()2.運(yùn)行時(shí)多態(tài)的意義及其執(zhí)行過(guò)程Objectobj=newStudent(…); //父類對(duì)象obj引用子類實(shí)例obj.toString()//執(zhí)行誰(shuí)的toString()?//編譯器認(rèn)為執(zhí)行Object的toString()
//運(yùn)行系統(tǒng)希望執(zhí)行obj引用實(shí)例所屬類Student的toString()圖3-10尋找(newStudent()).toString()匹配的執(zhí)行方法2.運(yùn)行時(shí)多態(tài)的意義再問(wèn),以下語(yǔ)句結(jié)果會(huì)怎樣?Personper=newStudent(……);per.set(“經(jīng)濟(jì)管理系”,“信息管理專業(yè)”,“003”,true);//語(yǔ)法錯(cuò),因?yàn)镻erson類沒(méi)有聲明該方法父類對(duì)象只能執(zhí)行那些在父類中聲明、被子類覆蓋了的子類方法,不能執(zhí)行子類增加的成員方法。Object類對(duì)象obj只能調(diào)用Object類聲明的方法,如toString()和equals()等方法。運(yùn)行時(shí)多態(tài)的意義:在父類中約定通用的方法聲明,為子類提供默認(rèn)實(shí)現(xiàn);子類覆蓋提供不同的方法實(shí)現(xiàn)。3.4.4多態(tài)的方法實(shí)現(xiàn)多態(tài)的toString()方法Object類聲明以下,作用是為子類提供默認(rèn)toString()方法。publicStringtoString()//返回當(dāng)前對(duì)象的描述字符串{returnthis.getClass().getName()+"@"+
Integer.toHexString(this.hashCode());}不能滿足子類的個(gè)性要求。所以一個(gè)類需要覆蓋父類或Object類的toString()方法,給出符合自己類需求的方法實(shí)現(xiàn)。2.多態(tài)的equals(Object)方法(1)Object類聲明equals(Object)方法publicboolean
equals(Object
obj){returnthis==obj;}作用是:為子類提供默認(rèn)equals(Object)方法。為子類覆蓋提供方法聲明,運(yùn)行時(shí)多態(tài)。String、MyDate類覆蓋equals(Object)方法。(2)Person子類必須覆蓋Object
類的equals(Object)方法<1>Person類不需要聲明equals(Person)方法。boolean
equals(Personper)//Person類聲明,比較對(duì)象值boolean
equals(Object
obj)//繼承Object,比較對(duì)象引用兩者重載,編譯時(shí)多態(tài),調(diào)用如下:Personper1=newPerson("李小明",…));Personper2=newPerson(per1);//深拷貝per1.equals(per2)//調(diào)用equals(Person),結(jié)果true,正確Objectobj=newPerson(per1);//深拷貝per1.equals(obj)//調(diào)用equals(Object),結(jié)果為false,//邏輯錯(cuò)誤,僅比較對(duì)象引用,算法不適合子類(單步調(diào)試)publicboolean
equals(Object
obj){
if(this==obj)returntrue;//當(dāng)obj引用實(shí)例屬于Person及其子類,包含Student實(shí)例
if(obj
instanceofPerson)
{Personper=(Person)obj;//強(qiáng)制類型轉(zhuǎn)換
.equals()&&//誰(shuí)的?
this.birthdate.equals(per.birthdate)&&…;}returnfalse;}<2>Person類必須覆蓋equals(Object)方法String、MyDate類(3)Student子類繼承Person父類的equals(Object)方法時(shí),功能不完全對(duì)比,已知Person類聲明int
older(Personper)Student類繼承了父類Person的equals(Object)方法,調(diào)用:Personper=newPerson("李小明",…);Studentstu1=newStudent(per,"計(jì)算機(jī)"),stu2=newStudent(per,"通信工程");//以下僅比較Person成員變量per.equals(stu1)//父類與子類實(shí)例比較,參數(shù)賦值相容stu1.equals(per)//子類與父類實(shí)例比較,可比的
stu2.equals(stu1)//兩個(gè)子類實(shí)例比較,
//錯(cuò)誤,沒(méi)有比較Student類增加的成員變量說(shuō)明,Student類比較對(duì)象相等的規(guī)則同其父類,不能滿足要求?!禞ava程序設(shè)計(jì)實(shí)用教程(第5版)》第3章63(3)Student子類擴(kuò)展Person父類的equals(Object)方法//Student類覆蓋equals(Object)方法,與父類對(duì)象不可比publicboolean
equals(Object
obj){if(this==obj)
returntrue;if(obj
instanceof
Student)//不包含Person實(shí)例
{Students=(Student)obj;
returnsuper.equals(s)&&
this.department.equals(s.department)&&
this.speciality.equals(s.speciality)&&
this.number.equals(s.number)&&
this.member==s.member;}returnfalse;}stu1.equals(per)//執(zhí)行Student比較規(guī)則,參數(shù)是Person實(shí)例,不是要找的對(duì)象,不用比較成員變量,結(jié)果為false【思考題】Student類,如果//與父類實(shí)例可比
publicboolean
equals(Object
obj){
booleanb=super.equals(obj);//按Person規(guī)則比較//以下比較Student子類的成員變量
if(b&&obj
instanceofStudent)returnthis.speciality.equals(((Student)obj).speciality)&&……;
returnb;}//但是s1.equals(p1)按Person規(guī)則比較;//s2.equals(s1)按Student規(guī)則比較,規(guī)則不一致,//調(diào)用規(guī)則由參數(shù)obj引用實(shí)例的類型決定。語(yǔ)義不行。【例3.6】對(duì)象數(shù)組的輸出、
合并和查找算法。①對(duì)象數(shù)組元素賦值,對(duì)象引用賦值。publicstaticvoidmain(String[]args)②參數(shù)類型Object[],適用于對(duì)象數(shù)組的基礎(chǔ)是運(yùn)行時(shí)多態(tài)//輸出對(duì)象數(shù)組,通用功能publicstaticvoidprint(Object[]
objs){
for(inti=0;i<objs.length;i++)
System.out.println(objs[i].toString());//objs[i]引用任何實(shí)例,toString()運(yùn)行時(shí)多態(tài)}//MyEclipse設(shè)置編譯路徑:例3.2、例3.3、例3.5。②Object[]適用于對(duì)象數(shù)組//返回合并的對(duì)象數(shù)組,通用功能publicstaticObject[]concat(Object[]objs1,Object[]objs2){Object[]result=newObject[objs1.length+objs2.length];for(j=0;j<objs1.length;j++)
result[i++]=objs1[j];//對(duì)象引用賦值for(j=0;j<objs2.length;j++)
result[i++]=objs2[j];returnresult;//返回對(duì)象數(shù)組引用}②Object[]適用于對(duì)象數(shù)組的
基礎(chǔ)是運(yùn)行時(shí)多態(tài)//輸出objs對(duì)象數(shù)組中所有與key相等的元素,//順序查找算法,equals(Object)方法應(yīng)用publicstaticvoidsearchPrintAll(Object[]
objs,Objectkey){
for(inti=0;i<objs.length;i++)
if(objs[i]!=null&&key.equals(objs[i]))//equals()運(yùn)行時(shí)多態(tài),執(zhí)行key比較規(guī)則
System.out.println(objs[i].toString());}③查找算法中,由調(diào)用equals()方法的對(duì)象確定比較相等的規(guī)則,運(yùn)行時(shí)多態(tài)。Personkey=newPerson(per);searchPrintAll(objs,key);//查找,其中//key.equals(per)執(zhí)行Person的比較規(guī)則,//key.equals(stu)可與子類實(shí)例比較,因此查找結(jié)果包含Student實(shí)例查找結(jié)果:李小明,1994年03月15日,,,李小明,1994年03月15日,,,,,計(jì)算機(jī),③查找算法中,由調(diào)用equals()方法的對(duì)象確定比較相等的規(guī)則,運(yùn)行時(shí)多態(tài)。key=newStudent(per,"","計(jì)算機(jī)",…);searchPrintAll(objs,key);//查找,其中//key.equals(stu)執(zhí)行Student的比較規(guī)則,//key.equals(per)與父類實(shí)例不可比,返回false,因此查找結(jié)果不包含Person實(shí)例查找結(jié)果:李小明,1994年03月15日,,,,,計(jì)算機(jī),〖問(wèn)〗key.equals(objs[i])或objs[i].equals(key)?if(key.equals(objs[i]))//執(zhí)行key引用實(shí)例所屬類的比較規(guī)則,一次查找比較規(guī)則相同if(objs[i].equals(key))//執(zhí)行objs[i]引用實(shí)例所屬類的比較規(guī)則,一次查找比較規(guī)則可能不同。objs[0].equals(key)//若objs[0]引用Person實(shí)例,執(zhí)行Person比較規(guī)則objs[1].equals(key)//若objs[0]引用Student實(shí)例,執(zhí)行Student比較規(guī)則【思考題3-5】②增加方法voidprint(Object[][]objs)//輸出二維對(duì)象數(shù)組Objectsearch(Object[]objs,Objectkey)//查找首個(gè)Object[]searchAll(Object[]objs,Objectkey)voidremoveAll(Object[]objs,Objectkey)//刪除boolean
equals(Object[]x,Object[]y)//比較x、y數(shù)組各對(duì)應(yīng)元素值是否相等《Java程序設(shè)計(jì)實(shí)用教程(第5版)習(xí)題解答》.ppt#20.【思考題3-5】對(duì)象數(shù)組查找,【習(xí)題解答習(xí)3.5】doubleaverage(Person[]pers)//平均年齡Personoldest(Person[]pers)//年齡最大的對(duì)象3.5類的抽象性3.5.1用繼承刻畫包含關(guān)系3.5.2抽象類3.5.3最終類3.5.1用繼承刻畫包含關(guān)系圖3-12多種圖形間的包含關(guān)系3.5.2抽象類聲明抽象類與抽象方法//閉合圖形抽象類publicabstractclassClosedFigure{publicabstractdoublearea(); //計(jì)算面積,抽象方法,以分號(hào)";"結(jié)束}3.5.2抽象類抽象類的特點(diǎn)構(gòu)造方法、靜態(tài)成員方法不能被聲明為抽象方法。一個(gè)非抽象類必須實(shí)現(xiàn)從父類繼承來(lái)的所有抽象方法。不能創(chuàng)建抽象類的實(shí)例。例如:ClosedFigure
cfig=newClosedFigure(); //語(yǔ)法錯(cuò)抽象類與抽象方法的作用【例3.7】圖形抽象類及其子類圖3-13用繼承刻畫多種圖形間的包含關(guān)系【例3.7】圖形抽象類及其子類(1)Point坐標(biāo)點(diǎn)類,見(jiàn)例1.2(2)Figure圖形抽象類(3)Line直線類(4)ClosedFigure
閉合圖形抽象類(5)Rectangle矩形、Ellipse橢圓(6)Triangle三角形類(7)Polygon凸多邊形類
(2)Figure圖形抽象類importmypackage.Point;publicabstractclassFigure{publicPointpoint1;protectedFigure(Pointpoint1)publicStringtoString()}問(wèn)題:①Figure類有沒(méi)有包含抽象方法?②既然沒(méi)有抽象方法,為什么要聲明Figure類為抽象類?③既然沒(méi)有實(shí)例,F(xiàn)igure(Point)和toString()的作用是什么?④沒(méi)有聲明Figure()構(gòu)造方法,對(duì)誰(shuí)有何影響?(3)Line直線類importmypackage.Point;publicclassLineextendsFigure//直線類,繼承圖形抽象類{//直線的終點(diǎn);繼承父類的point1表示直線的起點(diǎn)publicPointpoint2;publicLine(Pointpoint1,Pointpoint2)
publicLine(intx1,inty1,intx2,inty2)publicdoublelength()//長(zhǎng)度,見(jiàn)例1.2publicStringtoString()//覆蓋}問(wèn)題:①?zèng)]有聲明Line()構(gòu)造方法,有何影響?圖3-14各種圖形構(gòu)造方法的參數(shù)說(shuō)明(4)ClosedFigure
閉合圖形抽象類//閉合圖形抽象類,繼承圖形抽象類publicabstractclassClosedFigureextendsFigure{protectedStringshape;//形狀,保護(hù)權(quán)限,子類可見(jiàn)//構(gòu)造方法,不能是抽象的
protectedClosedFigure(Stringshape,Pointpoint1)protectedClosedFigure()publicabstractdoubleperimeter();//計(jì)算周長(zhǎng),抽象
publicabstractdoublearea();//計(jì)算面積,抽象方法
publicvoidprint()//調(diào)用抽象方法}(5)Rectangle矩形、Ellipse橢圓//矩形類,繼承閉合圖形抽象類publicclassRectangleextendsClosedFigure//橢圓類,繼承矩形類publicclassEllipseextendsRectangle《Java程序設(shè)計(jì)實(shí)用教程(第5版)》單元測(cè)驗(yàn)和樣卷答案.ppt#5.(5)Rectangle矩形類(6)Triangle三角形類//三角形類,繼承閉合圖形抽象類publicclassTriangleextendsClosedFigure{publicPointpoint2,point3;//三角形的3個(gè)點(diǎn),繼承point1protecteddoublea,b,c;//3條邊長(zhǎng)度
publicTriangle(Pointp1,Pointp2,Pointp3) //3點(diǎn)構(gòu)造publicTriangle(Pointpoint1,doublea,doubleb,doublec)//3邊
publicStringtoString()publicdoubleperimeter()//三角形周長(zhǎng)
publicdoublearea()//三角形面積}(7)Polygon凸多邊形類//凸多邊形類,繼承閉合圖形抽象類publicclassPolygonextendsClosedFigure{privatePoint[]points;//多邊形的各點(diǎn)坐標(biāo)
publicPolygon(Point[]points)publicStringtoString()publicdoubleperimeter()//多邊形周長(zhǎng)publicdoublearea()//凸多邊形面積}圖3-15計(jì)算多邊形面積的剖分算法凸多邊形是指,每個(gè)點(diǎn)都不在由其他點(diǎn)組成的三角形中。凹多邊形,p0點(diǎn)在(p1,p2,p4)三角形中。五角星,圖3-15(d)5點(diǎn)坐標(biāo)與正五邊形相同但次序不同。五角星面積是由各直線相交構(gòu)成的5個(gè)三角形面積和中間的一個(gè)正五邊形面積之和。計(jì)算基礎(chǔ)是,計(jì)算兩條直線相交的交點(diǎn)。(8)抽象類的對(duì)象引用子類實(shí)例Pointp1=newPoint(100,100);ClosedFigure
cfig=newTriangle(p1,newPoint(100,130),newPoint(140,130));//三角形cfig.print();//顯示三角形屬性,其中cfig.perimeter()計(jì)算三角形周長(zhǎng),cfig.area()計(jì)算三角形面積Pointpentagon[]={p1,newPoint(200,100),newPoint(250,150),newPoint(200,200),newPoint(100,200)};cfig=newPolygon(pentagon);//五邊形cfig.print();構(gòu)造三角形和五邊形并計(jì)算面積【思考題3-6】①Figure類增加以下抽象方法,public:abstractvoiddraw(java.awt.Graphicsg);//繪圖abstractvoidrevolve(intangle);//旋轉(zhuǎn),角度abstractvoidzoom(intpercentage);//縮放,百分比②Line類增加以下方法,public:boolean
contains(Pointpoint)//判斷point點(diǎn)在直線上Pointintersects(Lineline)//返回直線相交的點(diǎn)doubledistance(Pointpoint)//從point點(diǎn)到this直線距離【思考題3-6】③ClosedFigure類增加以下方法://判斷point點(diǎn)是否在this閉合圖形區(qū)域內(nèi)publicabstractboolean
contains(Pointpoint);④Square正方形、Circle圓、Pentagram五角星等類,繼承關(guān)系見(jiàn)圖3-13。3.5.3最終類聲明最終類,不能被繼承publicfinalclassMath//數(shù)學(xué)類,最終類publicclassMyMathextendsMath//語(yǔ)法錯(cuò)publicfinalclas
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度個(gè)人房產(chǎn)買賣綠色環(huán)保裝修合同3篇
- 遠(yuǎn)足活動(dòng)課程設(shè)計(jì)
- 安全用電運(yùn)行管理制度模版(2篇)
- 2025年影劇院消防安全管理制度(2篇)
- 2024年青島版六三制新必修5語(yǔ)文下冊(cè)階段測(cè)試試卷
- 二零二五年度承包土地種植與農(nóng)業(yè)電商平臺(tái)合作協(xié)議2篇
- 2025年投資公司年度工作計(jì)劃范文(2篇)
- 二零二五年度交通基礎(chǔ)設(shè)施PPP項(xiàng)目合同2篇
- 2025年外研版三年級(jí)起點(diǎn)九年級(jí)化學(xué)下冊(cè)階段測(cè)試試卷
- 二零二五年度國(guó)際貿(mào)易財(cái)務(wù)擔(dān)保合同示范(國(guó)際貿(mào)易保障)
- 石化行業(yè)八大高風(fēng)險(xiǎn)作業(yè)安全規(guī)范培訓(xùn)課件
- 村老支書(shū)追悼詞
- DB3302T 1131-2022企業(yè)法律顧問(wèn)服務(wù)基本規(guī)范
- 2022年自愿性認(rèn)證活動(dòng)獲證組織現(xiàn)場(chǎng)監(jiān)督檢查表、確認(rèn)書(shū)
- 中南大學(xué)年《高等數(shù)學(xué)上》期末考試試題及答案
- 付款通知確認(rèn)單
- 2022年中國(guó)城市英文名稱
- 小龍蝦高密度養(yǎng)殖試驗(yàn)基地建設(shè)項(xiàng)目可行性研究報(bào)告
- 《橋梁工程計(jì)算書(shū)》word版
- 中考《紅星照耀中國(guó)》各篇章練習(xí)題及答案(1-12)
- 舒爾特方格55格200張?zhí)岣邔W⒘4紙直接打印版
評(píng)論
0/150
提交評(píng)論