201521123010 《Java程序設計》第4周學習總結


  • 1.本周學習總結

    1.1 嘗試使用思維導圖總結有關繼承的知識點。

    1.2 使用常規方法總結其他上課內容。

這周上課主要學了繼承,在打代碼的時候對各個關鍵字(除了super關鍵字)的用法有一點混亂。對多態和繼承的區別也有點混淆,努力百度中。有時候上課感覺聽多了但一到打代碼就啥都不會了,可能是因為沒鞏固好。
  • 2. 書面作業

① 注釋的應用

  • 使用類的注釋與方法的注釋為前面編寫的類與方法進行注釋,並在Eclipse中查看。(截圖)


② 面向對象設計(大作業1,非常重要)

  • 2.1 將在網上商城購物或者在班級博客進行學習這一過程,描述成一個故事。(不得少於50字,參考QQ群中PPT的范例)

A:

用戶打開網頁登錄系統,瀏覽網頁所列出的商品,經過挑選點擊選擇滿意商品的數量與種類加入購物車。在購物車查看自己已選商品,確認數量與種類后點擊結算,付賬后系統將生成訂單。
  • 2.2 通過這個故事我們能發現誰在用這個系統,系統中包含的類及其屬性方法,類與類之間的關系。嘗試找到這些類與屬性,並使用思維導圖描述類、屬性、方法及類與類之間的關系。


③ ManagerTest.zip代碼分析

分析ManagerTest.zip中的代碼,回答幾個問題:

  • 3.1 在本例中哪里體現了使用繼承實現代碼復用?回答時要具體到哪個方法、哪個屬性。

A:

public Manager(String n, double s, int year, int month, int day)
   {
      super(n, s, year, month, day);
      bonus = 0;
   }

   public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }

用到了getSalary方法,n、s、year、month、day這幾個屬性。
  • 3.2 Employee類及其子類Manager都有getSalary方法,那怎么區分這兩個方法呢?

A:

   父類:
   public double getSalary()
   {
      return salary;
   }
   子類:
   public double getSalary()
   {
      double baseSalary = super.getSalary();
      return baseSalary + bonus;
   }

由程序可見,父類與子類方法不同的區別是子類會用super關鍵字來表示,故以此來區分父類與子類。
  • 3.3 文件第26行e.getSalary(),到底是調用Manager類的getSalary方法還是Employee類的getSalary方法。

A:

