《Java程序設計案例教程(微課版)(第2版)》 課件 胡運玲 項目5-9 助農超市購物程序 面向對象基礎-詞頻統計 集合框架類_第1頁
《Java程序設計案例教程(微課版)(第2版)》 課件 胡運玲 項目5-9 助農超市購物程序 面向對象基礎-詞頻統計 集合框架類_第2頁
《Java程序設計案例教程(微課版)(第2版)》 課件 胡運玲 項目5-9 助農超市購物程序 面向對象基礎-詞頻統計 集合框架類_第3頁
《Java程序設計案例教程(微課版)(第2版)》 課件 胡運玲 項目5-9 助農超市購物程序 面向對象基礎-詞頻統計 集合框架類_第4頁
《Java程序設計案例教程(微課版)(第2版)》 課件 胡運玲 項目5-9 助農超市購物程序 面向對象基礎-詞頻統計 集合框架類_第5頁
已閱讀5頁,還剩287頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

項目5面向對象基礎——助農超市購物程序《Java程序設計案例教程(微課版)(第2版)》項目導入

利用Java編寫程序模擬消費者在超市購買農產品的需求,以幫助農民更有效地銷售其產品。從而增強學生對農村經濟發展的關注和責任感,激勵他們在今后的學習和工作中,積極為社會發展貢獻自己的力量。學習目標?熟悉面向對象編程的3個特征。?掌握類的定義,以及對象的創建與使用。?掌握構造方法,以及this和static關鍵字的使用。?掌握繼承的概念、方法的重寫、super關鍵字。

?培養社會責任感和服務意識,積極為社會發展做出貢獻。(素養目標)目錄CONTENTS任務5.1面向對象的特征任務5.2類與對象任務5.3

繼承項目實施

助農超市購物程序項目實訓

網上點餐系統任務5.1面向對象的特征面向對象的特征主要可以概括為封裝性、繼承性和多態性。1.封裝性將對象的屬性和行為封裝起來,盡可能地隱藏內部的細節,只保留一些對外的接口,使之與外部發生聯系,這就是封裝的思想。2.繼承性繼承性主要描述的是類與類之間的關系。繼承也是一種代碼復用的手段,通過繼承,可以在無須重新編寫原有類的情況下對原有類的功能進行擴展。3.多態性多態性指的是在程序中允許出現重名的現象。在父類中定義的屬性和方法被子類繼承之后,可以具有不同的數據類型或表現出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義。目錄CONTENTS任務5.1面向對象的特征任務5.2類與對象任務5.3

繼承項目實施

助農超市購物程序項目實訓

網上點餐系統目錄CONTENTS任務5.2類與對象5.2.1類的定義5.2.2對象的創建與使用5.2.3構造方法5.2.4this關鍵字5.2.5static關鍵字5.2.6訪問權限修飾符新課導入類與對象是面向對象編程中較重要、核心的兩個基本概念。其中,類是對某一類事物的抽象描述,而對象用于表示現實中該類事物的個體。5.2.1類的定義在類中可以定義成員變量和成員方法,其中成員變量用于描述對象的特征,也叫作屬性;成員方法用于描述對象的行為,可簡稱為方法。在Java中定義一個類,語法格式如下:[修飾符]class類名{成員變量的定義;成員方法的定義;}

