1.學習使用思惟導圖對Java面向對象編程的知識點(封裝、繼承和多態)進行總結。
封裝java
繼承git
多態編程
2.閱讀下面程序,分析是否能編譯經過?若是不能,說明緣由。應該如何修改?程序的運行結果是什麼?爲何子類的構造方法在運行以前,必須調用父類的構造方法?能不能反過來?數組
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { System.out.println("Parent Created"); super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } } public class Test{ public static void main(String args[]) { Child c = new Child(); } }
不能。構造函數調用必須是構造函數的第一個語句。
修改:eclipse
class Parent extends Grandparent { public Parent() { super("Hello.Grandparent."); System.out.println("Parent Created"); } }
運行結果函數
GrandParent Created.String:Hello.Grandparent. Parent Created Child Created
緣由:
構造一個對象,先調用其構造方法,來初始化其成員函數和成員變量。子類擁有父類的成員變量和成員方法,若是不調用,則從父類繼承而來的成員變量和成員方法得不到正確的初始化。
不能反過來調用也是這個緣由,由於父類根本不知道子類有什麼變量,並且這樣子類也得不到初始化的父類變量,致使程序運行出錯!學習
3 . 閱讀下面程序,分析程序中存在哪些錯誤,說明緣由,應如何改正?正確程序的運行結果是什麼?測試
class Animal{ void shout(){ System.out.println("動物叫!"); } } class Dog extends Animal{ public void shout(){ System.out.println("汪汪......!"); } public void sleep() { System.out.println("狗狗睡覺......"); } } public class Test{ public static void main(String args[]) { Animal animal = new Dog(); animal.shout(); animal.sleep(); Dog dog = animal; dog.sleep(); Animal animal2 = new Animal(); dog = (Dog)animal2; dog.shout(); } }
錯誤:this
animal.sleep(); Dog dog = animal; Animal animal2 = new Animal();
緣由:Animal中沒有sleep方法,不能從Animal轉換爲Dog。animal2對象與dog對象未創建好關係,應在聲明父類對象animal2時先發生向上轉型關係。
修改以下:.net
class Animal{ void shout(){ System.out.println("動物叫!"); } public void sleep() { System.out.println("狗狗睡覺......"); } } class Dog extends Animal{ public void shout(){ System.out.println("汪汪......!"); } public void sleep() { System.out.println("狗狗睡覺......"); } } public class Test1{ public static void main(String args[]) { Animal animal = new Dog(); animal.shout(); animal.sleep(); Dog dog = (Dog) animal; dog.sleep(); Animal animal2 = new Dog(); dog = (Dog)animal2; dog.shout(); } }
運行結果
汪汪......! 狗狗睡覺...... 狗狗睡覺...... 汪汪......!
4.運行下列程序
class Person { private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } } public class Test{ public static void main(String args[]){ Person per = new Person("張三",20) ; System.out.println(per); System.out.println(per.toString()) ; } }
(1)程序的運行結果以下,說明什麼問題?
Person@166afb3 Person@166afb3
說明不管是否調用toString方法,都會輸出,並且輸出的是隨機地址。
(2)那麼,程序的運行結果究竟是什麼呢?利用eclipse打開println(per)方法的源碼,查看該方法中又調用了哪些方法,可否解釋本例的運行結果?
println(per)方法的源碼
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
又調用了valueOf方法、newLine()方法
解釋:per在輸出時先運行了valueOf,接着輸出per.toString()時,直接就把上面的進行輸出了。
(3)在Person類中增長以下方法
public String toString(){ return "姓名:" + this.name + ",年齡:" + this.age ; }
從新運行程序,程序的執行結果是什麼?說明什麼問題?
姓名:張三,年齡:20 姓名:張三,年齡:20
說明,object中自己就有一個toString方法,若是不在題中寫toString方法,就會調用默認的方法。
1.員工類
2.計算類
3.餵養類
代碼行數(新增/累積) | 學習時間(新增/累積) | 本週學習內容 | |
---|---|---|---|
目標 | 5000行 | 300小時 | |
第2-4周 | 100/100 | 20/20 | 學習了數組和方法 |
第5周 | 200/300 | 30/50 | 學習了String類和StringBuffer類 |
第6周 | 800/1100 | 40/90 | 學習了this、static關鍵字,Singleton模式 |
第八週 | 1200/1700 | 60/110 | 繼承和多態,抽象方法 |