Java類和對(duì)象的設(shè)計(jì)原理
一、實(shí)驗(yàn)?zāi)康?/h2>
- 1. 掌握面向?qū)ο蟮木幊趟枷?、類與對(duì)象;
- 2. 掌握類的封裝性、繼承性和多態(tài)性的作用;
- 3. 掌握成員變量和成員方法的特性、構(gòu)造方法、toString方法、equals方法的使用;
- 4. 掌握this、super、final、static等關(guān)鍵字的使用;
- 5. 掌握接口及接口對(duì)象的使用;
- 6. 掌握包的定義與使用;
- 7. 掌握四種訪問(wèn)控制權(quán)限private、default、protected、public。
二、實(shí)驗(yàn)代碼
1.定義一個(gè)類MyProgram,包含兩個(gè)屬性:
一個(gè)是private的整型屬性data、一個(gè)是private的String類型屬性str,封裝這兩個(gè)屬性的四個(gè)方法setData( )和getData( )、setStr( )和getStr( );重寫toString方法(自定義格式);重寫equals方法(屬性data和屬性str均相同才表示兩個(gè)對(duì)象相等)。并編寫測(cè)試程序,測(cè)試MyProgram類的使用。
package 作業(yè)練習(xí).test2; public class MyProgram { public static void main(String[] args) { Test t1=new Test(); Test t2=new Test(); t1.setStr("A"); t2.setStr("B"); t1.setData(1); t2.setData(2); System.out.println(t1.equals(t2)); System.out.println(t1.toString()); System.out.println(t2.toString()); } } class Test{ private String str; private int data; public String getStr() { return str; } public void setStr(String str) { this.str = str; } public int getData() { return data; } public void setData(int data) { this.data = data; } @Override public boolean equals(Object object) { Test test =(Test) object; if(test.getData()==this.getData()&&test.getStr() == this.getStr()) { return true; } else { return false; } } @Override public String toString() { return "str為"+this.getStr()+"\tdata為:"+this.getData(); } }
2. 在Vehicle類的基礎(chǔ)上創(chuàng)建一個(gè)Tractor(拖拉機(jī))類
它不僅擁有journey、wheelNum、LoadNum、driveSpeed四個(gè)屬性和DriveAt()方法,而且還擁有自己的plough()方法,在該方法中要求能夠顯示journey、wheelNum、LoadNum三個(gè)屬性的值。請(qǐng)編寫測(cè)試類,調(diào)用DriveAt()、plough()方法。
package 作業(yè)練習(xí).test2; public class Vehicle { public float journey; public int wheelNum; public int loadNum; public int driveSpeed; public Vehicle() { journey = 100.3f; wheelNum = 4; loadNum = 1; } public void driveAt(int speed) { if (speed >= 60) { System.out.println("行車速度太快,容易造成事故"); driveSpeed = 40; } else { System.out.println("你在安全行駛速度內(nèi)行駛"); driveSpeed = speed; } } } package 作業(yè)練習(xí).test2; public class Tractor extends Vehicle { public void plough() { System.out.println("公里數(shù):"+this.journey); System.out.println("車速:"+this.driveSpeed); System.out.println("承載量:"+this.loadNum); } public static void main(String[] args) { Tractor t = new Tractor(); t.plough(); t.driveAt(80); t.plough(); } }
3. 組合實(shí)現(xiàn)汽車類
問(wèn)題描述:一輛Car有(has)四個(gè)輪子(Wheels)和一個(gè)發(fā)動(dòng)機(jī)(Engine)?,F(xiàn)在要求用組合方法設(shè)計(jì)類Car、類Wheel和類Engine。
(1) 類Engine 有字符串屬性type記錄發(fā)動(dòng)機(jī)的型號(hào);
有構(gòu)造方法,可設(shè)置發(fā)動(dòng)機(jī)的型號(hào);
有方法start()啟動(dòng)引擎(輸出發(fā)動(dòng)機(jī)型號(hào)和字符串“starts”的)。
(2)類Wheel有字符串屬性type記錄輪胎的型號(hào),有整數(shù)類型屬性index記錄當(dāng)前輪胎編號(hào)(1:front-left,2:front-right,3:back-left,4:back-right);
有構(gòu)造方法,可設(shè)置輪胎的型號(hào)和編號(hào);
有方法roll()表示輪胎正在轉(zhuǎn)動(dòng)(輸出輪胎型號(hào)、輪胎位置和“rolling”的字符串)。
(3)類Car有字符串屬性model記錄轎車的型號(hào),有屬性wheels[]和engine,分別是Wheel類對(duì)象數(shù)組和Engine類對(duì)象;
有構(gòu)造方法,參數(shù)是三個(gè)字符串,分別表示轎車的型號(hào)、輪胎型號(hào)和發(fā)動(dòng)機(jī)的型號(hào);
有方法changeWheel()可以改變指定輪胎的型號(hào);
有方法start(),先輸出轎車型號(hào)和字符串“firing”,然后調(diào)用Engine的start(),再調(diào)用所有輪胎的roll(),最后顯示轎車型號(hào)和字符串“running”。
(4)編寫測(cè)試程序測(cè)試上述所有方法。
package 作業(yè)練習(xí).test2; class Engine extends Car { String type ; public void Engine(String type) { this.type = type; } void start() { System.out.println(type + " starts"); } } class Wheel extends Car { String type ; int index = 0; public void Wheel(String type, int index) { this.type = type; this.index = index; } void roll() { System.out.println("wheel" + index + " " + type + " rolling"); } } public class Car { String model; static Wheel[] wheels; static Engine engine = new Engine(); Car(String model, Wheel[] wheels, String eg) { this.model = model; this.wheels = wheels; engine.Engine(eg); } Car() { } public void changeWheel(int index, String str) { wheels[index - 1].Wheel(str, index); } void start() { System.out.println(model + " firing"); engine.start(); for (int i = 0; i < 4; i++) { wheels[i].roll(); } } public static void main(String[] args) { Wheel[] wheels = new Wheel[4]; String model = "瑪莎拉蒂"; String engine = "FSI2.0L"; for (int i = 1; i <= 4; i++) { wheels[i - 1] = new Wheel(); wheels[i - 1].Wheel("德國(guó)馬牌", i); } Car car = new Car(model, wheels, engine); car.start(); System.out.println("-----更改輪胎型號(hào)-----"); car.changeWheel(2, "米其林"); car.changeWheel(3, "倍耐力"); car.start(); } }
4. 有圖形接口Shape
有圖形接口Shape,參照?qǐng)ACircle類補(bǔ)充完整正方形Square和三角形Triangle類,并分析運(yùn)行結(jié)果。
package 作業(yè)練習(xí).test2; interface Shape { void draw(); void erase(); } class Circle implements Shape { public void draw() { System.out.println("Circle.draw()"); } public void erase() { System.out.println("Circle.erase()"); } } class Square implements Shape { public void draw() { System.out.println("Square.draw()"); } public void erase() { System.out.println("Square.draw()"); } } class Triangle implements Shape { public void draw() { System.out.println("Triangle.draw()"); } public void erase() { System.out.println("Triangle.draw()"); } } public class Shapes { public static Shape randShape() { switch ((int) (Math.random() * 3)) { default: case 0: return new Circle(); case 1: return new Square(); case 2: return new Triangle(); } } public static void main(String[] args) { Shape[] s = new Shape[9]; for (int i = 0; i < s.length; i++) s[i] = randShape(); for (int i = 0; i < s.length; i++) s[i].draw(); } }
5. USB接口程序設(shè)計(jì)
通常人們使用的計(jì)算機(jī)上都有USB接口,鼠標(biāo)、鍵盤、麥克風(fēng)等都可以連接到USB接口中使用。在計(jì)算機(jī)啟動(dòng)時(shí),這些設(shè)備也隨之啟動(dòng);當(dāng)計(jì)算機(jī)關(guān)閉時(shí),這些設(shè)備也會(huì)隨之關(guān)閉。鼠標(biāo)、鍵盤、麥克風(fēng)等USB接口設(shè)備都啟動(dòng)后,計(jì)算機(jī)才開機(jī)成功;當(dāng)這些設(shè)備都關(guān)閉后,計(jì)算機(jī)才關(guān)機(jī)成功。
讀所編寫的USB接口程序,該程序模擬了計(jì)算機(jī)的開機(jī)和關(guān)機(jī)過(guò)程,寫出運(yùn)行結(jié)果。
package 作業(yè)練習(xí).test2.USB接口; public class Computer { private USB[] usbArr=new USB[4]; //向計(jì)算機(jī)上連接一個(gè)USB設(shè)備 public void add(USB usb){ //遍歷所有的插槽 for(int i=0;i<usbArr.length;i++){ //如果發(fā)現(xiàn)一個(gè)空的 if(usbArr[i]==null){ usbArr[i]=usb; break; } } } //計(jì)算的開機(jī)功能 public void powerOn(){ //遍歷所有的插槽 for(int i=0;i<usbArr.length;i++){ //如果發(fā)現(xiàn)有設(shè)備 if(usbArr[i]!=null){ //將USB設(shè)備啟動(dòng) usbArr[i].turnOn(); } } System.out.println("計(jì)算機(jī)開機(jī)成功?。?!"); } //計(jì)算的關(guān)機(jī)功能 public void powerOff(){ //遍歷所有的插槽 for(int i=0;i<usbArr.length;i++){ //如果發(fā)現(xiàn)有設(shè)備 if(usbArr[i]!=null){ //將USB設(shè)備關(guān)閉 usbArr[i].turnOn(); } } System.out.println("計(jì)算機(jī)關(guān)機(jī)成功?。?!"); } }
package 作業(yè)練習(xí).test2.USB接口; public class KeyBoard implements USB { @Override public void turnOn() { System.out.println("鍵盤啟動(dòng)了......"); } @Override public void turnOff() { System.out.println("鍵盤關(guān)閉了......"); } }
package 作業(yè)練習(xí).test2.USB接口; public class Mic implements USB { @Override public void turnOn() { System.out.println("麥克風(fēng)啟動(dòng)了......"); } @Override public void turnOff() { System.out.println("麥克風(fēng)關(guān)閉了......"); } }
package 作業(yè)練習(xí).test2.USB接口; public class Mouse implements USB { @Override public void turnOn() { System.out.println("鼠標(biāo)啟動(dòng)了......"); } @Override public void turnOff() { System.out.println("鼠標(biāo)關(guān)閉了......"); } }
package 作業(yè)練習(xí).test2.USB接口; public class Test { public static void main(String[] args) { //實(shí)例化計(jì)算機(jī)對(duì)象 Computer computer=new Computer(); //向計(jì)算機(jī)中添加鼠標(biāo)、麥克風(fēng)、鍵盤 computer.add(new Mouse()); computer.add(new Mic()); computer.add(new KeyBoard()); //啟動(dòng)計(jì)算機(jī) computer.powerOn(); //關(guān)閉計(jì)算機(jī) computer.powerOff(); } }
package 作業(yè)練習(xí).test2.USB接口; public interface USB { void turnOn();//啟動(dòng) void turnOff();//關(guān)閉 }
6.this關(guān)鍵字主要有三個(gè)應(yīng)用:
(1)this調(diào)用本類中的屬性,也就是類中的成員變量;
(2)this調(diào)用本類中的其他方法;
(3)this調(diào)用本類中的其他構(gòu)造方法,調(diào)用時(shí)要放在構(gòu)造方法的首行。
7.請(qǐng)簡(jiǎn)述static關(guān)鍵字的作用
static是一個(gè)修飾符,用于修飾類的成員方法、類的成員變量,另外可以編寫static代碼塊來(lái)優(yōu)化程序性能。
static修飾的方法一般稱作靜態(tài)方法,由于靜態(tài)方法不依賴于任何對(duì)象就可以進(jìn)行訪問(wèn),因此對(duì)于靜態(tài)方法來(lái)說(shuō),是沒(méi)有this的,因?yàn)樗灰栏接谌魏螌?duì)象,既然都沒(méi)有對(duì)象,就談不上this了。并且由于這個(gè)特性,在靜態(tài)方法中不能訪問(wèn)類的非靜態(tài)成員變量和非靜態(tài)成員方法,因?yàn)榉庆o態(tài)成員方法/變量都必須依賴具體的對(duì)象才能夠被調(diào)用。static塊可以優(yōu)化程序性能,是因?yàn)樗奶匦裕褐粫?huì)在類被初次加載的時(shí)候執(zhí)行一次。
8.請(qǐng)簡(jiǎn)述super關(guān)鍵字的作用
super用于在 派生類中調(diào)用父類的重名方法,或者引用重名的變量。super被用在派生類中,就是為了明確調(diào)用父類的方法。
class base { int a = 100; } class sup1 extends base { int a = 200; void show() { System.out.println(a); System.out.println(a); } public static void main(String[] args) { new sup1().show(); } }
9.請(qǐng)簡(jiǎn)述final關(guān)鍵字的作用
final關(guān)鍵字可以用于三個(gè)地方。用于修飾類、類屬性和類方法。被final關(guān)鍵字修飾的類不能被繼承,被final關(guān)鍵字修飾的類屬性和類方法不能被覆蓋(重寫);對(duì)于被final關(guān)鍵字修飾的類屬性而言,子類就不能給他重新賦值了,如果重新賦值,會(huì)報(bào)錯(cuò)
到此這篇關(guān)于Java類和對(duì)象的設(shè)計(jì)原理的文章就介紹到這了,更多相關(guān)Java類和對(duì)象 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中的ImportSelector類動(dòng)態(tài)加載bean詳解
這篇文章主要介紹了SpringBoot中的ImportSelector類動(dòng)態(tài)加載bean詳解,ImportSelector接口是spring中導(dǎo)入外部配置的核心接口,根據(jù)給定的條件(通常是一個(gè)或多個(gè)注釋屬性)判定要導(dǎo)入那個(gè)配置類,在spring自動(dòng)化配置和@EnableXXX中都有它的存在,需要的朋友可以參考下2024-01-01Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法
這篇文章主要介紹了Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11Java之如何正確地對(duì)包裝類進(jìn)行裝箱與拆箱
在這篇文章中給大家繼續(xù)講解包裝類的裝箱和拆箱問(wèn)題。你可能會(huì)很好奇,做java開發(fā),怎么還裝起箱子來(lái)了?那么就請(qǐng)大家?guī)е苫笸驴窗?/div> 2023-04-04java理論基礎(chǔ)函數(shù)式接口特點(diǎn)示例解析
這篇文章主要為大家介紹了java理論基礎(chǔ)函數(shù)式接口特點(diǎn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Java單線程ThreadLocal串值問(wèn)題解決方案
這篇文章主要介紹了Java單線程ThreadLocal串值問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04詳談ServiceLoader實(shí)現(xiàn)原理
下面小編就為大家?guī)?lái)一篇詳談ServiceLoader實(shí)現(xiàn)原理。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Mybatis Plus LambdaQueryWrapper的具體用法
Mybatis Plus 在其基礎(chǔ)上擴(kuò)展了 LambdaQueryWrapper,LambdaQueryWrapper 提供了更加簡(jiǎn)便的查詢語(yǔ)法,同時(shí)也避免了SQL注入的風(fēng)險(xiǎn),感興趣的可以了解一下2023-11-11最新評(píng)論