(一)學習總結git
1.學習使用思惟導圖對Java面向對象編程的知識點(封裝、繼承和多態)進行總結。
編程
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(); } }
不能,構造函數調用必須是構造函數中的第一個語句,應把super()語句放在輸出語句以前。程序的運行結果爲:安全
GrandParent Created.String:Hello.Grandparent. Parent Created Child Created
之因此調用父類方法,就是要用父類的構造方法爲父類中的屬性初始化,就表示現有父類實例而後才能產生子類實例。eclipse
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(); } }
animal.sleep();有錯,父類不能夠調用子類的方法,Dog爲子類,父類轉爲子類需強制轉換。父類引用的對象是父類自己,在向下轉型的過程當中是不安全的,運行有錯。運行結果爲:學習
汪汪......! 狗狗睡覺......
正確程序爲:測試
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(); Dog dog = (Dog)animal; dog.sleep(); Animal animal2 = new Animal(); if (animal2 instanceof Dog){ dog = (Dog)animal2; dog.shout(); } } }
4.運行下列程序this
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)程序的運行結果以下,說明什麼問題?.net
Person@166afb3 Person@166afb3
隨機輸出了一些地址信息
(2)那麼,程序的運行結果究竟是什麼呢?利用eclipse打開println(per)方法的源碼,查看該方法中又調用了哪些方法,可否解釋本例的運行結果?
public void println(Object x) { String s = String.valueOf(x);//若是x爲空返回空,不爲空返回調用toString的內容 synchronized (this) { print(s); newLine(); } }
(3)在Person類中增長以下方法
public String toString(){ return "姓名:" + this.name + ",年齡:" + this.age ; }
從新運行程序,程序的執行結果是什麼?說明什麼問題?
結果爲:
姓名:張三,年齡:20 姓名:張三,年齡:20
子類覆寫了父類的toString()方法,直接輸出的是對象調用覆寫的toString()方法。
(二)實驗總結
實驗內容:
1.程序設計思路:程序設計思路:定義員工類,具定義屬性姓名、年齡、性別,定義每一個的setter、getter方法,定義管理層類繼承員工類,定義本身的屬性職務、年薪,定義職員類繼承員工類,定義本身的屬性所屬部門和月薪。在定義一個測試類,進行輸出測試
2.按照下面要求完成類的設計
程序設計思路:定義兩個抽象類,分別爲平面圖形抽象類(提供求該類對象周長和麪積的方法)和立體圖形抽象類(提供求該類對象表面積和體積的方法),再分別定義一個球類、圓柱類,圓錐類、矩形類、三角形類、圓類,分別繼承平面圖形抽象類和立體圖形抽象類。再定義一個測試類,對每一個類設置數據進行輸出。
問題1:在輸出的時候傳參都爲空
緣由:沒有把參數傳遞過去
解決方案:對每一個方法都定義爲有返回值的方法,而後傳參,就傳過去了。
3.程序設計思路:定義一個動物抽象類,定義一個eat()方法,分別定義獅子類,猴子類,鴿子類,繼承動物類,子類裏都定義有本身的屬性食物,再定義一個飼養員類,定義有本身的屬性姓名,和一個飼養動物的方法(用對象數組來完成),在定義一個測試類,下標來表示動物,定義其食物。
問題1:傳參爲空
緣由:將食物屬性放到了抽象類裏了
解決方案:分別在每一個類裏定義食物屬性,而後定義toString()方法來表示輸出內容。
(三)[代碼託管](https://git.oschina.net/hebau_cs15/Java-CS02yyh)
碼雲commit歷史截圖