由以上截圖可以看出,此行的e.getSalary()是調用Employee類的方法`。
  • 3.4 Manager類的構造函數使用super調用父類的構造函數實現了代碼復用,你覺得這樣的有什么好處?為什么不把父類構造函數中的相關代碼復制粘貼到Manager的構造函數中,這樣看起來不是更直觀嗎?

A:

自己覺得實現代碼復用可以省點事,但查了一下百度,得知了:重新使用已有代碼可以降低成本、增加代碼的可靠性並提高它們的一致。既然如此,有了更高效的方法可以實現低成本,那如果再復制粘貼浪費空間,是沒有必要的。

④ Object類

  • 4.1 編寫一個Fruit類及屬性String name,如沒有extends自任何類。使用System.out.println(new Fruit());是調用Fruit的什么方法呢?該方法的代碼是從哪來的?嘗試分析這些代碼實現了什么功能?

A:

package ex2;
class Fruit{         //定義類為Fruit
  private String name;  //定義這個類的私有屬性name(名字)
}
public class test201{
  public static void main(String[] args){  //main函數,程序運行的入口。
  System.out.println(new Fruit());
  }
}
由於沒有extends自任何類,故默認繼承了Object為父類,並調用了Fruit的toString()方法。

顯示如下:

  • 4.2 如果為Fruit類添加了toString()方法,那么使用System.out.println(new Fruit());調用了新增的toString方法。那么其父類中的toString方法的代碼就沒有了嗎?如果同時想要復用其父類的toString方法,要怎么操作?(使用代碼演示)

A:

package ex2;
class Fruit{         //定義類為Fruit
  private String name;  //定義這個類的私有屬性name(名字)

@Override
public String toString() {      //調用toString()方法
	return "I'M A Mango";
}
  
}
public class test201{
  public static void main(String[] args){  //main函數,程序運行的入口。
  System.out.println(new Fruit());
  }
}

調用了新增的toString方法后,其父類中的toString方法的代碼不會沒有。
若同時想用復用父類的方法,只要結合super關鍵字來復用即可。如return ""I'M A Mango" + super.toString();

顯示結果如下:

  • 4.3 Fruit類還繼承了Object類的eqauls方法。嘗試分析其功能?自己編寫一個equals方法覆蓋父類的相應方法,功能為當兩個Fruit對象name相同時(忽略大小寫),那么返回true。(使用代碼證明你自己覆蓋的eqauls方法是正確的)

A:

public boolean equals(Object obj) {
    return (this == obj);
}
功能如下:

package ex2;
class Fruit{         //定義類為Fruit
  private String name;  //定義這個類的私有屬性name(名字)

  public Fruit(String name){
	  this.name =  name;
  }
  @Override
  public String toString() {
	return "I'M A Mango";
  }
  public boolean equals(Object obj) {
  if(this == obj)
    return true;
  if(obj == this)
    return false;
  
  return true;
  }
}

public class test201{
  public static void main(String[] args){  //main函數,程序運行的入口。
	  Fruit a = new Fruit("I'M A Mango");
	  Fruit b = new Fruit("I'M A mango");
	  
          System.out.println(a.equals(a));
          System.out.println(a.equals(b));
  }

}
運行結果如下:

  • 4.4 在4.3的基礎上使用ArrayList fruitList存儲多個fruit,要求如果fruitList中已有的fruit就不再添加,沒有的就添加進去。請編寫相關測試代碼。並分析ArrayList的contatins方法是如何實現其功能的?

A:

可以將其主函數改為如上圖:


可以看一下ArrayList的contatins方法的源代碼為:
public boolean contains(Object o) {
    return indexOf(o) >= 0;
    }
 public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = 0; i < size; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }
 public boolean equals(Object obj) {
    return (this == obj);
    }

可以發現在contains方法會調用o.equals(elementData[i])方法來比較兩個對象的引用是否相同。故功能是以此來實現的。



⑤ 代碼閱讀:PersonTest.java(abstract、多態)

  • 5.1 畫出類的繼承關系

A:

  • 5.2 讀懂main函數,將自己推測的出代碼運行結果與真正運行結果進行比較。嘗試分析原因

A:

會顯示為:
Manager [bonus=12000.3, toString()=Employee [salary=90000.1, toString()=Person [name=Clark, adress=GE, phonenumber=111, email=111@mail.com, age=10, gender=mail]]]
Student [status=1, toString()=Person [name=wang, adress=110, phonenumber=15959, email=15959@163.com, age=18, gender=male]]
Employee [salary=1000.0, toString()=Person [name=zhang, adress=136, phonenumber=1360, email=1360@mail.com, age=21, gender=female]]
Programmer [allowance=50000.0, toString()=Employee [salary=100000.0, toString()=Person [name=Gates, adress=usa, phonenumber=911, email=911@com, age=59, gender=male]]]

可以看出:繼承了Person類的Student類和Employee類比繼承了Employee類的Manager類和Programmer類少了一層嵌套。因為Employee類在被繼承前也繼承了Person類,故出現此結果。
  • 5.3 子類中里面使用了super構造函數,作用是什么?如果將子類中的super構造函數去掉,行不行?

A:

作用是引用當前對象的直接父類中的成員。不知道答案,故查詢了一下之后總結出:其實可以不用顯式的寫出super,但前提是“超類中有多個構造方法,且有一個是顯式寫出的無參的構造方法”。但此代碼中沒有類符合條件,故不可以。
  • 5.4 PersonTest.java中的代碼哪里體現了多態?你覺得多態有什么好處?多態和繼承有什么關系嗎?

A:

for (Person person : peoples) {
     System.out.println(person);
     }
在代碼里這里體現了多態。

百度到了比較具體完整的答案:多態對已存在的代碼具有可替換性、可擴充性、接口性、靈活性、簡化性,可以增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。也在應用中體現了靈活多樣的操作,提高了使用效率。並且簡化了對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時可以看出其優點。
我認為,多態最大的好處對於現在我們來說應該是其靈活性比較強,並且比較簡便,在編寫多態方法時,所有重載的方法所執行的目的是相同的,但其參數也許不同。所以可以屏蔽不同子類對象之間的差異,寫出通用的代碼以適應需求的不斷變化。  

  • 3. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然后搜索並截圖


  • 4. PTA實驗

題目集:jmu-Java-03-面向對象1-基礎-封裝繼承 中的
函數(4-1, 4-2, 4-3,4-4較難選做)
編程(5-4, 5-5, 5-6)
一定要有實驗總結

5-4

發現對於子類的一些定義不是很清楚,一邊搜索一邊打代碼,有時對於類與類的調用會由混淆。

5-5

這道會比5-4簡單一些,按照題目要求寫即可。

5-6

一看題目就比較復雜,還在寫。。對ArrayList之類的實在不熟悉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM