1.1 嘗試使用思惟導圖總結有關繼承的知識點。
java
1.2 使用常規方法總結其餘上課內容。編程
多態性的應用:數組
instanceof運算符: 經過 instanceof判斷父類引用所引用的對象實例的實際類型;將父類強制轉換成子類以前,應使用instanceof進行檢查或說判斷。app
動態綁定:運行時可以自動地選擇調用哪一個方法。ide
Q1.註釋的應用函數
使用類的註釋與方法的註釋爲前面編寫的類與方法進行註釋,並在Eclipse中查看。(截圖)學習
類註釋方法:測試
/**網站
.......註釋的內容ui
/
方法註釋:
Q2.面向對象設計(大做業1,很是重要)
2.1 將在網上商城購物或者在班級博客進行學習這一過程,描述成一個故事。
在京東購買耳機。打開京東購物網站,在搜索欄中輸入關鍵字「耳機」。進一步進行精確篩選例如品牌、佩戴方式、功能用途等。肯定搜索範圍以後可選擇按照綜合、銷量、評論、新品和價格這幾種方式排序查看商品。找到滿意的商品,點擊查看詳細信息,想要購買就點擊「加入購物車」,最後在個人購物車中進行商品結算。
2.2 經過這個故事咱們能發現誰在用這個系統,系統中包含的類及其屬性方法,類與類之間的關係。嘗試找到這些類與屬性,並使用思惟導圖描述類、屬性、方法及類與類之間的關係。
2.3 嘗試使用Java代碼實現故事中描述的這一過程(沒必要很完善),未來要在這個基礎上逐漸完善、擴展成一個完整的面向對象的系統。(可選:加分)
參考資料:
UML類圖
面向對象案例-借款者姓名地址.zip
Q3.ManagerTest.zip代碼分析
分析ManagerTest.zip中的代碼,回答幾個問題:
3.1 在本例中哪裏體現了使用繼承實現代碼複用?回答時要具體到哪一個方法、哪一個屬性。
public Employee(String n, double s, int year, int month, int day)//父類Employee的函數 { name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireDay = calendar.getTime(); } public double getSalary()//父類Employee的函數 { return salary; } public Manager(String n, double s, int year, int month, int day)//子類Manager中的函數 { super(n, s, year, month, day); bonus = 0; } public double getSalary()//子類Manager中的函數 { double baseSalary = super.getSalary(); return baseSalary + bonus; }
可見Manager類中,super(n, s, year, month, day)
是利用關鍵字super來調用父類的構造函數對自身進行初始化,複用了name、salary、year、month、day這五個屬性;double baseSalary = super.getSalary()
也是調用父類方法。
3.2 Employee類及其子類Manager都有getSalary方法,那怎麼區分這兩個方法呢?
答:若是有重寫父類的方法,調用方法是子類的,若是調用父類的須要使用關鍵字super.方法。
3.3 文件第26行e.getSalary(),究竟是調用Manager類的getSalary方法仍是Employee類的getSalary方法。
答:Employee類的方法
3.4 Manager類的構造函數使用super調用父類的構造函數實現了代碼複用,你以爲這樣的有什麼好處?爲何不把父類構造函數中的相關代碼複製粘貼到Manager的構造函數中,這樣看起來不是更直觀嗎?
答:子類調用父類的構造方法,可減小代碼量,也更簡潔。
Q4.Object類
4.1 編寫一個Fruit類及屬性String name,如沒有extends自任何類。使用System.out.println(new Fruit());是調用Fruit的什麼方法呢?該方法的代碼是從哪來的?嘗試分析這些代碼實現了什麼功能?
import java.util.*; class Fruit{ private String name; } public class Main { public static void main(String[] args) { System.out.println(new Fruit()); } }
結果:Fruit@15db9742。
java中,每一個類都是Object的子類,而Object有個toString方法。
在你的代碼中,你直接打印了一個類,他會調用這個類的toString方法,若是你不覆蓋這個方法,它就調用Object的toString方法,結果默認是這個類的類型加上內存的地址。
4.2 若是爲Fruit類添加了toString()方法,那麼使用System.out.println(new Fruit());調用了新增的toString方法。那麼其父類中的toString方法的代碼就沒有了嗎?若是同時想要複用其父類的toString方法,要怎麼操做?(使用代碼演示)
父類toString方法仍然存在,若是想要複用其父類的toString方法,用super.調用方法便可。代碼以下:
import java.util.*; class Fruit{ private String name; public String toString() { return "name "+super.toString(); } } public class Main { public static void main(String[] args) { System.out.println(new Fruit()); } }
輸出結果爲:name Fruit@15db9742
4.3 Fruit類還繼承了Object類的equals方法。嘗試分析其功能?本身編寫一個equals方法覆蓋父類的相應方法,功能爲當兩個Fruit對象name相同時(忽略大小寫),那麼返回true。(使用代碼證實你本身覆蓋的eqauls方法是正確的)
Object的equal類比較兩個變量在內存中的指針指向是否相同,即比較二者是否爲「同一個」。
class Fruit{ private String name; Fruit(String name){ this.name=name; } @Override public String toString() { return "name "+super.toString(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Fruit other = (Fruit) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } public class Main { public static void main(String[] args) { Fruit fruit1=new Fruit("apple"); Fruit fruit2=new Fruit("apple"); Fruit fruit3=new Fruit("watermelon"); System.out.println(fruit1.equals(fruit2)); System.out.println(fruit1.equals(fruit3)); } }
運行結果爲:
true
false
4.4 在4.3的基礎上使用ArrayList
Q5.代碼閱讀:PersonTest.java(abstract、多態)
參考文件:PersonTest.java
5.1 畫出類的繼承關係
5.2 讀懂main函數,將本身推測的出代碼運行結果與真正運行結果進行比較。嘗試分析緣由
運行結果如圖:
Person類被abstract修飾,是一個抽象類,抽象類不能被直接實例化,只能做爲其它類的父類。剩下的四個類中,Employee和Student類繼承Person類的輸出格式是輸出本身特有的屬性,而後調用父類的toString()方法;Manager和Programmer繼承Employee類,因此它們的輸出格式有兩次嵌套
5.3 子類中裏面使用了super構造函數,做用是什麼?若是將子類中的super構造函數去掉,行不行?
(1)子類中裏面使用了super構造函數,做用是調用父類的構造方法.
(2)若是將子類中的super構造函數去掉,則編譯時會調用父類無參構函數。編譯出錯。
5.4 PersonTest.java中的代碼哪裏體現了多態?你以爲多態有什麼好處?多態和繼承有什麼關係嗎?
(1)首先每一個類中都用了toString()方法,但輸出結果都不相同;其次子類類型的引用變量便可以引用本類對象,也可引用父類對象。 (2) 把不一樣的子類對象都看成父類來看,能夠屏蔽不一樣子類對象之間的差別,寫出通用的代碼,作出通用的編程,以適應需求的不斷變化。 賦值以後,父對象就能夠根據當前賦值給它的子對象的特性以不一樣的方式運做。
(3)多態與繼承、重載並非孤立的,他們之間存在着緊密的聯繫,多態是創建繼承、重載這二者的基礎之上。多態應用的三個條件:繼承、子類對象指向父類引用、重寫。
題目集:jmu-Java-03-面向對象1-基礎-封裝繼承 中的
函數(4-1, 4-2, 4-3,4-4較難選作)
編程(5-4, 5-5, 5-6)
必定要有實驗總結
本次的收穫:
4-1:用super關鍵字調用父類方法。
4-3:運用DecimalFormat方法保留小數、重寫equal方法。
5-4:用abstract修飾類,經過繼承的關係來實現代碼的複用。
5-5:重寫equals判斷對象是否在數組中存在。