版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
項目3面向對象編程Java程序設計項目描述
/
Projectdescription面向對象是Java學習的核心,本項目主要通過任務學習面向對象的基礎和面向對象的特質,例如類與對象的概念、構造方法的使用、this關鍵字、包與范圍權限、封裝、抽象類與接口、多態(tài)等知識。010203基于控制臺的線上購物系統(tǒng)使用類的繼承使用抽象類與接口基于控制臺的線上購物系統(tǒng)任務1面向對象封裝性繼承性多態(tài)性面向對象就是把事物映射成對象,使用對象來表示事物之間的關系。類和對象類是對某一類事物的抽象描述,而對象是表示現(xiàn)實中該類事物的具體個體。類是對象的抽象,用于描述一組對象的共同特征與行為。類是對象的模板,而對象是類具體的實例。類對象類與對象類類中可以定義成員變量和成員方法,其中成員變量用于描述對象的特征,也被稱為屬性;成員方法用于描述對象的行為,也被稱為方法。類的修飾符:類的修飾符有訪問權限修飾符、最終修飾符final等,不是必須的。class:class關鍵字是用來聲明類的,必須有。extends父類名稱:繼承父類,不是必須的。implenment接口名稱列表:實現(xiàn)接口,如果有多個接口名稱,使用“,”隔開,不是必須的。類與對象上面的代碼定義了一個Person的類,類中有成員變量name、age,成員方法speak()、sleep()。在成員方法中可以直接訪問成員變量name和age。需要注意的是定義在類體中的變量稱為成員變量,類中的方法都可訪問,還可以通過對象的引用來訪問。
而定義在代碼段中的變量稱為局部變量,局部變量只有在定義的代碼段中才可以使用。類與對象對象上述代碼中,賦值符號左邊“Personp”為聲明一個Person類型的變量p,右邊“newPerson()”才是在堆空間中創(chuàng)建一個對象。整條語句的意思是創(chuàng)建一個Person類型的對象,并將對象的引用地址賦值給Person類型的變量p,這時這個變量p也可以稱為對象引用。變量p和對象之間的關系如右圖。類與對象創(chuàng)建對象后,就可以通過對象的引用來訪問對象的的所有成員:因為p1對象和p2對象是兩個獨立的個體,對p1對象的屬性值修改不會影響到p2對象的屬性值。
從運行結果還可以看出,p2對象的成員變量name的值為null,age的值為0。這是因為在實例化對象時,Java虛擬機會自動對成員變量進行初始化。類與對象byte0short0int0long0Lfloat0.0Fdouble0.0Dchar空字符,’\u0000’booleanfalse引用數(shù)據(jù)類型null實例化對象時,Java虛擬機會自動對成員變量進行初始化,針對不同類型的成員變量會賦予不同的初始值類與對象大部分初學者容易遇到的一個問題是,對象的引用為null的情況,這時使用該引用訪問對象的成員會出現(xiàn)錯誤。這種錯誤在Java中被稱為空指針異常,即NullPointerException。因為在程序中把null賦值給了變量p,變量p沒有指向具體的對象,所以p調用對象中的speak()方法出現(xiàn)了空指針異常。成員變量局部變量成員變量實例變量靜態(tài)變量是在類范圍內定義的變量,它的作用域是整個類。在對象被實例化時被創(chuàng)建,對象銷毀時消亡。對象創(chuàng)建完成后,可以通過對象訪問實例變量,為實例變量賦值或者獲取實例變量的值。使用static關鍵字修飾,也被稱為類變量。靜態(tài)變量使用類名訪問,不建議使用對象訪問靜態(tài)變量。是在代碼塊中定義的變量,它的作用域只有在定義的代碼塊中。成員變量從運行結果可以看出,實例變量是對象獨有的,修改對象的實例變量值不會影響其他對象的實例變量值,而靜態(tài)變量是所有對象共享的,所有對象使用的是同一個靜態(tài)變量的值。區(qū)別成員變量共享性:靜態(tài)變量被所有對象共享,即同一類的所有對象共享此類的靜態(tài)變量;實例變量為每個對象獨有,操作自己的實例變量而不會影響其它對象;初始化時間:類變量在類加載時分配內存的,實例變量在創(chuàng)建對象時分配內存的;消亡時間:類變量在程序退出時釋放內存,對象不存在實例變量就不存在了;調用形式:類變量一般通過類名調用,實例變量通過對象名調用;聲明的形式:類變量static來聲明,實例變量沒有static聲明。區(qū)別方法 按返回值可以分為:有返回值和無返回值。按參數(shù)可以分為:有參數(shù)和無參數(shù)。按功能可以分為:實例方法、靜態(tài)方法、構造方法。方法的修飾符:方法的修飾符有訪問權限修飾符、靜態(tài)修飾符static、最終修飾符final等,不是必須的。參數(shù)類型:用于限定調用方法時傳入?yún)?shù)的數(shù)據(jù)類型。不是必須的。例如不帶參數(shù)的方法。參數(shù)名:是一個變量,用于介紹調用方法時傳入的數(shù)據(jù)。return返回值:用于結束方法時返回方法返回值類型的值,不是必須的。返回值類型:用于限定方法返回值的數(shù)據(jù)類型,必須有(除了構造方法)。方法構造方法對象創(chuàng)建后,如果想對這個對象的屬性賦初始值,則需要通過對象訪問對象的屬性或者通過方法設置屬性值,如果需要在創(chuàng)建對象時就能對對象的屬性賦值,可以通過構造方法來實現(xiàn)。方法名與類名同名。在方法名的前面沒有返回值類型。在方法中不能使用return語句返回值,但是可以使用return語句結束方法。從運行結果可以看出,在創(chuàng)建對象時構造方法會被執(zhí)行了??梢赃@樣理解,創(chuàng)建對象“newTest07constructor()”語句new后面接的就是構造方法,如果類中沒有定義構造方法,Java會默認定義一個缺省的無參構造方法。構造方法有參的構造方法的定義:從運行結果可以看出,有參的構造方法在創(chuàng)建對象的時候被執(zhí)行了。那么這時是否還可以通過無參的構造方法創(chuàng)建對象呢?答案是不可以,當一個類中已經(jīng)定義了構造方法的情況下,缺省的無參構造方法就不存在了,所以不能通過無參的構造方法創(chuàng)建對象。構造方法的重載重載一個類中定義多個構造方法稱為構造方法的重載。例如:從上面的結果可以看出,一個類中可以定義多個構造方法,可以根據(jù)不同的情況,選擇其中的一個構造方法創(chuàng)建對象。方法的重載重載方法的重載指的是一個類中有多個同名的方法,且方法的參數(shù)列表不同。方法的重載在Test07overload類中再加入一些speak方法,請判斷是否是重載的方法。上面的例子中,第一個方法是重載的方法,原因參數(shù)的順序不同。第二個不是方法的重載,原因是方法的重載要求參數(shù)列表不同與方法的返回值無關。this關鍵詞一二三通過this關鍵字調用構造方法通過this關鍵字調訪問成員變量通過this關鍵字調用成員方法在上面的代碼中,setName()方法定義了一個String類型參數(shù),參數(shù)名name與成員變量name同名,故在方法內使用name根據(jù)就近原則總是使用參數(shù)name,所以可以在setName()方法類使用this來區(qū)分成員變量與局部變量(參數(shù)),this引用的變量為成員變量。在下面的代碼中,testFun2()方法中使用this關鍵字調用testFun1()方法,一般調用本類中的方法this關鍵字是可以省略的。在調用方法的寫法上“this.testFun1()”與“testFun1()”是一樣的。在坐面的代碼中,使用有參的構造方法創(chuàng)建對象時,調用有參的構造方法,又因有參構造方法中使用了this()調用了無參的構造方法,所以運行結果中兩個構造方法都被調用了。需要注意的是,在使用this關鍵字調用其他構造方法時,只能在構造方法中的第一行代碼調用,且只運行出現(xiàn)一次。
Java常見代碼塊構造代碼塊(也稱對象塊)靜態(tài)代碼塊構造代碼塊的作用和構造方法類似,可用于對象的初始化。一個類中可以定義多個構造代碼塊,構造代碼塊執(zhí)行的執(zhí)行順序位置按定義的順序,構造代碼塊都在構造方法前執(zhí)行。對象都具有的功能可以放在構造代碼塊中,在對象創(chuàng)建時,就會實現(xiàn)該功能,從而減少代碼的冗余度,提高代碼復用性。當類加載的時候,靜態(tài)代碼塊會被執(zhí)行,由于類只加載一次,因此靜態(tài)代碼塊也只執(zhí)行一次。所以有些代碼必須在項目啟動的時候就執(zhí)行的話,需要使用靜態(tài)代碼塊。Java垃圾回收機制Java提供一種垃圾回收機制,用來管理內存中沒有被引用的對象。開發(fā)人員將不用手動管理內存,Java虛擬機會調用垃圾回收器自動清理垃圾對象,從而使程序獲得更多可用的內存。開發(fā)人員也可以通過System.gc()方法通知Java虛擬機立即進行垃圾回收。當對象被回收釋放內存空間時,它的finalize()方法會被自動調用,所以可以在finalize()方法定義對象釋放時的代碼。從運行結果可以看出,對象被回收時,對象的finalize()方法被調用了。包由于Java編譯器為每個類生成一個字節(jié)碼文件,且文件名與類名相同,因此同名的類有可能發(fā)生沖突。為了解決這一問題,Java提供包來管理類名空間。包語句的語法格式如下。那么這個文件的保存在路徑com/nle/demo2下。package的作用就是聲明該類所在的包路徑。在之前的例子中,創(chuàng)建Java類時都沒有填入具體的包名,Eclipse會把創(chuàng)建的Java文件放在缺省包下[defaultpackge],在今后的例子中,創(chuàng)建的Java文件都會指定具體的包名。import關鍵詞在Java中,為了能夠在一個類中使用其他包中的類,Java使用“import”語句來完成此功能。import語句應位于package語句之后,在類定義之前,可以沒有,也可以有多條,它的語法格式如下。由于Scanner類在包路徑java.util下,所以想在Test12類中使用Scanner需要使用import聲明該類的路徑。訪問權限訪問權限修飾符同一個類中同包不同類不同包的子類中不同包非子類中private√
默認不寫√√
protected√√√
public√√√√在Java中,提供四種訪問權限用來修飾類、成員變量以及成員方法。通過訪問權限可以限制訪問的范圍。封裝
將數(shù)據(jù)連同函數(shù)捆綁在一起,形成新的數(shù)據(jù)類型,這被稱為封裝。在Java語言中,對象就是一組變量和相關方法的封裝,其中變量聲明了對象的狀態(tài),方法表明了對象具有的行為。通過對象的封裝,實現(xiàn)了模塊化與信息隱藏。通過對類的成員施以一定的訪問權限,實現(xiàn)了類中成員的隱藏,避免對象的濫用。一般類的封裝時,類中的屬性私有化,即使用private關鍵字修飾。這時私有屬性只能在它所在的類中被訪問,如果外界想要訪問私有屬性,需要提供一些公有方法,其中包含獲取屬性值的getXxx方法和設置屬性值的setXxx方法。有一個比較特殊的是,如果屬性是布爾類型成員變量,getXxx方法將改為isXxx方法。單例模式單例模式是一種創(chuàng)建型模式,目的是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
優(yōu)點是一個單例模式的類在內存中只有一個實例,減少了內存的開銷,尤其是頻繁的創(chuàng)建和銷毀實例。
缺點是不能繼承,違反了單一職責原則。懶漢式單例模式餓漢式單例模式枚舉Enum枚舉類型是一種特殊數(shù)據(jù)類型,能夠為一個變量定義一組預定義的常量。變量必須等于為其預定義的值之一,一般用來表示一組相同類型的常量,如:性別、日期、月份、顏色等。
對這些屬性用常量的好處是顯而易見的,不僅可以保證單例,且在比較的時候可以用“==”來替換equals。自定義枚舉屬性和方法任務實施任務分析程序要求輸出所有的商品信息,包括每個商品的種類、編號、名稱、單價、描述。顧客購買商品時,根據(jù)提示輸入商品編號選購需要的商品,并根據(jù)提示輸入需要購買的商品數(shù)量。購買完畢輸出顧客的訂單信息,包括訂單號、訂單明細、訂單總額。編寫代碼代碼參考教材任務3-1任務實施運行結果使用類的繼承任務2繼承的概念繼承是面向對象程序設計的一個基本特征,通過繼承可以實現(xiàn)代碼的復用。繼承而得到的類稱為子類,被繼承的類稱為父類(超類),父類包括所有直接或者間接被繼承的類。子類繼承可父類中的變量及方法,也可定義其自身特有的變量及方法。Java語言不支持多重繼承,只支持單一繼承。上面格式中extends關鍵字的后面是繼承的父類,如果缺省extends子句,則該類為java.lang.Object的子類,Object類是所有類的父類。從結果中不難看出,子類Dog繼承了父類定義的name屬性和bark()方法,同時子類還新增了age屬性和lookDoor()方法。方法重寫方法重寫指的是在繼承關系中,子類定義了與父類同名的方法,且該方法的參數(shù)列表與返回值類型都與父類一致,重寫子類中該方法的內容。方法重寫從運行結果中可以看出,Dog類對象調用bark()方法,調用的是子類中重寫的方法,而不是父類中定義的方法。需要注意的是,子類重寫方法時,重寫的方法不能比被重寫的方法有更嚴格的訪問權限,重寫的方法不能比被重寫的方法拋出更多的異常。父類子類super關鍵字當子類重寫父類的方法后,子類對象將無法訪問父類被重寫的方法。為了解決這個問題,Java提供一個super關鍵字用于訪問父類的成員。super的用法和this類似,可以使用super([參數(shù)])調用父類的構造方法(super不寫的情況,子類構造方法默認調用父類無參數(shù)的構造方法),同樣可以使用surper加上符號“.”調用實例方法和實例變量。final關鍵字final關鍵字可用于修飾類、變量和方法,它表示最終的意思。final修飾類、變量和方法有如下幾個特性。final修飾的類不能被繼承。final修飾的方法不能被重寫。final修飾的變量是常量,只能賦值一次。任務實施任務要求設計一個動物(Animal)類繼承自object。Animal類中有一個吼叫(bark)方法,并在bark()方法中實現(xiàn)動物吼叫的具體實現(xiàn)。再設計三個類Dog類、Cat類、Serpent類,讓這三個類都繼承Animal類。重寫Animal中的bark方法,同時在Serpent類的bark()方法中加入修飾符final關鍵字,全部實現(xiàn)各自類的構造方法。要求:在創(chuàng)建的項目project3的src下創(chuàng)建包com.nle.task2,該任務的類都放在此包下。建一測試類(Test),在類中通過Dogdog=newDog()這樣子的方式,查看類的繼承中構造方法的調用順序。如何在調用Dog中的bark方法的同時,也同時執(zhí)行Animal中的bark()方法(強調知識點super關鍵字)。再創(chuàng)建一個眼鏡蛇(Cobra)類去繼承Serpent這個類。然后測試能否重寫bark()方法(強調知識點final關鍵字)。任務實施任務分析設計一個動物(Animal)類繼承自object。Animal類中有一個吼叫(bark)方法,并在bark()方法中實現(xiàn)動物吼叫的具體實現(xiàn)。再設計三個類Dog類、Cat類、Serpent類,讓這三個類都繼承Animal類。重寫Animal中的bark方法,同時在Serpent類的bark()方法中加入修飾符final關鍵字,全部實現(xiàn)各自類的構造方法。從任務要求中可以得知,父類Animal中定義一個成員方法bark(),至少一個構造方法,并在構造方法內打印輸出查看是否調用。在子類Dog的bark方法中使用super關鍵字調用父類Animal的被重寫的方法bark()。Serpent類的bark方法設置為final,測試子類Cobra是否可以重寫Serpent的bark()方法。任務實施編寫代碼詳細代碼請參考配書代碼運行結果使用抽象類與接口任務3抽象類在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
在Java中,抽象方法定義時不寫方法體,并且抽象方法使用abstract關鍵字來修飾,具體示例如下。當一個類中包含了抽象方法,該類必須定義成抽象類。抽象類也使用abstract關鍵字修飾。具體示例如下。抽象類需要注意的是,包含抽象方法的類必須定義成抽象類,但是抽象類中可以不包含抽象方法。另外,抽象類不能實例化,如果想調用抽象類中定義的方法,可以創(chuàng)建一個子類繼承該抽象類,在子類中將抽象類的所有抽象方法實現(xiàn),即該子類包含足夠的信息來描繪一個具體的對象。那么就可以通過子類的對象調用抽象類定義的方法。接口Java中使用interface關鍵字來聲明接口,其語法格式如下:接口是常量和抽象方法的集合,包含類必須要實現(xiàn)的方法。類描述對象的屬性和方法。在上面的語法中,一個接口可以有多個父接口,它們之前使用逗號隔開。接口中的變量默認使用“publicstaticfinal”來修飾,即全局常量。接口中定義的方法默認使用“publicabstract”來修飾,即抽象方法。接口不能實例化,但是可以被類實現(xiàn)。一個類實現(xiàn)接口,必須實現(xiàn)接口內所描述的所有方法,否則這個就必須聲明為抽象類。接口從上面的程序可以看出,類Bird與類Airplane分別實現(xiàn)了接口IFly,并實現(xiàn)了接口中的抽象方法。
接口主要描述的是功能,如果一個類想要擴展功能,可以考慮實現(xiàn)接口的形式。當然一個類在繼承另外一個類的同時也可以實現(xiàn)接口。繼承關鍵字extends放在接口關鍵字implements之前。內部類內部類即在一個類的內部再定義類。內部類可以分為成員內部類、靜態(tài)內部類、方法內部類。在類體中定義的內部類,且該內部類沒有static修飾,則該內部類為成員內部類。成員內部類可以訪問外部類的所有成員,具體代碼如下。內部類上面的程序中,在外部類Outer內定義了一個成員內部類Inner,并且Inner內部類可以訪問外部類的成員變量。在外部類的成員方法中也可以通過內部類創(chuàng)建對象,如果想要在其他的類中創(chuàng)建內部類對象,具體的語法格式如下。如果不想其他類訪問成員內部類,可以對該成員內部類施加private權限。這樣該成員內部類只能被它的外部類訪問。Lambda表達式Lambda表達式,也可稱為閉包。Lambda允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進方法中)。使用Lambda表達式可以使代碼變
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年環(huán)保項目實施合同
- 2024年版建筑施工人員工資合同
- 2024年版電子商務平臺運營許可合同
- 2024年版城市智能交通系統(tǒng)建設委托合同
- 2024年節(jié)能環(huán)保型汽車制造與銷售合同
- 2024年非金融機構貸款合同版
- 2024年版遠程醫(yī)療服務平臺建設合同
- 機械制造業(yè)生產(chǎn)合作協(xié)議書
- 個人購車合同模板
- 彩票承包合同
- 企業(yè)內部審計流程規(guī)范與操作指南
- 小學生食品安全教育教案(共十五課時)
- 農(nóng)場場長、副場長崗位責任制
- 起訴申請書范文
- 小數(shù)除以小數(shù)豎式計算題100道及答案
- 河南省鄭州市管城回族區(qū)2023-2024學年六年級上學期期末數(shù)學試題+
- 2024年全國職業(yè)院校技能大賽中職組(母嬰照護賽項)考試題庫(含答案)
- 博山污水處理廠提標改造工程技術標
- 低空經(jīng)濟公司的投融資方案
- JGJ 305-2013 建筑施工升降設備設施檢驗標準
- 橋區(qū)巖土工程勘察報告
評論
0/150
提交評論