1.2 使用常規方法總結其餘上課內容。
1.多態:使用單一接口操做多種類型的對象。 2.private修飾屬性,public修飾方法。 3.關鍵字的瞭解和應用。java
Q2.面向對象設計(大做業1,很是重要)
2.1 將在網上商城購物或者在班級博客進行學習這一過程,描述成一個故事。(不得少於50字,參考QQ羣中PPT的範例)
2.2 經過這個故事咱們能發現誰在用這個系統,系統中包含的類及其屬性方法,類與類之間的關係。嘗試找到這些類與屬性,並使用思惟導圖描述類、屬性、方法及類與類之間的關係。
2.1答:網購:首先搜索所要的商品,在Shopping類在中,找到商品這個屬性(商品屬性包括商品的名稱,價格,商品的樣圖和發貨地),要買的話,就加入購物車,用到Shopping類中的shopcar屬性(包含所加入的商品的單價,購買的個數),在購物車中查看訂單狀況,若不想付款購買的話,可刪去訂單,計算總共的費用時,在Shopping類的total方法中計算各種商品的總價格,返回總價格,確認無誤後支付金額完成購物。
2.2答:函數
Q3.ManagerTest.zip代碼分析
分析ManagerTest.zip中的代碼,回答幾個問題:
3.1 在本例中哪裏體現了使用繼承實現代碼複用?回答時要具體到哪一個方法、哪一個屬性。
3.2 Employee類及其子類Manager都有getSalary方法,那怎麼區分這兩個方法呢?
3.3 文件第26行e.getSalary(),究竟是調用Manager類的getSalary方法仍是Employee類的getSalary方法。
3.4 Manager類的構造函數使用super調用父類的構造函數實現了代碼複用,你以爲這樣的有什麼好處?爲何不把父類構造函數中的相關代碼複製粘貼到Manager的構造函數中,這樣看起來不是更直觀嗎?
Q3.ManagerTest.zip代碼分析
分析ManagerTest.zip中的代碼,回答幾個問題:
3.1 在本例中哪裏體現了使用繼承實現代碼複用?回答時要具體到哪一個方法、哪一個屬性。
3.2 Employee類及其子類Manager都有getSalary方法,那怎麼區分這兩個方法呢?
3.3 文件第26行e.getSalary(),究竟是調用Manager類的getSalary方法仍是Employee類的getSalary方法。
3.4 Manager類的構造函數使用super調用父類的構造函數實現了代碼複用,你以爲這樣的有什麼好處?爲何不把父類構造函數中的相關代碼複製粘貼到Manager的構造函數中,這樣看起來不是更直觀嗎?學習
3.1
答:在子類中實現了代碼複用flex
public Manager(String n, double s, int year, int month, int day)
{
super(n, s, year, month, day);
bonus = 0;
}ui
public double getSalary()
{
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
複用的方法是父類中的設計
//父類構造函數
public Employee(String n, double s, int year, int month, int day)
{
name = n;
salary = s;
GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
hireDay = calendar.getTime();
}code
public double getSalary()
{
return salary;
複用的屬性有對象
private String name;
private double salary;
private Date hireDay;
3.2
答:關鍵看e的類型,但使用super關鍵字就運用父類方法
3.3
答:調用的是Employee類的getSalary方法
3.4
答:使用super調用父類的構造函數就是爲了要節省時間和資源,簡化了代碼,若是直接把以前的代碼複製過來,雖然看起來很直觀,可是顯得代碼十分冗餘。
Q4.Object類
4.1 編寫一個Fruit類及屬性String name,如沒有extends自任何類。使用System.out.println(new Fruit());是調用Fruit的什麼方法呢?該方法的代碼是從哪來的?嘗試分析這些代碼實現了什麼功能?
4.2 若是爲Fruit類添加了toString()方法,那麼使用System.out.println(new Fruit());調用了新增的toString方法。那麼其父類中的toString方法的代碼就沒有了嗎?若是同時想要複用其父類的toString方法,要怎麼操做?(使用代碼演示)
4.3 Fruit類還繼承了Object類的eqauls方法。嘗試分析其功能?本身編寫一個equals方法覆蓋父類的相應方法,功能爲當兩個Fruit對象name相同時(忽略大小寫),那麼返回true。(使用代碼證實你本身覆蓋的eqauls方法是正確的)
4.4 在4.3的基礎上使用ArrayList
4.1.編寫的代碼以下blog
`class Fruit {
private String name;
}繼承
public class Main {
public static void main(String[] args) {
System.out.println(new Fruit());
}
}
運行結果爲:Fruit@2a139a55,調運了Fruit的toString方法呢,該方法的代碼是從object類來,由於object是全部類的父類。功能就是輸出「類名加上16進制的哈希碼」形式字符串。
4.2.在Fruit類添加了toString()方法後的代碼
class Fruit {
private String name;
public String toString() { return "Fruit [name=" + name + "]"; //return "Fruit [name=" + name + "]\n"+super.toString(); }
}
public class Main {
public static void main(String[] args) {
System.out.println(new Fruit().toString());
}
}
調用了新增的toString方法,那麼其父類中的toString方法的代碼還在,若是同時想要複用其父類的toString方法,可運用super關鍵字,如上述代碼中被註釋部分,最後輸出結果爲:
4.3
答:Object類中的equals()方法是比較引用的,即引用相同就返回true,不一樣返回false。
Eclipse中自動生成的eqauls方法以下
Q5.代碼閱讀:PersonTest.java(abstract、多態)
5.1 畫出類的繼承關係
5.2 讀懂main函數,將本身推測的出代碼運行結果與真正運行結果進行比較。嘗試分析緣由
5.3 子類中裏面使用了super構造函數,做用是什麼?若是將子類中的super構造函數去掉,行不行?
5.4 PersonTest.java中的代碼哪裏體現了多態?你以爲多態有什麼好處?多態和繼承有什麼關係嗎?
5.1
5.2
運行結果爲:uploading-image-351814.png
5.3
答:做用是調用父類的屬性,方法,構造函數。 不能夠,由於若是將super去掉,那麼編譯器會自動加入對父類無參構造函數的調用,然而這個例子中沒有一個類是有無參構造函數的,會編譯出錯。
5.4
for (Person person : peoples) {
System.out.println(person);//多態的體現
}
多態的好處:
1.可替換性(substitutability)。多態對已存在代碼具備可替換性。例如,多態對圓Circle類工做,對其餘任何圓形幾何體,如圓環,也一樣工做。
2.可擴充性(extensibility)。多態對代碼具備可擴充性。增長新的子類不影響已存在類的多態性、繼承性,以及其餘特性的運行和操做。實際上新加子類更容易得到多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。
3.接口性(interface-ability)。多態是超類經過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。如圖8.3 所示。圖中超類Shape規定了兩個實現多態的接口方法,computeArea()以及computeVolume()。子類,如Circle和Sphere爲了實現多態,完善或者覆蓋這兩個接口方法。
4.靈活性(flexibility)。它在應用中體現了靈活多樣的操做,提升了使用效率。
5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤爲在處理大量對象的運算和操做時,這個特色尤其突出和重要。
多態與繼承的關係:
繼承,子類繼承父類中因此的屬性和方法,可是對於private的屬相和方法,因爲這個是父類的隱私,因此子類雖然是繼承了,可是沒有能夠訪問這些屬性和方法的引用,因此至關於沒有繼承到。不少時候,能夠理解爲,沒有繼承。 多態:就是父類引用能夠持有子類對象。這時候只能調用父類中的方法,而子類中特有方法是沒法訪問的,由於這個時候(編譯時)你把他看做父類對象的緣由,可是到了運行的時候,編譯器就會發現這個父類引用中原來是一個子類的對像,因此若是父類和子類中有相同的方法時,調用的會是子類中的方法,而不是父類的。 在Java中也能夠這麼說:編譯時看父類,運行時看子類。