版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
模塊3使用類開發(fā)程序目標(biāo)知識目標(biāo):技能目標(biāo):素質(zhì)目標(biāo):了解面向?qū)ο蟮幕舅枷肜斫忸惡蛯ο蟮母拍罾斫忸惖姆庋b、繼承和多態(tài)三大機(jī)制了解接口和抽象類的概念
會定義類和創(chuàng)建類的對象會定義接口、實現(xiàn)接口會選擇合適的訪問控制類型會重載方法和覆蓋方法會使用類的三大機(jī)制解決具體問題培養(yǎng)學(xué)生的抽象思維能力和邏輯推理能力訓(xùn)練學(xué)生專注執(zhí)著、精益求精的工匠精神任務(wù)3.1使用類【任務(wù)導(dǎo)入】任務(wù)3.1使用類
隨著計算機(jī)能力的不斷加強(qiáng)和軟件開發(fā)水平的提高,社會各方面都產(chǎn)生了信息化的迫切需求。人們期望能夠通過信息化提高生活質(zhì)量、提升工作效率。根據(jù)工信部的統(tǒng)計數(shù)據(jù),我國的軟件行業(yè)年年保持正增長。我國的軟件業(yè)如何保持目前良好的勢頭、更好的發(fā)展,充滿著機(jī)遇和挑戰(zhàn)。
面對各行各業(yè)的需求,軟件開發(fā)的抓手是什么?一個完整項目的研發(fā)起點(diǎn)在哪里?軟件開發(fā)是否具有成熟的方法論?開發(fā)一個軟件,首先需要掌握軟件設(shè)計思想,其中面向?qū)ο蟮乃枷胗捎谄涓咏谌祟愃季S方式而得到廣泛使用。本任務(wù)就是引導(dǎo)學(xué)生掌握面向?qū)ο蟮幕靖拍詈图夹g(shù)要點(diǎn)。類是什么?對象是什么?
思
考:任務(wù)3.1使用類對象是什么?3.1.1辨識類和對象1、類:對具有相同特征的事物進(jìn)行歸納和抽象的結(jié)果。2、對象:指代具體的某一個事物。類是對象的模版,類的具象化即是對象。3、面向?qū)ο筌浖_發(fā)的基本思路是:先將應(yīng)用分解為各組成部件(即對象),然后設(shè)計并實現(xiàn)這些對象,最后通過對象之間的彼此交互來完成系統(tǒng)功能。通過這種方式,能有效地簡化復(fù)雜軟件的開發(fā)。4、面向?qū)ο缶幊?大特性:抽象與封裝、繼承和多態(tài)。書籍類書名:三國演義作者:羅貫中價格:50.00元書名:水滸傳作者:施耐痷價格:50.00元3.1.1辨識類和對象3.1.2創(chuàng)建類Java程序中的類,主要由:
類名、屬性(數(shù)據(jù))和方法(對數(shù)據(jù)的操作)三部分組成。格式:訪問控制類型class
類名{
訪問控制類型數(shù)據(jù)類型變量名訪問控制類型返回值方法名(參數(shù)列表)}publicclassStudent{Stringname;//屬性,姓名intage;//屬性,年齡/**獲取姓名的方法*/publicStringgetName(){}}屬性:定義該類對象的數(shù)據(jù)結(jié)構(gòu)(屬性的名稱和類型);3.1.2創(chuàng)建類類的對象在系統(tǒng)中所需要執(zhí)行的各種操作,比如對數(shù)據(jù)的加工處理。方法:練一練定義一個學(xué)生類,其中屬性:姓名,班級,成績;方法:獲取和設(shè)置相應(yīng)屬性的方法。定義一個圓形類,其中屬性:半徑;方法:獲取和設(shè)置相應(yīng)屬性,計算圓的面積和周長。
一個對象又被稱作類的一個實例,也稱為實體化或?qū)嵗?Instantiation)。術(shù)語“實體化(Instantiation)”是指對象在類聲明的基礎(chǔ)上創(chuàng)建的過程。3.1.3創(chuàng)建對象創(chuàng)建對象的格式:
類名
對象名=new
類名();Studentstu=newStudent();3.1.3創(chuàng)建對象創(chuàng)建對象是在內(nèi)存中申請一塊數(shù)據(jù)區(qū)域,用于存儲對象的數(shù)據(jù)。Studentstu=newStudent();對象名:stu內(nèi)存地址:0x12abcdstu.setName("張三")name"張三"stu.setAge(18)age183.1.3創(chuàng)建對象訪問對象的屬性:對象名.屬性執(zhí)行對象的行為對象名.成員方法名()注意:如果有參數(shù)必須要在括號內(nèi)代入?yún)?shù)。publicclassTest{ publicstaticvoidmain(String[]args){ Studentstu=newStudent();//創(chuàng)建對象stu stu.setName("張三");//通過調(diào)用類提供的方法對對象的屬性name賦值 stu.setAge(18);//通過調(diào)用類提供的方法對對象的屬性age賦值 }}3.1.3創(chuàng)建對象試一試創(chuàng)建一個長方形對象并計算其面積。publicclassTest{ publicstaticvoidmain(String[]args){ Rectrect=newRect();//創(chuàng)建對象rect rect.setWidth(2); rect.setHeight(4); intarea=rect.getArea();//調(diào)用類中的方法計算面積 System.out.println("長方形的面積是:"+area); }}練一練創(chuàng)建一個名字叫李四、班級為軟件2班,成績?yōu)?8的成績對象。創(chuàng)建一個半徑為3的圓的對象,并計算其面積和周長。3.1.4重載方法在類中定義多個同名的方法來實現(xiàn)的,這種在同一個類中兩個以上方法使用相同方法名字的過程稱為方法的重載(OverLoad)好處是可以用統(tǒng)一的形式表示類似的功能,從而具有統(tǒng)一的調(diào)用方法,提高了類的易用性,減少了記憶的壓力。3.1.4重載方法具體規(guī)范如下:01方法名一定要相同。02方法的參數(shù)表必須不同,要么參數(shù)個數(shù)不同或參數(shù)類型不同。03方法的返回類型、修飾符可以相同,也可不同。3.1.4重載方法classArea{floatgetArea(floatr){return3.14f*r*r;}doublegetArea(floatx,floaty){returnx*y;}intgetArea(intx,inty){returnx*y;}}下面的Area類中g(shù)etArea方法是重載方法3.1.4重載方法調(diào)用Area類的getArea方法
classTest{publicstaticvoidmain(String[]args){Areaarea=newArea();area.getArea(2.3f); //實際參數(shù)為一個float值,將調(diào)用第一個getArea方法area.getArea(2.3f,3.4f); //實際參數(shù)為兩個float值,將調(diào)用第二個getArea方法area.getArea(2,3); //實際參數(shù)為兩個int值,將調(diào)用第三個getArea方法}}試一試編寫一個加法類。類名為Caculator,類中定義兩個成員方法。兩個方法方法名均命名為add。其中一個方法接收兩個int類型的參數(shù),計算兩數(shù)之和并返回。另一個方法接收三個int參數(shù),計算三數(shù)之和并返回。例3.5
試一試classCaculator{publicintadd(inta,intb){ returna+b;}publicintadd(inta,intb,intc){returna+b+c;}}publicclassTest1{publicstaticvoidmain(String[]args){Caculatoropt=newCaculator(); intsum=opt.add(12,34); System.out.println("兩個數(shù)之和:"+sum); sum=opt.add(12,34,56); System.out.println("三個數(shù)之和:"+sum);}}練一練命名為max,求兩個int類型數(shù)據(jù)中的最大值并返回;命名為max,求三個int類型數(shù)據(jù)中的最大值并返回。編寫一個求最大值的類。編寫一個名為Utils的類,定義兩個方法:方法1:方法2:3.1.5靜態(tài)變量定義一個類時,只是在描述某類事物的特征和行為,并沒有產(chǎn)生具體的數(shù)據(jù)。只有通過new關(guān)鍵字創(chuàng)建該類的實例對象后,系統(tǒng)才會為每個對象分配空間,存儲各自的數(shù)據(jù)。有時候,會希望某些特定的數(shù)據(jù)在內(nèi)存中只有一份,而且能夠被一個類的所有實例對象所共享。例如某個學(xué)校所有學(xué)生共享同一個學(xué)校名稱,此時完全不必在每個學(xué)生對象所占用的內(nèi)存空間中都定義一個變量來表示學(xué)校名稱,而可以在對象以外的空間定義一個表示學(xué)校名稱的變量,讓所有對象來共享。注意:static關(guān)鍵字只能用于修飾成員變量,不能用于修飾局部變量,否則編譯會報錯。3.1.5靜態(tài)變量publicclassA{publicvoidstudy(){staticintnum=10;}在一個Java類中,可以使用static關(guān)鍵字來修飾成員變量,該變量被稱作靜態(tài)變量。靜態(tài)變量被所有實例共享,可以使用“類名.變量名”的形式來訪問。試一試classCountNum{
publicstaticintcount=0;
publicCountNum(){
count++;
}}publicclassTest{
publicstaticvoidmain(String[]args){ CountNumcn1=newCountNum(); System.out.println("次數(shù):"+CountNum.count); CountNumcn2=newCountNum(); System.out.println("次數(shù):"+cn2.count);
System.out.println("次數(shù):"+CountNum.count); }}例3.6計算器3.1.5靜態(tài)方法在實際開發(fā)時,開發(fā)人員有時會希望在不創(chuàng)建對象的情況下就可以調(diào)用某個方法,換句話說也就是使該方法不必和對象綁在一起。注意:在一個靜態(tài)方法中只能訪問用static修飾的成員,原因在于沒有被static修飾的成員需要先創(chuàng)建對象才能訪問,而靜態(tài)方法在被調(diào)用時可以不創(chuàng)建任何對象。要實現(xiàn)這樣的效果,在類中定義的方法前加上static關(guān)鍵字即可,通常稱這種方法為靜態(tài)方法。同靜態(tài)變量一樣,靜態(tài)方法可以使用“類名.方法名”的方式來訪問,也可以通過類的實例對象來訪問。試一試?yán)?.7面積計算機(jī)classTools{
privatestaticdoublePI=3.14;
publicstaticdoublecircleArea(doubler){ returnPI*r*r; }} publicclassTest2{
publicstaticvoidmain(String[]args){ //直接通過類名,來使用靜態(tài)方法 System.out.println("半徑為2.1的圓的面積:"+Tools.circleArea(2.1));
//也可以通過創(chuàng)建對象,來使用靜態(tài)方法
Toolstool=newTools(); System.out.println("半徑為2.1的圓的面積:"+tool.circleArea(2.1));}}任務(wù)3.2使用包任務(wù)3.2使用包Java使用包來組織類,包用于存放一組相關(guān)的類。包中定義的類必須通過包名訪問,這樣,盡管同一個包中的類不能同名,但不同包中可以有同名的類。任務(wù)3.2創(chuàng)建包定義類時可以在其頂部第一行代碼使用package語句指定類所屬的包,包名也必須符合Java語法中標(biāo)識符的命名規(guī)則,習(xí)慣上使用小寫字母。例如:packageaib;任務(wù)3.2創(chuàng)建包
使用eclipse時,可以右鍵單擊src目錄,選擇New->package菜單。任務(wù)3.2創(chuàng)建包
右鍵單擊包名,選擇properties菜單,可以看出,創(chuàng)建包,實際上就是在項目下創(chuàng)建了一個文件夾,properties屬性窗口中的Location指明了包所處的文件路徑。任務(wù)3.2創(chuàng)建包
如同文件管理中的目錄結(jié)構(gòu),目錄可以包含子目錄,具有層級關(guān)系,java的包也可以進(jìn)行嵌套,包的嵌套等價于文件夾的嵌套:package.gdaib;試一試?yán)?.8為Student類創(chuàng)建包.gdaib。package.gdaib;publicclassStudent{ intnum; //學(xué)號 Stringname;//姓名 intage; //年齡 charsex;//性別
publicStringgetStuInfo(){//返回學(xué)生信息 return"姓名:"+name+"\t年齡:"+age;
}}練一練為前面創(chuàng)建的Rect類創(chuàng)建lianxi包。創(chuàng)建test包,并將案例3.7的Tools類放入test包3.2.2導(dǎo)入包由于不同的Java類文件有可能存在于不同的包下(即不同的文件夾中),如果我們需要使用非當(dāng)前包中的Java類,則必須通過完整類名來指定其位置。例:packagetest;publicclassDemo{ publicstaticvoidmain(String[]args){java.util.Datetoday=newjava.util.Date();}}3.2.2導(dǎo)入包為了簡化使用其它包中的Java類,可以在package語句之后,通過import語句導(dǎo)入某一個特定的類,或者導(dǎo)入某一個包中的所有類。這樣就不必通過完整類名來使用其它包中的Java類。publicclassDemo{ publicstaticvoidmain(String[]args){Datetoday=newDate();}}
importjava.util.Date;//導(dǎo)入java.util包下特定的Date類import.aib.*;//導(dǎo)入.aib包中所有的類例如:任務(wù)3.3實現(xiàn)繼承任務(wù)3.3繼承軟件中的各個功能,往往有重疊的部分。如何才能提高軟件開發(fā)的效率?遇到公共的功能、共同的屬性數(shù)據(jù),我們是否需要重復(fù)編程?3.3.1繼承的概念繼承是現(xiàn)實世界普遍存在的現(xiàn)象。動物犬科貓科波斯貓沙皮狗巴厘貓斑點(diǎn)狗例如,子女會繼承父母的特征,同時又有自己的特征。對老產(chǎn)品進(jìn)行改進(jìn)形成新產(chǎn)品,新產(chǎn)品繼承老產(chǎn)品的一些特征,同時又有新的改進(jìn)。繼承被用于程序設(shè)計中,通過繼承可以在原有類的基礎(chǔ)上建立新類,新類不必從零開始設(shè)計。由于新類可以繼承原有類的內(nèi)容,使程序代碼可以重用,提高了程序的設(shè)計效率?!袄^承”用于描述類與類之間既有共性,又有個性的情況。通過繼承,我們既可以重復(fù)利用舊有的代碼,又可以在原有的基礎(chǔ)上對數(shù)據(jù)或功能進(jìn)行擴(kuò)充,從而提高程序的開發(fā)效率。3.3.1繼承的概念例如:學(xué)生可以分為本科生、研究生、博士生等不同的類別。光靠一個Student類來包括各類學(xué)生的屬性和方法,其結(jié)構(gòu)性是很差的。所以要設(shè)計新的類,來管理不同學(xué)生。3.3.1繼承的概念在原有類基礎(chǔ)上建立的新類稱為子類或派生類,原有類稱為父類或基類,也可以稱為超類。子類和父類形成類的層次和繼承關(guān)系。由于子類在父類的基礎(chǔ)上建立,因此子類繼承了父類的特征和功能。子類除了擁有父類的特征和功能外,還可以增加自己的特征和功能。
3.3.1繼承的概念Java類的繼承只支持單繼承,不支持多重繼承,每個子類只能有一個父類。一個父類可以有多個子類。在Java中,所有的類都直接或間接繼承了java.lang.Object,是所有類的父類。如果類的定義中沒有指定父類,這個類的父類就是Object。
3.3.1繼承的概念Java中,類繼承的格式如下:
class子類extends父類{/*類體,
聲明自己的成員變量和成員方法*
/}
3.3.1繼承的概念classStudent{//共性protectedStringname;//姓名protectedintage;//年齡}classPostgraduateextendsStudent{//建立研究生類,Student是它的父類Stringspeciality;//專業(yè)
Stringtutor;//導(dǎo)師}試一試圖形具有很多共同的屬性數(shù)據(jù)和行為特征。例如,矩形、三角形都有邊數(shù),都能計算面積和周長。下面我們通過定義一個形狀類,來描述所有圖形的共同特點(diǎn)。再定義子類矩形類,描述矩形所具有的個性化數(shù)據(jù):寬度和長度。例3.11定義形狀類。練一練創(chuàng)建一個圓形類Circle。圓形類繼承例3.11中的Shape類,為圓形類添加011個屬性:圓的半徑radius。024方法:對圓半徑radius的getter和setter方法,計算圓面積和周長的方法。3.3.2訪問控制訪問控制,就是用來控制類、方法、屬性等的有效范圍。四種訪問控制修飾符:默認(rèn)、private、protected、public。3.3.2訪問控制——默認(rèn)訪問控制
沒有寫任何修飾符,成員變量和方法都是默認(rèn)的訪問控制類型。只要是在同一個包中,其它的類可以直接訪問具有默認(rèn)訪問控制類型的成員變量或者成員方法。例如:packagedemo;publicclassStudent{Stringname;//默認(rèn)成員變量voidprintInfo()//默認(rèn)成員方法 System.out.println(“學(xué)生是:”+name);}}packagedemo;publicclassTest{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.name=“張三”;//合法stu.printInfo(); //合法}}packagedemo2;importdemo.*;publicclassTest{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.name=“張三”;//非法stu.printInfo(); //非法}}3.3.2訪問控制——private
用關(guān)鍵字private修飾的成員變量和方法稱為私有變量和私有方法。只有在當(dāng)前類中才能被訪問和使用。例如:publicclassStudent{privateStringname;//私有成員變量
privatevoidprintInfo(){//私有成員方法 System.out.println(“學(xué)生是:”+name);}}publicclassTest{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.name=“軟件”;//非法stu.printInfo();//非法}}3.3.2訪問控制——protected
用protected修飾符修飾的成員變量和方法稱為受保護(hù)的成員變量和成員方法。同一個包中的另一個類,或者該類的子類都可以訪問受保護(hù)的成員變量和成員方法。publicclassStudent{protected
Stringname;//受保護(hù)的成員變量protected
voidprintInfo(){//受保護(hù)的成員方法 System.out.println(“學(xué)生姓名是:”+name);}}publicclassPostgraduateextendsStudent{publicStringgetInfo(){printInfo();//可以訪問受保護(hù)的成員方法returnname;//可以訪問受保護(hù)的成員變量}}3.3.2訪問控制——public
用public修飾符修飾的成員變量和方法稱為公共的成員變量和成員方法。其它所有類都可以訪問該公共的成員。packagedemo;publicclassStudent{publicStringname;//公開的成員變量publicvoidprintInfo(){//公開的成員方法 System.out.println(“學(xué)生姓名是:”+name);}}packagedemo2;importdemo.*;classTest{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.name=“張三”;//合法stu.printInfo();//合法}}試一試classBook{ privateStringtitle; privatedoubleprice; publicvoidshow(){ System.out.println(title); System.out.println(price); } publicStringgetTitle(){ returntitle; } publicvoidsetTitle(Stringtitle){ this.title=title; } publicdoublegetPrice(){ returnprice; } publicvoidsetPrice(doubleprice){ this.price=price; }}案例3.12訪問控制。試一試publicclassTest{ publicstaticvoidmain(String[]args){ Bookb=newBook(); b.setTitle("Java程序設(shè)計"); b.setPrice(23.3); b.show();
}}練一練把案例3.12中Test類中添加b.title=”程序設(shè)計”,結(jié)果如何?把案例3.12中Book類的show方法修改為protected修飾,結(jié)果如何?3.3.3覆蓋Override方法覆蓋(方法重寫):子類中定義的方法,這方法的名字、返回值類型、參數(shù)個數(shù)和參數(shù)類型與父類的方法完全相同。作用:更改或增強(qiáng)父類方法的功能。試一試?yán)?.13覆蓋成員變量。classFather{ protectedintx=10,y=8; }classSonextendsFather{ intx=5;//覆蓋了父類的x publicvoidoutput(){ System.out.println(“xofSonis”+x);//輸出子類中x的值 System.out.println(“yofSonis”+y);//子類中沒有y變量,輸出繼承自父類的y System.out.println(“xofFactheris”+super.x);//輸出父類的x變量值 System.out.println(“xofSonis”+this.x); //輸出子類的x變量值}}試一試?yán)?.14覆蓋成員方法(方法重寫)。classFather{ publicvoidshow(){ System.out.println("執(zhí)行父類的show方法"); } publicvoidshowSame() { System.out.println("執(zhí)行父類的showSame方法"); }}classSonextendsFather{publicvoidshow(){//覆蓋方法 System.out.println("執(zhí)行子類的show方法");}publicvoidexec(){ show();//調(diào)用子類的show方法 this.show();//調(diào)用子類的show方法 super.show();//調(diào)用父類的show方法showSame();//子類沒有showSame方法,則調(diào)用父類的}}3.3.4多態(tài)性01當(dāng)一個類有很多子類時,并且子類都覆蓋了父類中的某些方法。那么當(dāng)子類創(chuàng)建的對象放到一個父類的引用時,這個引用在調(diào)用這個方法時就可能具有多種形態(tài),因為不同的子類在覆蓋父類的方法時可能產(chǎn)生不同的行為。02多態(tài)性就是指父類的某個方法被其子類覆蓋后,同一個行為具有多個不同表現(xiàn)形式或形態(tài),父子類可以各自產(chǎn)生自己的功能行為。03多態(tài)的存在有3個必要條件:類的繼承、方法重寫、父類引用指向子類對象(向上轉(zhuǎn)型)。將子類對象當(dāng)作父類使用時不需要任何顯式地聲明,需要注意的是,此時不能通過父類變量去調(diào)用子類中的特有方法。3.3.4多態(tài)性Animalan1=newCat
();
//將Cat
對象當(dāng)作Animal類型來使用?Animalan2=newDog();
//將Dog對象當(dāng)作Animal類型來使用?將子類對象當(dāng)作父類類型使用的情況,稱之為“向上轉(zhuǎn)型”。例如:試一試classAnimal{voidcry(){}}classDogextendsAnimal{ voidcry(){ System.out.println(“汪汪汪……”);}voideat(){System.out.println(“吃骨頭”);}}classCatextendsAnimal{ voidcry(){System.out.println(“喵喵喵……”);}}classTest{ publicstaticvoidmain(String[]args){ Animalanimal; animal=newDog(); //父類引用類型指向一個子類對象
animal.eat(); //error,子類新增的方法,不能通過父類的引用訪問
animal.cry(); //輸出“汪汪汪……” animal=newCat(); animal.cry(); //輸出“喵喵喵……”}}多態(tài)的應(yīng)用,模擬教師使用打印機(jī)打印試卷。設(shè)計父類打印機(jī)類Printer,包含打印功能voidprint()。創(chuàng)建三個子類,分別是針式打印機(jī)類、噴墨打印機(jī)類、激光打印機(jī)類,分別重寫父類中的打印方法voidprint(),定義測試類,模擬教師使用不同的打印機(jī)打印試卷。練一練實戰(zhàn)演練:瘋轉(zhuǎn)并輸出博士生信息表學(xué)生有多種類型,比如小學(xué)生、中學(xué)生、大學(xué)生和研究生等,它們都具有一些共同的屬性,比如姓名、年齡、性別等。但同時也有自己的特有屬性,比如大學(xué)生和博士生,具有專業(yè)屬性,博士生還有導(dǎo)師等屬性。請分析學(xué)生類和博士生類的屬性特點(diǎn),定義學(xué)生類和博士生類,并輸出博士生的相關(guān)信息。輸出結(jié)果如圖所示。任務(wù)3.4設(shè)計構(gòu)造方法任務(wù)4構(gòu)造方法01構(gòu)造方法(構(gòu)造函數(shù))是類的特殊方法,用于初始化新建的對象。構(gòu)造方法也稱為構(gòu)造函數(shù)。02默認(rèn)構(gòu)造函數(shù)在類實例化對象時被自動調(diào)用。3.4.1定義構(gòu)造方法定義構(gòu)造方法的格式如下:修飾符可以是:[修飾符]
類名(形式參數(shù)列表){//方法體}public、private、protected、默認(rèn)。構(gòu)造方法的方法名必須與類名一致,并且沒有返回值,也不能有void。3.4.1定義構(gòu)造方法
如果在定義類的時候,沒有編寫任何構(gòu)造方法,那么編譯器會自動為類添加一個默認(rèn)的構(gòu)造方法。默認(rèn)的構(gòu)造方法不帶任何形參,也沒有方法體。publicclassStudent{
/*publicStudent(){默認(rèn)構(gòu)造函數(shù)的功能由編譯器自行加入、創(chuàng)建對象時自動調(diào)用。不會體現(xiàn)在源代碼中。
無方法體
}*/}試一試?yán)?.16創(chuàng)建書籍類的構(gòu)造函數(shù)。publicclassBook{
Stringname;
Stringauthor;
doubleprice;
//設(shè)計構(gòu)造方法,為對象的三個屬性賦初始值
publicBook(StringbkName,StringbkAuthor,doublebkPrice){
=bkName;
this.author=bkAuthor;
this.price=bkPrice;
}}publicclassTest{publicstaticvoidmain(String[]args){Bookbook=newBook("三國演義","羅貫中",450);System.out.println(book.author+"的《"++"》價格是:"+book.price);}}3.4.2重載構(gòu)造函數(shù)當(dāng)使用new運(yùn)算符初始化對象時,系統(tǒng)會自動調(diào)用構(gòu)造方法。如果有多個構(gòu)造方法,系統(tǒng)會根據(jù)給定的參數(shù)來識別調(diào)用哪個構(gòu)造方法。例如:在學(xué)生類中定義構(gòu)造方法。classStudent{Student(){ }Student(Stringname){//構(gòu)造方法的重載}}3.4.2重載構(gòu)造函數(shù)重載構(gòu)造函數(shù)后,構(gòu)造函數(shù)之間能夠相互調(diào)用。在構(gòu)造方法中,使用this調(diào)用構(gòu)造方法,語句必須在第一句,且只能出現(xiàn)一次。例:Student(){
this(“張三”);//調(diào)用帶一個字符串參數(shù)的構(gòu)造函數(shù)}試一試?yán)?.17重載構(gòu)造函數(shù)。為矩形類添加兩個構(gòu)造方法:
一個構(gòu)造方法沒有任何參數(shù)
另一個有帶有兩個參數(shù),通過這兩個參數(shù)長度和寬度兩個屬性賦值。publicclassRect{ doublewidth; doublelength;
Rect(){ width=0; length=0;
}
Rect(doublewidth,doublelength){ this.width=width; this.length=length;
}}3.4.3繼承關(guān)系中的構(gòu)造方法
在創(chuàng)建子類對象時,必須先調(diào)用父類中的構(gòu)造方法。如果子類的構(gòu)造方法中,沒有顯式的調(diào)用父類的構(gòu)造方法,那么程序會自動先調(diào)用父類中的默認(rèn)構(gòu)造方法。3.4.3繼承關(guān)系中的構(gòu)造方法classPerson{Stringname; Person(Stringname){//父類有一個參數(shù)的構(gòu)造方法 this.name=name; System.out.println(“父類有參數(shù)的構(gòu)造方法”);}Person(){//父類有無參數(shù)的構(gòu)造方法 name=“無名氏”; System.out.println(“父類無參數(shù)的構(gòu)造方法”);}}classWorkerextendsPerson{ Stringfactory;//在哪間工廠工作 Worker(Stringfactory){//子類有一個參數(shù)的構(gòu)造方法 this.factory=factory; System.out.println(“子類有參數(shù)的構(gòu)造方法”);}Worker(){//子類有無參數(shù)的構(gòu)造方法 factory=“不詳”; System.out.println(“子類無參數(shù)的構(gòu)造方法”);}}classTest{publicstaticvoidmain(String[]args){ /*父類無參數(shù)的構(gòu)造方法 子類無參數(shù)的構(gòu)造方法*/ Workerw=newWorker();/*父類無參數(shù)的構(gòu)造方法 子類有參數(shù)的構(gòu)造方法*/ w=newWorker(“制衣工廠”); }}3.4.3繼承關(guān)系中的構(gòu)造方法試一試?yán)?.19運(yùn)行程序,分析結(jié)果。classPerson{ Stringname; Person(Stringname){//父類有一個參數(shù)的構(gòu)造方法
this.name=name;
System.out.println(“父類有參數(shù)的構(gòu)造方法”);
}
Person(){//父類有無參數(shù)的構(gòu)造方法
name=“無名氏”;
System.out.println(“父類無參數(shù)的構(gòu)造方法”);
}publicvoidwork(){}}classWorkerextendsPerson{ Stringfactory;//在哪間工廠工作 Worker(Stringfactory){//子類有一個參數(shù)的構(gòu)造方法 this.factory=factory; System.out.println(“子類有參數(shù)的構(gòu)造方法”);
}
Worker(){//子類有無參數(shù)的構(gòu)造方法
factory=“不詳”;
System.out.println(“子類無參數(shù)的構(gòu)造方法”);
}}試一試classTest{
publicstaticvoidmain(String[]args){ /*父類無參數(shù)的構(gòu)造方法->子類無參數(shù)的構(gòu)造方法*/ Workerw=newWorker();
/*父類無參數(shù)的構(gòu)造方法->子類有參數(shù)的構(gòu)造方法*/ w=newWorker(“制衣工廠”);
}}試一試?yán)?.20繼承關(guān)系中的構(gòu)造方法。帶兩個參數(shù)的構(gòu)造方法,兩個參數(shù)分別用于對姓名和年齡進(jìn)行初始化。創(chuàng)建Person類表示人,在Person類中設(shè)計姓名和年齡兩個屬性,并編寫構(gòu)造方法:無參數(shù)構(gòu)造方法,將姓名初始化為null,年齡初始化為0。創(chuàng)建Student類表示學(xué)生,繼承Person類,并完成如下設(shè)計:新增school成員變量,表示學(xué)生就讀于哪間學(xué)校。編寫帶3個參數(shù)的構(gòu)造方法,分別用于對姓名、年齡和學(xué)校進(jìn)行初始化。編寫無參數(shù)的構(gòu)造方法,將姓名初始化化為null,年齡初始化為6,學(xué)校初始化為null。試一試
classPerson{ protectedStringname; protectedintage; publicPerson(){ this(null,0); } publicPerson(Stringn,inta){ setName(n);setAge(a); } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ =name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; }}classStudentextendsPerson{ protectedStringschool; publicStudent(Stringname ,intage,Stringschool){
super(name,age); this.school=school; } publicStudent(){ this(null,6,null); } publicStringgetSchool(){ returnschool; } publicvoidsetSchool(Stringschool){ this.school=school; }}試一試classTest{publicstaticvoidmain(String[]args){ Students=newStudent("張三",20,"農(nóng)工商"); System.out.println("姓名:"++"年齡:"+s.age+"學(xué)校:"+s.school);Students1=newStudent(); System.out.println("姓名:"++"年齡:"+s1.age+"學(xué)校:"+s1.school);}}練一練創(chuàng)建司機(jī)類Driver并繼承類Person:1、新增成員變量,記錄司機(jī)駕駛的車牌號。2、編寫帶3個參數(shù)的構(gòu)造方法,對司機(jī)姓名、年齡和車牌進(jìn)行初始化。3、不帶參數(shù)的構(gòu)造方法,將司機(jī)姓名初始化為null、年齡為18、車牌為null。并設(shè)計測試類,創(chuàng)建司機(jī)類Driver對象,輸出相關(guān)信息。任務(wù)3.5使用抽象類任務(wù)3.5抽象類圖形擁有公共的屬性,比如圖形的名稱(長方形、三角形)、邊數(shù)(長方形有四條邊,三角形有三條邊),對圖形都可以進(jìn)行周長、面積的計算等。因此,可以考慮將圖形統(tǒng)一封裝成一個類Shape。
但是,由于每個具體圖形(長方形或三角形)其周長或面積的計算公式并不相同,難以預(yù)先編寫代碼。此時,可以通過抽象方法,來對共同的行為(方法、功能)做出描述。修飾符
abstract返回值類型方法名(形式參數(shù)列表);抽象方法的聲明格式如下:與普通方法相比,抽象方法有如下特點(diǎn):任務(wù)3.5抽象類抽象方法的返回值類型前有關(guān)鍵字abstract。抽象方法沒有方法體。抽象方法的定義是一條語句,以分號結(jié)束。包含抽象方法的Java類必須聲明為abstract且無法被實例化。試一試?yán)?.21定義抽象的形狀類及其使用方式。abstractclassShape{ protectedStringname;//名稱,如長方形、三角形 protectedintedges;//邊數(shù),長方形有4條邊,三角形有3條邊//抽象方法,計算形狀的周長
publicabstractintcalculatePerimeter();}試一試classRectextendsShape{ privateintwidth;//長方形寬度,私有變量,長方形獨(dú)有的數(shù)據(jù) privateintheight;//長方形高度,私有變量,長方形獨(dú)有的數(shù)據(jù) publicRect(intw,inth){//長方形構(gòu)造函數(shù),初始化邊長 name="長方形"; edges=4; width=w; height=h; }publicintcalculatePerimeter(){//覆蓋父類的抽象方法 returnwidth*2+height*2; }}練一練1定義一個抽象形狀類Shape,包括以下方法:
(1)有不帶參數(shù)的getArea抽象方法,返回double類型。2創(chuàng)建圓形類,繼承上面題目中的Shape類,計算并輸出圓形的面積和周長。(2)有不帶參數(shù)的getPerimeter抽象方法,返回double類型。任務(wù)3.6使用接口3.6.1使用接口有時候,我們僅僅關(guān)注事物所提供的功能,比如長方形、圓形都有計算面積的功能,但是這兩個形狀的計算面積所需要的數(shù)據(jù)不同。長方形計算面積需要提供寬、高兩個數(shù)據(jù),而圓形需要提供半徑一個數(shù)據(jù)即可計算。在面向?qū)ο笤O(shè)計時,我們的程序只關(guān)注各個形狀都應(yīng)具有計算面積的功能,而不必統(tǒng)一它們內(nèi)部的數(shù)據(jù)。這種情況可以考慮使用接口進(jìn)行抽象和封裝。3.6.1定義接口接口中只包含常量數(shù)據(jù)成員和抽象方法。接口的定義格式如下:[public]interface接口名{ //常量數(shù)據(jù)成員聲明
[publicstaticfinal]數(shù)據(jù)類型常量數(shù)據(jù)成員名1=常量值; [publicstaticf
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防安全例會目標(biāo)解析
- 城軌技能考試題目及答案
- 美術(shù)音樂中考試題及答案
- 護(hù)理安全用藥研究進(jìn)展
- 2025-2026二年級信息技術(shù)上學(xué)期測試卷
- 裝飾工程的施工方案
- 新生兒臍帶護(hù)理與預(yù)防感染
- 肝轉(zhuǎn)移個體化治療策略制定流程-1
- 衛(wèi)生院人事資源管理制度
- 衛(wèi)生應(yīng)急隊伍案管理制度
- 村衛(wèi)生室安全管理制度
- 中國化學(xué)工程集團(tuán)有限公司行測筆試題庫2026
- 2026貴州遵義融媒傳媒(集團(tuán))有限公司招聘19人筆試參考題庫及答案解析
- 北森人才測評試題及答案
- 2026年中國航空傳媒有限責(zé)任公司市場化人才招聘備考題庫及完整答案詳解1套
- 煤礦安全操作規(guī)程課件
- 吊頂轉(zhuǎn)換層設(shè)計圖集
- 優(yōu)勝教育機(jī)構(gòu)員工手冊范本規(guī)章制度
- 鉀鈉氯代謝與紊亂
- 安徽省小型水利工程施工質(zhì)量檢驗與評定規(guī)程(2023校驗版)
- 山地造林施工設(shè)計方案經(jīng)典
評論
0/150
提交評論