Chapter_4_JAVA作業
一.類的封裝,繼承與多態
1.課前預習
1.1 舉列現實生活中的封裝,以及簡述在程序中什麽是屬性的封裝?
1.1.1 將東西捆綁在一起,如集成芯片;高壓電線等等
1.1.2 封裝就是將屬性私有化,提供公有的方法訪問私有屬性。做法就是:修改屬性的可見性來限制對屬性的訪問,
並為每個屬性創建一對取值(getter)方法和賦值(setter)方法,用於對這些屬性的訪問。
1.2 構造函數與普通函數相比較都有那些特點?
構造函數: 永遠沒有返回值,也絕對不能為它指定返回類型,甚至是VOID類型
構造函數的名稱永遠要和類名相同
構造函數只能用New運算符來調用
普通函數: 不需要用new關鍵字調用
可以用return語句返回值
函數內部不建議使用this關鍵字
函數命名以駝峰方式,首字母小寫
1.3 簡述什麽是方法的重載?
方法名相同,參數不同或多個參數的形式。
1.4 簡述繼承父類必須滿足什麽條件,以及繼承了父類後子類將會怎樣?
1.4.1 不能是Fina類型,父類的構造方法不能是私有的。
1.4.2 子類會繼承父類的不受限制成員變量和方法
1.5 簡述什麽是方法的重寫?
子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆蓋
1.6 子類構造函數與父類構造函數之間有什麽關系?
1.6.1 父類中沒有顯式定義任何構造方法,此時父類中實際有一個默認的無參數構造方法。這時,在子類中顯式定義任何構造方法時,可以不用使用super調用父類的默認方法。
1.6.2 父類中顯式定義了默認的無參數構造方法,那麽子類可以定義任意的構造方法,而不必使用super調用父類的構造方法
1.6.3 父類中顯示定義了構造方法,卻沒有顯示定義默認的無參數構造方法,那麽子類定義任何構造方法中都需要通過super調用父類的構造方法
1.7 訪問修飾符有幾種,他們分別都起什麽作用?
Public : 所有包所有地方都可以訪問
Protected : 同包以及子類可以訪問
Friendly(default) : 同包可以訪問
Private: 除了當前類任何地方都不可以訪問(私有的【封裝】)
1.8 要使用多態性需要那些條件?
需要有繼承關系的存在
需要有方法的重寫
需要有父類的引用指向子類對象
2.課後復習
2.1 屬性封裝的目的是什麽?以及進行封裝的步驟是什麽?
2.1.1 將事物的特性和功能包裝在一起。隱藏信息,實現細節,對外暴露調用的接口。
2.1.2 a: 如封裝一個屬性(成員變量)。
b: 將訪問修飾符改為私有的(private)
c: 定義一個設定值的方法(方法名SetXxx)用於設定成員變量的值。
d: 定義一個外部訪問的方法(方法名 GetXxx)用於外部的訪問與調用。
2.2 使用構造函數的目的是什麽?以及怎麽樣的函數才是構造函數?
2.2.1 給對象數據進行初始化
2.2.2 無返回類型、方法名與類名相同
2.3 簡述重載和重寫的區別?
重載: 方法名相同,返回類型不同,參數不同,叫重載。
重寫: 當子類中的一個方法與父類中的方法有相同的方法名並且有相同的參數和類型,那麽這個子類中新定義的方法將替代父類中幫子類定義好的方法,這就是子類中的方法重寫,方法重寫也叫方法的覆蓋。
2.4 簡述各種方法修飾符的作用?
Public: 公共的,所有的包、類之間都可以訪問。
Privte: 私有的,只能在相同的類中訪問。
Protect: 保護的,可以被同一個包中的所有類訪問,也可以被所有的子類訪問,子類可以在不同的包。
Default: 違約的、拖欠的,同包可以訪問。
static: 靜態修飾符,可用類名直接調用
final: 常量,不可改變的。
無訪問修飾符: 可以被同一個包中的所有類訪問,子類必須在同一個包中。
2.5 子類繼承父類,則子類是否能使用父類的私有方法?
不能直接訪問。
可以對屬性(成員變量進行封裝)。
父類有一個年齡的屬性(成員變量)
package com.xuheng.classroon.encapsulation; /**父類(基類),動物基本屬性*/ public class Animal { /**狗的名字*/ public String name; /**狗的顏色*/ public String clooa; private String age; /**調用方法*/ public String getCc() { return cc; } /**設定值*/ public void setCc(String cc) { this.cc = cc; } /**展示*/ public void show() { System.out.println("這是一條"+name+",我的顏色是"+clooa); } }
子類
package com.xuheng.classroon.encapsulation; /**狗的類,是一個子類*/ public class Dog extends Animal{ //extends繼承的關鍵字 前者是子類,後者是父類。 /**價格*/ public int jiage; }
調用繼承父類中子類的Age
package com.xuheng.classroon.encapsulation; /**父類(基類),動物基本屬性*/ public class Zoo { public static void main(String[] args) { // Dog dog = new Dog(); // dog.name = "野狗"; // dog.clooa = "死黃色"; // dog.show(); // Dog a = new Dog(); a.setCc("das"); System.out.println(a.getCc()); } }
2.6 編寫程序定義一個父類並添加吃飯,掙錢,睡覺的方法,在定義一個兒子類繼承父親類,然後給子類添加一個自己獨特的方法(例如唱歌跳舞),並在子類中重寫父類掙錢的方法(例如老爸一月賺5000,兒子一月賺8000),最後添加一個測試類,創建子類對象,並調用子類對象的方法進行吃飯,唱歌,掙錢,睡覺等。
父類
package com.xuheng.computer; /**父類*/ public class Ba { /**吃飯方法*/ public void chifan() { System.out.println("我正在吃飯"); } /**掙錢方法*/ public void zhengqian() { System.out.println("我正在掙錢"); } /**睡覺方法*/ public void shuijiao() { System.out.println("我正在睡覺"); } }
子類
package com.xuheng.computer; public class Erzi extends Ba { public void tiaowu() { System.out.println("我正在跳舞"); } /**方法重寫*/ public void zhengqian() { System.out.println("我的老爸在掙錢,一月掙700000。"); } }
測試類
package com.xuheng.computer; /**測試類*/ public class Test { public static void main(String[] args) { Erzi show = new Erzi(); show.chifan(); show.shuijiao(); show.zhengqian(); show.tiaowu(); Ba test = new Erzi(); test.zhengqian(); } }
2.7 編寫程序實現多態性的步驟是什麽?
1. LSP李氏代換原則
2. 重寫
3. 重載
3. 作業部分
3.1 解答題
3.1.1 用自己的語句描述面向對象的多態是什麽?
面向對象多態的體現在重寫和重載,同一個類的不同子類對象對同一個方法的調用產生不同的結果叫多態。
3.1.2 簡述面向對象的封裝是什麽?
將事物的特性和功能包裝在一起。隱藏信息,實現細節,對外暴露調用的接口。
封裝就是將屬性私有化,提供公有的方法訪問私有屬性。做法就是:修改屬性的可見性來限制對屬性的訪問,
並為每個屬性創建一對取值(getter)方法和賦值(setter)方法,用於對這些屬性的訪問。
3.1.3 簡述面向對象的繼承是什麽?
繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力。
繼承的特性:
1. 單根性: 若類B繼承類A,那麽建立類B時只需要再描述與基類(類A)不同的少量特征(數據成員和成員方法)即可。這種做法能減小代碼和數據的冗余度,大大增加程序的重用性。
2. 傳遞性: 若類C繼承類B,類B繼承類A(多繼承),則類C既有從類B那裏繼承下來的屬性與方法,也有從類A那裏繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的,但仍是類C的屬性和方法。繼承是在一些比較一般的類的基礎上構造、建立和擴充新類的最有效的手段。
3. 復用性: 繼承提供了軟件復用功能。若類B繼承類A,那麽建立類B時只需要再描述與基類(類A)不同的少量特征(數據成員和成員方法)即可。這種做法能減小代碼和數據的冗余度,大大增加程序的重用性。
繼承的特點:
1. Java中只支持單繼承,不支持多繼承 , 繼承格式: public class 子類 extends 父類
2. 有些語言是支持多繼承的(C++,C#)
3. Java支持多層繼承(繼承體系)
3.2 代碼題
3.2.1 創建一個員工類(Employee),定義兩個構造函數,定義兩個重載方法(構造函數的參數類型不限,重載方法的方法名與參數不限)
員工類
package com.xuheng.computer; /**員工類*/ public class Employee { /**無參*/ public Employee() { System.out.println("無參的構造方法"); } /**有參的構造方法*/ public Employee(int i) { System.out.println("有參的構造方法,參數值是:"+i); } /**員工類,自我介紹方法,*/ public void Introduce() { System.out.println("大家好!我是Xxx"); } /**重載方法1*/ public void Introduce(String name) { System.out.println("大家好!我是"+name); } /**重載方法2*/ public void Introduce(String name , int age) { System.out.println("大家好!我是"+name+",我今年"+age+"歲。"); } }
測試類
package com.xuheng.computer; public class Text_Employee { public static void main(String[] args) { //無參的 Employee ss = new Employee(); ss.Introduce(); ss.Introduce("張山"); ss.Introduce("李四", 18); //有參的 Employee s1 =new Employee(12); s1.Introduce(); } }
結果
3.2.2 創建一個部門經理類(Manager),定義二個構造方法,定義重寫一個方法,方法體可以用一行註釋來表示方法體。
員工類(父類)
package com.xuheng.computer; /**員工類*/ public class Employee { /**無參*/ public Employee() { System.out.println("無參的構造方法"); } /**Show 顯示*/ public void Show() { System.out.println("這裏是員工類"); } }
部門經理類(子類)
package com.xuheng.computer; /**部門經理類,繼承員工類*/ public class Manager extends Employee { /**部門經理類,日常事務*/ public void Processs() { System.out.println("我們是部門經理類,我們的日常事務是Xxx"); } public Manager() { System.out.println("無慘構造方法"); } /**有參的構造方法*/ public Manager(int s) { System.out.println("有參構造方法,參數"+s); } /**重寫了員工類的方法*/ public void Show() { System.out.println("重寫了員工類的現實方法"); } }
測試類
package com.xuheng.computer; public class Text_Employee { public static void main(String[] args) { Manager s1 = new Manager(); s1.Show(); } }
結果
Chapter_4_JAVA作業