<>第四次做業

(一)學習總結

1.學習使用思惟導圖對Java面向對象編程的知識點(封裝、繼承和多態)進行總結
java

2.閱讀下面程序,分析是否能編譯經過?若是不能,說明緣由。應該如何修改?程序的運行結果是什麼?爲何子類的構造方法在運行以前,必須調用父 類的構造方法?能不能反過來?git

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();
    }
}

不能經過編譯會提示錯誤:構造函數調用必須是構造函數中的第一個語句
算法

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("動物叫!");
      }
    public void sleep() {   // TODO 自動生成的方法存根   
    }
    }
    class Dog extends Animal{
          public void shout(){  
              System.out.println("汪汪......!");  
         }
          public void sleep() {
           System.out.println("狗狗睡覺......");
          } 
    }
public class Test2 {
    public static void main(String args[]) {
        Animal animal = new Dog(); 
        animal.shout();
        animal.sleep();
        Dog dog = (Dog) animal;
        dog.sleep(); 
        Animal animal2 = new Animal();
        dog = (Dog)animal2;
        dog.shout();
    }
}

程序中的問題及緣由:
沒有爲類型 Animal 定義方法 sleep()
類型不匹配:不能從 Animal 轉換爲 Dog
正確程序運行的結果爲:eclipse

汪汪......!
狗狗睡覺......
狗狗睡覺......

4.運行下列程序
(1)程序的運行結果以下,說明什麼問題?函數

做業練習.Person@4b61fc
做業練習.Person@4b61fc

說明調用出錯,程序只是隨機輸出了一些地址信息,對象輸出時必定會調用Object類中的toString方法打印內容,憑此特性能夠經過toString()取得一些對象信息。
(2)那麼,程序的運行結果究竟是什麼呢?利用eclipse打開println(per)方法的源碼,查看該方法中又調用了哪些方法,可否解釋本例的運行結果?
程序運行結果只是隨機輸出了一些地址信息,該方法中調用了toString()方法;
(3)在Person類中增長以下方法工具

public String toString(){ 
        return "姓名:" + this.name + ",年齡:" + this.age ; 
 }

從新運行程序,程序的執行結果是什麼?說明什麼問題?
可參考教材P229學習

姓名:張三,年齡:20

說明程序的Person類中賦寫了Object類中的toString方法,這樣直接輸出對象時調用的是被子類賦寫過的toString方法。
5.其餘須要總結的內容。
我把一些我認爲重要的零散的知識點總結了一下
Integer在Java中屬於包裝類,對於Integer可使用MAX_VALUE取得其最大值,也能夠經過MIN_VALUE取得其最小值,Intager的最大做用在於字符串與整型的轉換上,還具備自動拆箱和裝箱的功能;
布爾類型 boolean flag=ture;聲明布爾變量flag,並賦值爲true;
經過三目運算符求最大值:max=x>y?x:y;
用while和do...while循環操做時不必定明確知道循環次數;若明確知道循環次數能夠用for循環;
遞歸調用時必須有一個明確的結束條件,而後不斷改變傳入的數據,才能夠實現遞歸調用;
使用Java提供的排序操做:java.util.Arrays.sort(數組名);
對象使用前必須實例化;
只要被封裝的屬性,必須經過setter和getter方法設置和取得;
每一個構造方法的參數類型或參數個數不一樣構造方法可實現重載;
判斷兩個字符串相等的方法:利用String類中的equals();
字符串的內容不能夠改變;
使用String的replaceAll方法能夠將字符串的指定內容進行替換;
無參構造方法中最好不要調用其它構造方法;測試

(二)實驗總結

1.1.定義員工類,具備姓名、年齡、性別屬性,並具備構造方法和顯示數據方法。定義管理層類,繼承員工類,有本身的屬性職務和年薪。定義職員類,繼承員工類,並有本身的屬性所屬部門和月薪。定義一個測試類,進行測試。畫出類圖。
工具:ProcessOn
參考資料:UML 類圖

  • 程序設計思路:定義不一樣的類,在類裏封裝各自的屬性。
    我是參照老師講義和書上的例題寫的程序,沒有碰見問題。只是測試類中實例化時的格式寫錯了,必定多注意格式。
    類圖爲:

2.按照下面要求完成類的設計
(1)設計一個平面圖形抽象類(提供求該類對象周長和麪積的方法)和一個立體圖形抽象類(提供求該類對象表面積和體積的方法)
(2)設計球類、圓柱類,圓錐類、矩形類、三角形類、圓類,分別繼承平面圖形抽象類和立體圖形抽象類。
(3)創建測試類,進行測試。畫出類圖。

  • 程序設計思路:對類裏的屬性封裝,在getter方法裏設置求體積面積的算法,測試類中我只寫了對球體積的測試。
    -遇到的問題:在屬性中我將體積面積都定義爲double型
public double getBallv(){
        ballv=1.33*PI*r*r*r;
        return ballv;
    }

輸出結果有多位小數
球的體積爲112.75740000000002球的表面積爲:113.039 解決方法:用Java中的String.format(%.2f)保留兩位小數。
類圖爲:

3.. 參考類圖,重構下面的實例,分析和理解多態的含義和用途
(1)某動物園有一飼養員小李,天天須要給他所負責飼養的一隻獅子、五隻猴子和十隻鴿子餵食。 請用一個程序來模擬他餵食的過程。分析這種編程方式有什麼不合理的地方。
程序中重複的代碼不少,能夠優化程序.建立動物類,

(2)第一次重構,引入繼承,利用抽象類和對象多態重構程序,Animal類採用抽象類, 合併Feeder類中的方法分析程序是否還能夠進一步優化
程序能夠優化在抽象類中我定義了動物的屬性和方法,子類中覆寫了抽象類中的方法.在測試類中實例化子類的對象.
(3)第二次重構,修改feedAnimals方法,讓它接收一個Animal數組經過本題的重構,說一下多態有什麼好處。在第二次重構以後,是否就能應對各類場景了呢?你認爲還應該作哪些優化?
數組是個人弱處,在數組的定義處就遇到了問題,傳參時數組傳遞出錯,所以第三個程序沒有改完.
多態的好處:提升了代碼的擴展性;
提升了代碼的維護性;
優化:若是餵養了多隻某種動物每次不只要建立對象還得寫多個調用方法,而調用方法僅僅是對象名不同;

(三)代碼託管

  • 碼雲commit歷史截圖
相關文章
相關標籤/搜索