《Java技術》第四次做業

(一)學習總結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歷史截圖

相關文章
相關標籤/搜索