說明:修飾符包括public、final、abstract等,關于這些修飾符的含義后文有詳細介紹,目前在定義類的時候可不加。5.2.1類的定義【例5-1】定義學生類。classStudent{ Stringname; intage; voidstudy(){ System.out.println(name+"同學正在學習中。。。。");}}5.2.2對象的創建與使用Java中,創建類的實例對象的語法格式如下:類名對象名稱=new類名();例如,創建一個Student類的實例對象,代碼如下:Studentstu=newStudent();創建Student類的對象后,便可以通過對象的引用來訪問對象的成員了,語法格式如下:對象引用.成員publicclassExample5_2{publicstaticvoidmain(String[]args){Studentstu1=newStudent(); ="張三"; stu1.age=20; stu1.study(); Studentstu2=newStudent(); ="李四"; stu2.age=25; stu2.study(); }}5.2.2對象的創建與使用【例5-2】創建對象并訪問對象的成員。任務實踐5-1購買火車票【任務描述】在寒暑假期間,學生購買火車票可以享受半價優惠。而如果是普通旅客(兒童、軍人等特殊群體除外),則需要全價購買。設計一個購買火車票程序,旅客購票時在控制臺輸出旅客的姓名、類別、是否全價購票等信息。【任務分析】1.通過任務描述可知需要定義一個旅客類Passenger。2.旅客類具有屬性:名字(name)、類別(kind)。3.旅客類具有購票功能:定義一個購票(buyTickets())的方法。4.測試類中創建幾個旅客對象并進行購票。任務實踐5-2智能電視機的使用【任務描述】智能電視機是一種具備互聯網功能的電視機,成為現代家庭娛樂的重要組成部分。編寫一個程序,模擬智能電視機的使用。包括顯示電視機的配置信息、收看電視節目、播放視頻、投屏、玩游戲等。【任務分析】1.通過任務描述可知需要定義一個智能電視機類SmartTV。2.智能電視機具有的屬性:品牌(brand)、型號(model)、屏幕尺寸(size)。因此,需要在類中定義對應的成員變量。3.智能電視機具有的功能:顯示配置信息(displayInfo())、收看節目(watchTV())、播放視頻(showVideo())、投屏(screenProjection()))、玩游戲(playGame())),因此可把這些功能定義為對應的成員方法。4.測試類創建兩個智能電視對象并測試其各項功能。任務實踐5-3游戲賬號的充值與消費【任務描述】編寫一個游戲賬號充值和消費程序,實現充值和消費功能。【任務分析】1.通過任務描述可知,需要定義一個游戲帳戶類GameAccount實現游戲帳戶的概念。2.賬戶的屬性包括賬號和存款余額,所以需要在類中定義兩個成員變量:“帳號”(accountNum)和“游戲幣余額”(leftMoney)。3.對賬戶的操作包括充值、消費、查詢余額,所以在類中再定義三個成員方法:“充值”(saveMoney())、“消費”(getMoney())、“查詢余額”(getleftMoney())。需要注意:消費的方法中需要先判斷要消費的游戲幣數額是否小于等于余額,如果是則能消費,如果不是則給出提示:“當前賬戶余額不夠”。4.編寫測試類,在main()方法中創建一個GameAccount類的對象ga,假設ga的賬號為:123456,初始的存款余額為1000游戲幣。首先向該賬戶充值800游戲幣,再消費出600游戲幣,繼續再消費2000游戲幣。5.2.3構造方法構造方法是類的一種特殊方法,可用來初始化類的一個實例對象。它在創建對象(使用new關鍵字)之后自動調用。構造方法有以下特點。(1)方法名與類名相同。(2)沒有任何返回值,連void關鍵字都不需要。(3)只能與new關鍵字結合使用。5.2.3構造方法【例5-4】在Student類中定義構造方法。classStudent{ Stringname; intage; Student(Stringn,inta){//定義構造方法 name=n; age=a; } voidstudy(){ System.out.println(name+"同學

年齡"+age+"正在學習中。。。。"); }}publicclassExample5_4{ publicstaticvoidmain(String[]args){ Studentstu1=newStudent("張三",18); stu1.study(); Studentstu2=newStudent("李四",20); stu2.study(); }}5.2.3構造方法說明:如果開發者沒有為一個類定義任何構造方法,那么Java會自動為每個類創建一個默認的構造方法。這個默認的構造方法沒有任何參數,在其方法體中也沒有任何代碼,即什么也不做。一旦為該類定義了構造方法,系統就不再提供默認的構造方法了。為了避免出現錯誤,在一個類中如果定義了有參的構造方法,最好再定義一個無參的構造方法。一般情況下,構造方法是用來在創建對象時為對象的屬性賦初始值的。一個類中可以定義多個構造方法,這叫作構造方法的重載,在后文中會有詳細的介紹。5.2.4this關鍵字Java提供了一個關鍵字this,它指代當前對象,可用于表示訪問這個對象的成員。對例5-4定義的構造方法進行修改,代碼如下:classStudent{ Stringname; intage; Student(Stringname,intage){ =name; this.age=age; }…//Student類的其他方法}5.2.4this關鍵字this這個關鍵字還有第二種用法。一個類中可以在一個構造方法中使用“this([參數1,參數2,…])”的形式來調用其他的構造方法。【例5-5】構造方法的調用。classStudent{ Stringname; intage; Student(Stringname){ =name; } Student(Stringname,intage){ this(name); this.age=age; } voidstudy(){ System.out.println(name+"同學

年齡"+age+"正在學習中。。。。"); }}publicclassExample5_5{ publicstaticvoidmain(String[]args){ Studentstu1=newStudent("張三"); stu1.study(); Studentstu2=newStudent("李四",20); stu2.study(); }}5.2.4this關鍵字在一個構造方法中使用this調用另一個構造方法時,需要注意以下幾點。(1)不能在成員方法中使用this來調用構造方法。(2)在構造方法中,使用this調用另外一個構造方法的語句必須位于第一行,且只能出現一次。(3)不能在兩個構造方法中使用this互相調用。5.2.5static關鍵字static是Java中的一個關鍵字或者修飾符,它表示靜態,可用于修飾類中的成員變量、成員方法以及代碼塊。1.靜態變量在Java中,可以通過static關鍵字來修飾類的成員變量,該變量稱為靜態變量。靜態變量被該類所有的實例對象共享。在訪問時,可以通過“對象名.靜態變量名”的形式來訪問,還可以通過“類名.靜態變量名”的形式來訪問。5.2.5static關鍵字【例5-6】靜態變量的使用。classPerson{ staticStringcountry; }publicclassExample5_5{publicstaticvoidmain(String[]args){ Personp1=newPerson();p1.country="中國"; Personp2=newPerson();System.out.println(p2.country);Person.country="中華人民共和國"; System.out.println(p1.country);System.out.println(p2.country);}}5.2.5static關鍵字2.靜態方法在實際開發中,有時希望在不創建對象的情況下就可以調用某個方法,換句話說,該方法不必和對象綁在一起。要達到這樣的效果,只需要在類中定義的方法前加上static關鍵字即可,通常稱這種方法為靜態方法。同靜態變量一樣,靜態方法可以使用“類名.靜態方法名”的方式來訪問,也可以通過“對象名.靜態方法名”來訪問。5.2.5static關鍵字【例5-7】靜態方法的使用。classStudent{ staticvoidsayHello(){ System.out.println("你好!我是一名學生!");}}publicclassExample5_7{publicstaticvoidmain(String[]args){ Student.sayHello();Studentstu=newStudent();stu.sayHello();}}注意:靜態方法中只能訪問static修飾的成員。5.2.5static關鍵字3.靜態代碼塊代碼塊就是用花括號將多行代碼封裝在一起,形成的獨立代碼區。用static關鍵字修飾的代碼塊叫作靜態代碼塊。當類被加載時,靜態代碼塊會執行。由于類只被加載一次,因此靜態代碼塊只執行一次。5.2.5static關鍵字【例5-8】靜態代碼塊的使用。classStudent{ Stringname; Student(Stringname){ =name; System.out.println("構造方法被調用了"); } voidstudy(){ System.out.println(name+"同學正在學習中。。。。"); } static{ System.out.println("初始化操作"); }}publicclassExample5_8{publicstaticvoidmain(String[]args){ Studentstu1=newStudent("張三"); stu1.study(); Studentstu2=newStudent("李四"); stu2.study(); }} 【任務描述】編寫程序模擬兩個村莊共用同一口井水。任意一個村莊都可以取用井里的水,也都可以查看井里的水量。【任務分析】1.通過任務描述可知,需要定義一個村莊類Village。2.Village類有一個成員變量num表示村莊的人數,一個成員變量waterAmount用于模擬井水的水量,該成員變量是靜態的;還有一個方法setWaterAmount()用于設置井水的初始水量、一個方法lookWaterAmount()用于查看井水水量,這兩個方法都是靜態的,還有一個非靜態方法drinkWater()用于表示該村莊的人取用水(喝水)。3.測試類中創建兩個村莊,一個村莊改變了waterAmount的值,另一個村莊查看waterAmount的值。任務實踐5-4共飲同井水5.2.6訪問權限修飾符Java采用訪問權限修飾符來控制類及類中成員的訪問權限,分為以下4種級別:(1)private(類訪問級別):如果類的成員被private訪問權限修飾符修飾,那么這個成員只能被該類的其他成員訪問,其他類無法直接訪問。(2)default(包訪問級別):如果一個類或者類的成員不使用任何訪問權限修飾符修飾,那么稱這個類的訪問權限級別為默認訪問權限級別(包訪問級別),表示這個類或者類的成員只能被本包中的類訪問。(3)protected(子類訪問級別):如果一個類的成員被protected訪問權限修飾符修飾,那么這個成員既能被同一包下的類訪問,也能被不同包中該類的子類訪問。(4)public(公共訪問級別):如果一個類或者類的成員被public訪問權限修飾符修飾,那么這個類或者類的成員能被所有的類訪問,無論訪問類與被訪問類是否在同一個包中。5.2.6訪問權限修飾符訪問范圍訪問權限修飾符privatedefaultprotectedpublic同一類√√√√同一包中的類

√√√不同包中的子類

√√其他包中的類

√目錄CONTENTS任務5.1面向對象的特征任務5.2類與對象任務5.3繼承項目實施

助農超市購物程序項目實訓

網上點餐系統目錄CONTENTS任務5.3繼承5.3.1繼承的概念5.3.2方法的重寫5.3.3super關鍵字繼承在已經存在的類的基礎上進行擴展,從而產生新的類。已經存在的類稱為父類、基類或超類,而新產生的類稱為子類或派生類。在子類中,不僅包含父類的屬性和方法,還可以增加新的屬性和方法。Java中子類繼承父類的語法格式如下:修飾符classSubClassextendsSuperClass{//類的主體}5.3.1繼承的概念5.3.1繼承的概念【例5-9】繼承的使用。classPet{Stringname;

voideat(){

System.out.println(name+"寵物吃東西");}}classDogextendsPet{

publicvoidprintName(){

System.out.println("name="+name);}}publicclassExample5_8{

publicstaticvoidmain(String[]args){Dogdog=newDog();

="小黑";

dog.printName();

dog.eat();

}}5.3.1繼承的概念在類的繼承中,需要注意一些問題,具體如下。(1)在Java中,類只支持單繼承,不允許多重繼承,也就是說,一個類只能有一個直接父類。(2)多個類可以繼承一個父類。(3)在Java中,多層繼承是可以的,即一個類的父類可以再去繼承另外的父類。(4)在Java中,子類和父類是一種相對概念,也就是說,一個類是某個類的父類的同時也可以是另一個類的子類。5.3.2方法的重寫在繼承關系中,子類會自動繼承父類中定義的方法,但有時子類并不想原封不動地繼承父類的方法,而想做一定的修改,這就需要對父類的方法進行重寫。注意:(1)在子類中重寫的方法需要和父類中被重寫的方法具有相同的方法名、參數列表以及返回值類型。(2)子類在重寫父類方法時,不能使用比父類中被重寫的方法更嚴格的訪問權限。5.3.2方法的重寫【例5-10】方法的重寫。classPet{ voideat(){ System.out.println("寵物吃東西");}}classDogextendsPet{ voideat(){ System.out.println("狗吃骨頭");}}publicclassExample5_9{ publicstaticvoidmain(String[]args){Dogdog=newDog(); dog.eat(); }}5.3.3super關鍵字當子類重寫父類的方法后,子類對象將無法訪問父類被重寫的方法。為了解決這一問題,在Java中專門提供了一個super關鍵字。它可用于在子類中訪問父類的成員(成員變量、成員方法和構造方法)。super關鍵字的用法如下:(1)super關鍵字可以用來引用父類的實例變量、調用父類方法(2)super()可以用來調用父類的構造方法。5.3.3super關鍵字【例5-10】super關鍵字的使用。classPet{

Stringname="寵物";

voideat(){

System.out.println("寵物吃東西");}}classDogextendsPet{

Stringname="犬類"; voideat(){

System.out.println("狗吃骨頭");super.eat();

} voidprintName(){

System.out.println("name="+name); System.out.println("="+); }}publicclassExample5_10{

publicstaticvoidmain(String[]args){Dogdog=newDog();

dog.eat();

dog.printName();

}}5.3.3super關鍵字【例5-11】super關鍵字的使用。classPet{

publicPet(Stringname){

System.out.println("我是一只"+name);}}classDogextendsPet{

publicDog(){super("沙皮狗");

}}publicclassExample5_11{

publicstaticvoidmain(String[]args){Dogdog=newDog();

}}注意:通過super()調用父類構造方法的代碼,必須位于子類構造方法體的第一行,且只能出現一次。5.3.3super關鍵字在例5-11中,如果將“super("沙皮狗");”這一行代碼注釋掉,程序編譯后將報錯,會提示“父類構造方法Pet()沒有被定義,必須顯式地調用另一個構造方法”。這里出錯的原因是,在子類的構造方法中一定會調用父類的某個構造方法,可以在子類的構造方法中通過super()指定調用父類的哪個構造方法,如果沒有指定,在子類的構造方法中會自動調用父類無參的構造方法。而在上面的代碼中,因為定義了有參的構造方法“Pet(Stringname)”,而沒有定義無參的構造方法Pet(),所以報錯。為了解決上述程序的編譯錯誤,可以在子類中調用父類已有的構造方法,當然也可以選擇在父類中定義無參的構造方法。5.3.3super關鍵字【例5-12】在Pet類中定義無參構造方法classPet{

publicPet(){

System.out.println("我是一只寵物");} publicPet(Stringname){

System.out.println("我是一只"+name);}}classDogextendsPet{

publicDog(){super("沙皮狗");

}}publicclassExample5_12{

publicstaticvoidmain(String[]args){Dogdog=newDog();

}}【任務描述】在物流運輸領域,卡車和火車是兩種常見的運輸方式,它們的計費方式也不同。下面列出了卡車和火車不同的計費方式:卡車:運費=重量x距離x120,當距離大于1000(km)或者重量大于60(t)的時候拒載。火車:當距離在900(km)內(包含900)時,運費=重量x距離X250,大于900(km)時,運費=重量x距離x300。【任務分析】1.通過任務描述可知,需要定義一個卡車類和火車類,卡車類中有屬性:重量、距離,方法:計費,同樣火車類中也有屬性:重量、距離,方法:計費。考慮到這兩個類之間的聯系以及代碼的重用性,可定義一個車類作為這兩個類的父類。車類中具有的屬性為重量和距離,具有方法為計費。2.定義子類卡車類、火車類,在這兩個類中分別重寫計費的方法。3.編寫測試類,創建卡車和火車類對象,調用計算運費方法。任務實踐5-5卡車與火車的運費目錄CONTENTS任務5.1面向對象的特征任務5.2類與對象任務5.3繼承項目實施助農超市購物程序項目實訓

網上點餐系統項目實施項目分析本項目使用所學知識編寫一個助農超市購物程序。購物時,如果購物者所要購買的農產品在超市中有,則提示購物者買到了某產品;如果超市中沒有購物者所需要的農產品,則提示購物者白跑了一塌,在超市中什么都沒有買到。1.通過任務的描述可知,此程序中包含了超市、農產品和購物者3個對象。既然是去購買農產品,那么可以先定義農產品對象,農產品對象需要有自己的名稱屬性。2.由于所有的農產品是在超市中賣的,所以還需要定義一個超市對象。每個超市都會有自己的名稱和用于存放農產品的倉庫。由于倉庫中會有很多農產品,所以這里的倉庫可以用數組表示,超市的主要功能是賣農產品,還要有個賣貨的方法。3.由于購物者是人,所以還需要定義一個Person對象,該對象需要有名稱屬性,還要有一個購物的方法。4.最后編寫測試類,在其main方法中,需要創建最后編寫測試類,在其main方法中,需要創建商品對象、超市對象以及人,并使用這些對象中定義的方法實現購物程序對象、超市對象以及人,并使用這些對象中定義的方法實現購物程序。項目實施項目實施關鍵代碼如下://定義超市類publicclassSupermarket{

。。。。。。 //2.定義貨架數組 publicvoidsetProductArr(Product[]productArr){ ductArr=productArr; } //3.賣貨方法 Productsell(Stringname){//傳入要購買的農產品名稱 for(inti=0;i<productArr.length;i++){//遍歷農產品數組 if(productArr[i].getProductName()==name){ returnproductArr[i]; } } returnnull; }}項目實施項目實施關鍵代碼如下://定義購物者類publicclassPerson{

。。。。。。 //2.購買方法 Productshopping(Supermarketmarket,Stringname){ returnmarket.sell(name); }}項目實施項目實施關鍵代碼如下://測試類中部分代碼 Productp1=newProduct("土豆"); Productp2=newProduct("玉米"); Productp3=newProduct("地瓜"); Productp4=newProduct("花生"); Productp5=newProduct("大白菜"); Productp6=newProduct("油菜"); Productp7=newProduct("菠菜"); Productp8=newProduct("胡蘿卜"); Supermarkets1=newSupermarket("家樂福"); Supermarkets2=newSupermarket("大潤發"); Supermarkets3=newSupermarket("沃爾瑪"); s1.setProductArr(newProduct[]{p1,p2,p3,p4,p5,p6}); s2.setProductArr(newProduct[]{p2,p3,p4,p5,p6,p7}); s3.setProductArr(newProduct[]{p3,p4,p5,p6,p7,p8}); Personper=newPerson("小張"); Productresult=per.shopping(s2,"花生"); //Productresult=per.shopping(s3,"土豆"); if(result==null){ System.out.println("Emmmmmm,"+per.getPersonName()+"逛了一圈"+s2.getSupermaketName()+"超市,什么也沒買到"); }else{ System.out.println( per.getPersonName()+"逛了一圈"+s2.getSupermaketName()+"超市后,買到了"+result.getProductName()); }目錄CONTENTS任務5.1面向對象的特征任務5.2類與對象任務5.3繼承項目實施助農超市購物程序項目實訓網上點餐系統項目實訓網上點餐系統【項目描述】近年來,隨著互聯網的不斷發展和人們生活方式的變化,外賣點餐等線上消費的規模越來越大,成為餐飲消費的重要形式。用戶可以隨時隨地進行點餐,無需受限于餐廳的營業時間和地點,大大節省了時間和精力。外賣點餐,一方面用戶可以更輕松地享受美食。另一方面也促進了餐飲行業的發展。項目實訓網上點餐系統【項目分析】1.通過任務描述可知,該系統中必須包括3個實體類,類名及屬性設置如下:菜品類(Dish):菜品編號(id)、菜品名稱(name)、菜品價格(price);訂單項類(OrderItem):菜品(dish)、訂購份數(num);訂單類(Order):訂單號(orderID)、訂單項列表(items)、訂單總額(total);一個訂單里面可以包含多個訂單項。例如點餐時,可以選購多種菜品,每種菜品及其數量放在一個訂單項里。2.訂單項類里定義設置、獲取菜品對象以及菜品份數的方法。3.訂單類中定義計算訂單總額的方法,以及設置、獲取訂單列表、訂單號、訂單總額的方法。4.測試類中首先顯示菜品信息,然后顧客點餐,最后輸出訂單信息。小結THANKS!《Java程序設計案例教程(微課版)》項目6面向對象高級——垃圾分類程序《Java程序設計案例教程(微課版)(第2版)》項目導入

為增強大眾環保意識、推動資源高效回收利用,我們借助Java語言開發垃圾分類程序。通過這個程序不能能幫助學生樹立責任感與社會擔當意識,更能凝聚各方力量,為建設美麗中國添磚加瓦。學習目標?掌握抽象類的定義與使用。?掌握接口的定義與實現。?掌握多態的使用。

?樹立環保意識與社會責任感,共同建設美麗中國。(素養目標)目錄CONTENTS任務6.1抽象類任務6.2接口任務6.3

多態項目實施

垃圾分類程序項目實訓

寵物之家6.1抽象類當一個類中包含抽象方法,該類必須定義為抽象類。抽象類用abstract關鍵字來修飾,示例如下:abstractclassPet{ abstractvoideat();}當定義一個類時,常常需要定義一些方法來描述該類的行為特征,但有時這些方法的實現方式是無法確定的。針對這樣的情況,Java允許在定義方法時不寫方法體。不包含方法體的方法為抽象方法,抽象方法必須使用abstract關鍵字來修飾,示例如下:abstractvoideat();

6.1抽象類注意:包含抽象方法的類必須聲明為抽象類,但抽象類可以不包含任何抽象方法。另外,抽象類是不可以被實例化的。因為抽象類中有可能包含抽象方法,而抽象方法是沒有方法體的,不可以被調用。如果想調用抽象類中定義的方法,則需要創建一個抽象類的子類,在子類中對抽象類的抽象方法進行實現。 【例6-1】實現抽象類中的抽象方法。abstractclassPet{ abstractvoideat(); }classDogextendsPet{ voideat(){ System.out.println("狗吃骨頭");}}publicclassExample6_1{

publicstaticvoidmain(String[]args){Dogdog=newDog();

dog.eat();

}}6.1抽象類目錄CONTENTS任務6.1抽象類任務6.2接口任務6.3

多態項目實施

垃圾分類程序項目實訓

寵物之家6.2.1接口的概念接口是從多個相似類中抽象出來的規范,它不提供任何方法的具體實現過程。接口體現的是規范和實現分離的設計思想。接口只定義了應當遵循的規范,并不關心這些規范的內部數據和其功能的實現細節,從而分離了規范和實現,增強了系統的可拓展性和可維護性。因此,接口定義的是多個類共同的行為規范,這些行為是與外部交流的通道,這就意味著接口里通常定義的是一組公用方法。6.2.2接口的定義與實現在定義接口時,需要使用interface關鍵字來聲明,語法格式如下:[public]interface接口名[extends接口1,接口2,…]{[public][static][final]數據類型常量名=常量值;[public][static][abstract]返回值抽象方法名(參數列表);}Java把接口當作一種特殊的類,每個接口都被編譯為一個獨立的字節碼文件。需要說明的是,一個接口可以有多個父接口,它們之間用英文逗號隔開。另外,接口中的變量默認使用“publicstaticfinal”來修飾,表示全局靜態常量;接口中定義的方法默認使用“publicstaticabstract”來修飾,表示靜態抽象方法。6.2.2接口的定義與實現由于接口中的方法都是抽象方法,因此不能通過實例化對象的方式來調用接口中的方法。此時需要定義一個類,并使用implements關鍵字實現接口,同時實現接口中所有的抽象方法。一個類可以同時實現多個接口,這些接口在implements子句中要使用英文逗號隔開。聲明接口的實現類的語法格式如下:[<修飾符>]class<類名>[extends<超類名>][implements<接口1>,<接口2>,…]Java提供接口的目的是克服單繼承的限制,因為一個類只能有一個父類,而一個類可以實現多個接口。【例6-2】接口的實現。interfaceFlyable{

voidfly(); }classAirplaneimplementsFlyable{

publicvoidfly(){

System.out.println("飛機在飛行");}}classBirdimplementsFlyable{

publicvoidfly(){

System.out.println("鳥在飛行");}}publicclassExample6_2{publicstaticvoidmain(String[]args){Airplanea=newAirplane(); a.fly();

Birdb=newBird(); b.fly();

}}6.2.2接口的定義與實現【例6-3】接口之間的繼承。interfaceFlyable{

voidfly(); }interfaceAnimalFlyableextendsFlyable{

voideat(); }classBirdimplementsAnimalFlyable{

publicvoidfly(){

System.out.println("鳥在飛行");}publicvoideat(){

System.out.println("鳥吃蟲子");}}publicclassExample6_3{publicstaticvoidmain(String[]args){Birdb=newBird(); b.fly();

b.eat();

}}6.2.2接口的定義與實現6.2.2接口的定義與實現對接口的特點進行歸納,如下。(1)接口中的屬性只能是常量,方法只能是抽象方法,不能實例化對象。(2)接口中的屬性有默認修飾符“publicstaticfinal”,表示全局靜態常量;方法也有默認修飾符“publicstaticabstract”,表示靜態抽象方法。(3)一個類在實現接口時,需要對接口中的所有方法進行實現。如果沒有實現接口中的全部方法,則這個類需要定義為抽象類。(4)一個類可以實現多個接口。(5)一個接口可以通過extends關鍵字繼承多個父接口。(6)一個類在繼承另一個類的同時還可以實現接口,此時,extends關鍵字必須位于implements關鍵字前面。任務實踐6-1組裝一臺計算機【任務描述】自行組裝計算機非常盛行,裝配一臺計算機需要的部件主要包括主板、中央處理器(CPU)、顯卡、顯示器、內存、硬盤等。每一個部件都有多種選擇,有不同品牌、不同廠家以及不同型號等,但不管選擇哪一種,都可以組裝到計算機上。現在編寫一個程序,模擬組裝一臺計算機(為了簡化程序,組裝時只組裝幾個部件即可)。【任務分析】1.由于不同品牌、不同廠家以及不同型號的部件都可以組裝到計算機上,因此每一個部件都需要定義一個統一的接口規范。本案例分別定義CPU、硬盤、內存的接口。2.分別定義部件類實現CPU、硬盤、內存接口,在類中對部件進行具體的定義。例如,在實現CPU部件的時候,可以定義為Intel公司或者AMD公司的產品,還可以定義不同的主頻等。3.定義計算機類,分別實例化CPU、硬盤、內存這些部件對象,并將其組裝到計算機上。任務實踐6-2USB接口的實現【任務描述】通常我們使用的計算機上都有USB接口,鼠標、鍵盤、麥克風等都可以通過USB接口使用。在計算機啟動時,這些設備也隨之啟動;當計算機關閉時,這些設備也會隨之關閉。鼠標、鍵盤、麥克風等USB接口設備都啟動后,計算機才開機成功;當這些USB接口設備都關閉后,計算機才關機成功。編寫一個USB接口模擬程序,模擬計算機的開機和關機過程。【任務分析】1.鼠標、鍵盤、音箱等USB接口設備只有在插入計算機的USB接口中才能使用,因此我們需要定義一個USB接口。為了實現設備隨著計算機的啟動和關閉而啟動和關閉的功能,我們在接口中定義了設備啟動和關閉的方法。2.編寫鼠標、鍵盤、音箱等設備的實現類,這些實現類需要遵循USB接口的標準,并實現設備的啟動和關閉方法。3.編寫一個計算機類。計算機類中包含了屬性USB插槽和安裝USB接口設備的方法。計算機中只有有了USB插槽后,才能插入USB接口設備。此外,計算機類還定義了開機和關機的方法。目錄CONTENTS任務6.1抽象類任務6.2接口任務6.3多態項目實施

垃圾分類程序項目實訓

寵物之家目錄CONTENTS任務6.3多態6.3.1多態的概念6.3.2靜態多態6.3.3動態多態6.3.4instanceof運算符多態性是面向對象的又一個重要特征。它是指在父類中定義的屬性和方法被子類繼承之后,可以具有不同的數據類型或表現出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義。對面向對象來說,多態分為編譯時多態和運行時多態。其中編譯時多態是靜態的,主要通過方法的重載來實現,可根據參數列表的不同來區分調用不同的方法,編譯之后就可以區分。而運行時多態是動態的,通過動態綁定來實現,也就是通常所說的多態性。6.3.1多態的概念靜態多態也叫編譯時多態,是由方法的重載來實現的。Java允許在同一個類中定義多個同名方法,只要它們的形參列表不同即可。形參列表不同,包括參數的類型不同、參數的個數不同或者參數的順序不同。如果同一個類中包含兩個或兩個以上方法名相同、但形參列表不同的方法,則稱為方法重載(overload)。6.3.2靜態多態注意:方法重載的要求是,同一個類中方法名相同,參數列表不同。至于方法的其他部分,如方法返回值類型、修飾符等,與方法重載沒有任何關系。publicclassExample5_13{publicstaticvoidmain(String[]args){intsum1=add(1,2);intsum2=add(1,2,3);doublesum3=add(1.2,2.3);System.out.println("sum1="+sum1);System.out.println("sum2="+sum2);System.out.println("sum3="+sum3);}publicstaticintadd(intx,inty){returnx+y;}publicstaticintadd(intx,inty,intz){returnx+y+z;}publicstaticdoubleadd(doublex,doubley){returnx+y;}}【例6-4】方法重載的定義和使用。6.3.2靜態多態Java實現動態多態有3個必要條件:繼承、重寫和向上轉型。只有滿足這3個條件,開發人員才能夠在同一個繼承結構中使用統一的邏輯來處理不同的對象,從而執行不同的行為。向上轉型指的是將子類對象賦給父類引用,或者可理解為將子類類型轉為父類類型,即可以理解為下面的賦值操作。父類對象名=new子類對象()6.3.3動態多態classPet{

voideat(){

System.out.println("寵物吃東西");}}classCatextendsPet{

voideat(){

System.out.println("貓吃魚");}}classDogextendsPet{

voideat(){

System.out.println("狗吃骨頭");}}publicclassExample5_14{

publicstaticvoidmain(String[]args){Petp1=newCat();

Petp2=newDog();

p1.eat();

p2.eat();

}}【例6-5】多態的使用。6.3.3動態多態classPet{ voideat(){

System.out.println("寵物吃東西");}}classDogextendsPet{

voideat(){

System.out.println("狗吃骨頭");}publicvoidprotectHome(){

System.out.println("狗看家……");}}publicclassExample5_15{

publicstaticvoidmain(String[]args){Petp2=newDog();

p2.eat();

tectHome();

}}【例6-6】向上轉型后不能調用子類新增的方法。5.4.3動態多態publicclassExample5_15{

publicstaticvoidmain(String[]args){Petp2=newDog();

p2.eat();

Dogd=(Dog)p2;

tectHome();

}}5.4.3動態多態將父類類型當作子類類型使用的情況,叫作“向下轉型”。classPet{ voideat(){

System.out.println("寵物吃東西");}}classCatextendsPet{

voideat(){

System.out.println("貓吃魚");}publicvoidsleep(){

System.out.println("貓睡覺……");}}classDogextendsPet{

voideat(){

System.out.println("狗吃骨頭");}publicvoidprotectHome(){

System.out.println("狗看家……");}}【例6-7】向下轉型時出現錯誤。6.3.4instanceof運算符publicclassExample5_16{

publicstaticvoidmain(String[]args){ Petp2=newDog();

Catc=(Cat)p2;

c.sleep();

}}【例6-7】向下轉型時出現錯誤。6.3.4instanceof運算符為了防止出現強制類型轉換錯誤,Java提供了一個關鍵字instanceof。它可以判斷一個對象是否為某個類(或接口)的實例或者子類實例,如果是,則返回true,否則返回false。語法格式如下:對象(或對象引用變量)instanceof類(或接口)publicclassExample5_16{

publicstaticvoidmain(String[]args){ Petp2=newDog();

p2.eat();

if(p2instanceofCat)

{Catc=(Cat)p2;

c.sleep();

}}}6.3.4instanceof運算符任務實踐6-3動物樂園【任務描述】動物園中有不同的動物,每種動物都有自己喜歡的玩具。飼養員在跟動物玩耍時,會根據動物的喜好給它們提供相應的玩具。本案例要求編寫一個程序模擬飼養員給動物提供玩具的過程。(1)飼養員給小狗提供球,小狗汪汪叫。(2)飼養員給小貓提供魚骨,小貓喵喵叫。【任務分析】1.在這個動物園里,涉及的對象有飼養員,各種不同動物以及不同的玩具。因此抽象出3個類Feeder、Animal和Toy。由于只考慮貓和狗這兩類動物,因此由Animal類派生出Cat類、Dog類,由Food類派生出Ball、FishBone類。2.Animal需要定義一些屬性和方法,將來由Cat類和Dog類繼承,因此可將Animal定義為抽象類,而不能將Animal定義為接口,因為定義為接口的話,內部不能定義成員變量和成員方法。3.Toy類中雖然也有屬性和方法,但數量比Animal少,因此將Toy定義為接口。任務實踐6-4計算不同圖形的周長與面積【任務描述】本案例要求編寫一個程序,可以根據用戶要求計算出不同圖形的周長和面積。例如,計算圓的周長與面積、三角形的周長與面積、矩形的周長與面積。【任務分析】1.定義抽象的父類Shape類,包含抽象方法getPerimeter()、getArea()方法,分別用于計算圖形的周長、面積。2.定義子類Circle類,定義一個屬性表示半徑,并分別實現getPerimeter()、getArea()方法,用于計算圓的周長、面積。3.定義子類Rectangle類,定義兩個屬性分別表示長和寬,并分別實現getPerimeter()、getArea()方法,用于計算長方形的周長、面積。4.定義子類Triangle類,定義三個屬性分別表示三條邊,并分別實現getPerimeter()、getArea()方法,用于計算三角形的周長、面積。5.創建測試類,設計一個calPerimeter(Shapes)方法實現輸出圖形的周長、calArea(Shapes)方法實現輸出圖形的面積;主函數中分別創建Circle類、Rectangle類、Triangle類的對象,分別作為參數調用calPerimeter()、calArea()方法,查看輸出結果。任務實踐6-5交通工具動起來--多態的應用【任務描述】設計和實現一個Movable移動接口,該接口具有移動功能,同時還能調節移動速度。Movable接口的這些功能將由有3種移動設備來實現,分別是汽車Car、自行車Bicycle、滑板Skateboard。最后還需設計一個應用程序類來使用這些實現Movable接口的移動設備。程序運行時,先詢問用戶想使用哪個設備,用戶選擇設備后,程序按照該設備的工作方式進行移動,并將移動結果輸出或展示。【任務分析】1.根據任務描述,需要定義一個移動接口Movable接口,接口中具有移動的方法move()、降低速度的方法decreaseSpeed()、停止移動的方法stopMove()。然后汽車Car、自行車Bicycle、滑板Skateboard這三個工具類分別實現這個接口并實現接口的相關方法。2.再定義一個應用程序類StartWork來使用這些實現Movable接口的類。類中定義一個方法work(),方法中根據傳入的工具對象,調用相關方法,模擬使用工具對應的功能。3.測試類中,分別創建汽車Car、自行車Bicycle、滑板Skateboard這三個工具類的對象,由用戶自主選擇要移動的工具,根據用戶的選擇,調用相關方法,模擬使用該工具對應的功能。目錄CONTENTS任務6.1抽象類任務6.2接口任務6.3多態項目實施垃圾分類程序項目實訓

寵物之家項目實施項目分析本任務用使用所學知識編寫一個垃圾分類程序。垃圾箱有紅、綠、藍、灰四種顏色,分別代表可以投放不同種類的垃圾。紅色垃圾箱表示可以投放有害垃圾,例如廢電池、過期藥品等;綠色垃圾箱表示可以投放廚余垃圾,例如菜葉、果皮等;藍色垃圾箱表示可以投放可回收垃圾,例如廢紙、廢塑料等;灰色垃圾箱表示可以投放干垃圾,例如煙頭、一次的餐具等。當往垃圾箱中投放垃圾時,會先進行判斷,是否允許投放該類垃圾,如果能投放,則進行下一步的垃圾處理,如果不能投放,則給出提示。1.通過任務的描述可知,此程序中包含了垃圾箱、垃圾這些對象。由于垃圾分成四種種類,因此可先定義一個抽象的垃圾類,然后再分別定義四個垃圾子類,垃圾子類也是抽象類。最后再分別定義各種具體的垃圾類。2.抽象的垃圾類中可定義名稱屬性,以及抽象的方法如何投放垃圾以及如何處理垃圾。在四個垃圾子類中分別實現這兩個抽象方法。3.垃圾箱類中定義顏色屬性,并定義投放垃圾的方法。當把垃圾投放到垃圾箱時,需要判斷當前顏色的垃圾箱是否允許投放這種垃圾,如果允許,則進行下一步的處理,如果不允許則給出提示。4.最后編寫測試類,在其main方法中,創建垃圾箱對象以及垃圾對象,并將垃圾投放到垃圾箱中。項目實施項目實施關鍵代碼如下://定義垃圾類publicabstractclassWaste{ publicStringname;//垃圾名稱 publicabstractvoidhowToPut();//如何投放垃圾 publicabstractvoidhowToHandle();//如何處理垃圾}項目實施項目實施關鍵代碼如下://有害垃圾類publicabstractclassBadWasteextendsWaste{ @Override publicvoidhowToPut(){//實現如何投放垃圾方法 System.out.print("【投放要求】:"); System.out.println("電池投放請注意輕放、油漆桶、殺蟲劑如有殘留請密閉后投放"+"熒光燈、節能燈易破損請包裹后輕放、廢藥品及其包裝連帶包裝一并投放"); } @Override publicvoidhowToHandle(){//實現如何處理垃圾方法 System.out.print("【處理步驟】:"); System.out.print("先將"++"進行無害化,"); System.out.println("再進行后續的垃圾處理操作"); }}項目實施項目實施關鍵代碼如下://廢電池類publicclassBatteryextendsBadWaste{ publicBattery(Stringname){ =name; System.out.println("發現一些"+name); }}項目實施項目實施關鍵代碼如下://垃圾桶類publicclassWasteBin{

...... publicvoidput(Wastew){//投放垃圾的方法 if(color.equals("藍色")){ if(winstanceofReuseWaste){ System.out.println(">>向藍色垃圾桶放入了可回收垃圾:"+); w.howToHandle(); }else{ System.out.println(">>"++"不是可回收垃圾,不能投放到當前垃圾桶里!"); System.out.println("溫馨提醒:請根據垃圾桶的分類標識正確投放"); } }...... }}項目實施項目實施關鍵代碼如下://測試類publicclass垃圾分類{ publicstaticvoidmain(String[]args){ WasteBinrwb=newWasteBin("紅色"); Batterybattery=newBattery("廢電池"); battery.howToPut(); rwb.put(battery); Paperp=newPaper("廢紙"); p.howToPut(); rwb.put(p); VegetableLeafvl=newVegetableLeaf("菜葉"); vl.howToPut(); rwb.put(vl); CigaretteEndce=newCigaretteEnd("煙頭"); rwb.put(ce); WasteBinbwb=newWasteBin("藍色"); bwb.put(p); }}目錄CONTENTS任務6.1抽象類任務6.2接口任務6.3多態項目實施垃圾分類程序項目實訓寵物之家項目實訓寵物之家【項目描述】本案例將設計一款電子寵物系統——寵物之家,在該系統中,你可以領養自己喜歡的寵物。你喜歡狗、貓、小倉鼠,還是小兔子呢?這些都可以領養。你可以為寵物起名字,可以選擇寵物性別,還可以給寵物喂食、陪你的寵物玩耍。項目實訓寵物之家【項目分析】1.定義抽象類Pet類,類具有的屬性有昵稱(name),方法有自我介紹(introduce())、吃飯(eat())。2.在寵物之家中有各種各樣的寵物,如寵物狗、寵物貓、寵物兔等。為了簡化程序,當前只設計兩款寵物(寵物貓和寵物狗)。寵物貓類Cat繼承Pet類以上屬性和方法的同時,重寫自我介紹(introduce())方法,另外再定義自己特有的屬性——品種(strain),以及特有的方法滾球(rollBall())。寵物狗類Dog繼承Pet類以上屬性和方法的同時,重寫自我介紹(introduce())方法,另外再定義自己特有的屬性——性別(sex),以及特有的方法——吹泡泡(blowBubbles())。3.定義領養者類(Owner),具有姓名(name)屬性、給寵物喂食(feed())和陪寵物玩耍(play())方法。4.在給寵物喂食時,要實現分別給Cat和Dog對象喂食,因此通過多態來解決這個問題,定義feed(Petpet)方法實現為不同的寵物喂食,以增強程序的擴展性和可維護性。5.同樣的道理,陪寵物玩耍的方法play(Petpet)也可通過多態來實現。由于寵物貓玩耍,通過調用滾球方法rollBall()來實現,而寵物狗玩耍,通過調用吹泡泡方法blowBubbles()來實現,因此在paly()方法中需要向下轉型才能調用對應寵物的方法。6.測試類中定義方法adopt()表示領養寵物,operate()方法表示操作寵物。然后創建一個領養者類對象,調用adopt()方法領養寵物,調用operate()方法操作寵物。小結THANKS!《Java程序設計案例教程(微課版)》項目7異常處理——異常成績處理《Java程序設計案例教程(微課版)(第2版)》項目導入

在測試學生成績管理系統的成績輸入模塊時,發現輸入不合法的成績時系統會停止運行,因此通過Java中的異常處理機制來確保程序的健壯性。通過這個程序培養學生主動積極面對和解決問題的態度,以應對人生中的各種挑戰。學習目標?掌握異常的概念和體系結構。?掌握異常的兩種處理方式。?掌握自定義異常。

?培養主動積極面對和解決問題的態度。(素養目標)目錄CONTENTS任務7.1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論