-
1.本周學習總結
1.1 嘗試使用思維導圖總結有關繼承的知識點。
1.2 使用常規方法總結其他上課內容。
這周上課主要學了繼承,在打代碼的時候對各個關鍵字(除了super關鍵字)的用法有一點混亂。對多態和繼承的區別也有點混淆,努力百度中。有時候上課感覺聽多了但一到打代碼就啥都不會了,可能是因為沒鞏固好。
-
2. 書面作業
① 注釋的應用
-
使用類的注釋與方法的注釋為前面編寫的類與方法進行注釋,並在Eclipse中查看。(截圖)
①
②
② 面向對象設計(大作業1,非常重要)
-
2.1 將在網上商城購物或者在班級博客進行學習這一過程,描述成一個故事。(不得少於50字,參考QQ群中PPT的范例)
A:
用戶打開網頁登錄系統,瀏覽網頁所列出的商品,經過挑選點擊選擇滿意商品的數量與種類加入購物車。在購物車查看自己已選商品,確認數量與種類后點擊結算,付賬后系統將生成訂單。
-
2.2 通過這個故事我們能發現誰在用這個系統,系統中包含的類及其屬性方法,類與類之間的關系。嘗試找到這些類與屬性,並使用思維導圖描述類、屬性、方法及類與類之間的關系。
③ ManagerTest.zip代碼分析
分析ManagerTest.zip中的代碼,回答幾個問題:
-
3.1 在本例中哪里體現了使用繼承實現代碼復用?回答時要具體到哪個方法、哪個屬性。
A:
public Manager(String n, double s, int year, int month, int day)
{
super(n, s, year, month, day);
bonus = 0;
}
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
用到了getSalary方法,n、s、year、month、day這幾個屬性。
-
3.2 Employee類及其子類Manager都有getSalary方法,那怎么區分這兩個方法呢?
A:
父類:
public double getSalary()
{
return salary;
}
子類:
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
由程序可見,父類與子類方法不同的區別是子類會用super關鍵字來表示,故以此來區分父類與子類。
-
3.3 文件第26行e.getSalary(),到底是調用Manager類的getSalary方法還是Employee類的getSalary方法。
A:
由以上截圖可以看出,此行的e.getSalary()是調用Employee類的方法`。
-
3.4 Manager類的構造函數使用super調用父類的構造函數實現了代碼復用,你覺得這樣的有什么好處?為什么不把父類構造函數中的相關代碼復制粘貼到Manager的構造函數中,這樣看起來不是更直觀嗎?
A:
自己覺得實現代碼復用可以省點事,但查了一下百度,得知了:重新使用已有代碼可以降低成本、增加代碼的可靠性並提高它們的一致。既然如此,有了更高效的方法可以實現低成本,那如果再復制粘貼浪費空間,是沒有必要的。
④ Object類
-
4.1 編寫一個Fruit類及屬性String name,如沒有extends自任何類。使用System.out.println(new Fruit());是調用Fruit的什么方法呢?該方法的代碼是從哪來的?嘗試分析這些代碼實現了什么功能?
A:
package ex2;
class Fruit{ //定義類為Fruit
private String name; //定義這個類的私有屬性name(名字)
}
public class test201{
public static void main(String[] args){ //main函數,程序運行的入口。
System.out.println(new Fruit());
}
}
由於沒有extends自任何類,故默認繼承了Object為父類,並調用了Fruit的toString()方法。
顯示如下:
-
4.2 如果為Fruit類添加了toString()方法,那么使用System.out.println(new Fruit());調用了新增的toString方法。那么其父類中的toString方法的代碼就沒有了嗎?如果同時想要復用其父類的toString方法,要怎么操作?(使用代碼演示)
A:
package ex2;
class Fruit{ //定義類為Fruit
private String name; //定義這個類的私有屬性name(名字)
@Override
public String toString() { //調用toString()方法
return "I'M A Mango";
}
}
public class test201{
public static void main(String[] args){ //main函數,程序運行的入口。
System.out.println(new Fruit());
}
}
調用了新增的toString方法后,其父類中的toString方法的代碼不會沒有。
若同時想用復用父類的方法,只要結合super關鍵字來復用即可。如return ""I'M A Mango" + super.toString();
顯示結果如下:
-
4.3 Fruit類還繼承了Object類的eqauls方法。嘗試分析其功能?自己編寫一個equals方法覆蓋父類的相應方法,功能為當兩個Fruit對象name相同時(忽略大小寫),那么返回true。(使用代碼證明你自己覆蓋的eqauls方法是正確的)
A:
public boolean equals(Object obj) {
return (this == obj);
}
功能如下:
package ex2;
class Fruit{ //定義類為Fruit
private String name; //定義這個類的私有屬性name(名字)
public Fruit(String name){
this.name = name;
}
@Override
public String toString() {
return "I'M A Mango";
}
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == this)
return false;
return true;
}
}
public class test201{
public static void main(String[] args){ //main函數,程序運行的入口。
Fruit a = new Fruit("I'M A Mango");
Fruit b = new Fruit("I'M A mango");
System.out.println(a.equals(a));
System.out.println(a.equals(b));
}
}
運行結果如下:
-
4.4 在4.3的基礎上使用ArrayList
fruitList存儲多個fruit,要求如果fruitList中已有的fruit就不再添加,沒有的就添加進去。請編寫相關測試代碼。並分析ArrayList的contatins方法是如何實現其功能的?
A:
可以將其主函數改為如上圖:
可以看一下ArrayList的contatins方法的源代碼為:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
public boolean equals(Object obj) {
return (this == obj);
}
可以發現在contains方法會調用o.equals(elementData[i])方法來比較兩個對象的引用是否相同。故功能是以此來實現的。
⑤ 代碼閱讀:PersonTest.java(abstract、多態)
-
5.1 畫出類的繼承關系
A:
-
5.2 讀懂main函數,將自己推測的出代碼運行結果與真正運行結果進行比較。嘗試分析原因
A:
會顯示為:
Manager [bonus=12000.3, toString()=Employee [salary=90000.1, toString()=Person [name=Clark, adress=GE, phonenumber=111, email=111@mail.com, age=10, gender=mail]]]
Student [status=1, toString()=Person [name=wang, adress=110, phonenumber=15959, email=15959@163.com, age=18, gender=male]]
Employee [salary=1000.0, toString()=Person [name=zhang, adress=136, phonenumber=1360, email=1360@mail.com, age=21, gender=female]]
Programmer [allowance=50000.0, toString()=Employee [salary=100000.0, toString()=Person [name=Gates, adress=usa, phonenumber=911, email=911@com, age=59, gender=male]]]
可以看出:繼承了Person類的Student類和Employee類比繼承了Employee類的Manager類和Programmer類少了一層嵌套。因為Employee類在被繼承前也繼承了Person類,故出現此結果。
-
5.3 子類中里面使用了super構造函數,作用是什么?如果將子類中的super構造函數去掉,行不行?
A:
作用是引用當前對象的直接父類中的成員。不知道答案,故查詢了一下之后總結出:其實可以不用顯式的寫出super,但前提是“超類中有多個構造方法,且有一個是顯式寫出的無參的構造方法”。但此代碼中沒有類符合條件,故不可以。
-
5.4 PersonTest.java中的代碼哪里體現了多態?你覺得多態有什么好處?多態和繼承有什么關系嗎?
A:
for (Person person : peoples) {
System.out.println(person);
}
在代碼里這里體現了多態。
百度到了比較具體完整的答案:多態對已存在的代碼具有可替換性、可擴充性、接口性、靈活性、簡化性,可以增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。也在應用中體現了靈活多樣的操作,提高了使用效率。並且簡化了對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時可以看出其優點。
我認為,多態最大的好處對於現在我們來說應該是其靈活性比較強,並且比較簡便,在編寫多態方法時,所有重載的方法所執行的目的是相同的,但其參數也許不同。所以可以屏蔽不同子類對象之間的差異,寫出通用的代碼以適應需求的不斷變化。
-
3. 碼雲代碼提交記錄
在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然后搜索並截圖
-
4. PTA實驗
題目集:jmu-Java-03-面向對象1-基礎-封裝繼承 中的
函數(4-1, 4-2, 4-3,4-4較難選做)
編程(5-4, 5-5, 5-6)
一定要有實驗總結
5-4
發現對於子類的一些定義不是很清楚,一邊搜索一邊打代碼,有時對於類與類的調用會由混淆。
5-5
這道會比5-4簡單一些,按照題目要求寫即可。
5-6
一看題目就比較復雜,還在寫。。對ArrayList之類的實在不熟悉。