java第四次做業

《Java技術》第四次做業

(一)學習總結

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.員工類

  • 程序設計思路:定義員工類,編寫構造方法,添加屬性,姓名,性別,年齡,添加get和set方法。定義管理層類,繼承員工類,添加屬性職務和年薪,添加get和set方法。定義職員類,繼承員工類,添加屬性所屬部門和月薪,添加get和set方法。定義一個測試類,給以上屬性進行賦值,並輸出。
  • 類圖

2.計算類

  • 程序設計思路:設計一個平面圖形抽象類,添加屬性周長和麪積,添加get和set方法,提供求該類對象周長和麪積的方法,設計一個立體圖形,添加屬性表面積和體積,添加get和set方法,抽象類提供求該類對象表面積和體積的方法。設計球類、圓柱類,圓錐類、矩形類、三角形類、圓類,分別繼承平面圖形抽象類和立體圖形抽象類,每一個類都要添加屬性,並對平面圖形抽象類和立體圖形抽象類的抽象方法進行覆寫。創建測試類,給以上屬性進行賦值,分別輸出他們周長,面積,表面積,體積。
  • 類圖

3.餵養類

  • 程序設計思路:(1)設計一個獅子類,有個吃的方法。設計一個猴子類,有個吃的方法。設計一個鴿子類,有個吃的方法。設計一個飼養員類,添加屬性姓名,編寫方法,喂獅子,喂猴子,喂鴿子。
  • 不合理的地方:若是想再添加一種動物,就要在添加一個類,修改太過麻煩,執行效率低。
  • 程序設計思路:(2)設計一個動物類,編寫獅子類,猴子類,鴿子類,繼承動物類。對(1)的飼養員類的方法進行合併,只生成一個動物類的對象。
  • 程序設計思路:(3)對(2)中的feedAnimals方法進行修改,讓它接收一個Animal數組。
  • 多態的好處:能夠提升的代碼的擴展性。好比本題,能夠接受父類對象,傳遞子類實例實現向上轉型。

(三)代碼託管

  • 碼雲commit歷史截圖

(四)學習進度條

代碼行數(新增/累積) 學習時間(新增/累積) 本週學習內容
目標 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 繼承和多態,抽象方法
相關文章
相關標籤/搜索