21045234黃斐《java程序設計》第四周


教材學習內容總結

第六章部分 - 繼承與多態

何謂繼承

  • 繼承
    面向對象中,子類繼承父類,避免重復的行為定義。一般來說,父類的父類也稱父類,且同一個子類只允許擁有一個父類,而同一個父類則可以擁有多個子類。繼承的出現提高了代碼的復用性,也讓類與類之間產生了關系,提供了多態的前提。

  • 在Java中,使用關鍵字extends來表示類與類之間的繼承關系:public class SwordsMan extendsRole 中類SwordsMan繼承了類Role,類SwordsMan擴充了類Role的行為,也就是類Role中有定義的程序代碼,類SwordsMan因為繼承而都擁有了。

  • IS-A
  • IS-A譯為“是一種”,子類與父類就是一種“IS-A”的關系。
    • 注意建立對象時候的順序,應該遵守從右往左讀的原則(這樣才符合IS-A原則):

      Role role1 = new SwordsMan();
      Role role2 = new Magician();
    • 賦值時:如果用父類建立了一個對象實例,那么要將這個對象賦給它的子類時,需要進行強制轉:

      Role role1 = new SwordsMan();
      SowrdsMan swordsMan = (SwordsMan) role1;
    • 我們還可以使用instanceof來判斷IS-A關系:

      System.out.println(SwordsMan instanceof Role); \\輸出true
      System.out.println(Role instanceof SwordsMan); \\輸出false
  • 多態
    按照字面的意思上說,就是多種狀態。指的是使用一個接口,操作多種類型的數據。

  • 覆蓋(Override)
    • 一般來說,當子類和父類具有一模一樣的方法時,會出現覆蓋操作,也就是重新定義行為。因為子類一般來說都有其獨特的功能,父類一般的函數定義不能滿足每個不同角色的需要。
    • 函數的覆蓋也更好的體現了面向對象的多態性。
    • 要將覆蓋(Override)與重載(Overload)區分開:覆蓋除了保留了原有的相同方法部署,但執行內同不同,方法是一樣的;而重載指的是函數名相同,但調用變量的類型個數都不同,是不同的函數,並不存在某個函數把某個函數覆蓋的情況。
    • 注意:
  •       在重新定義父類中的某個方法時,除了可以定義權限較大的關鍵字外,子類必須撰寫與父類方法中相同的簽 署。如果函數名打錯了,那就不是重新定義了,而是子類新定義了一個方法函數。
    1. 通常,我們會在子類中重新定義行為前加上\@Override,用以判斷該方法是否真的重新定義了父類中的一個方法。
    2. 重新定義方法時,對於父類中的方法權限,只能擴大不能縮小。
  • 抽象方法、抽象類
    • abstract:對於一個類的方法區塊中實際上沒有撰寫任何程序代碼,為了避免不被漏掉,可以使用abstract標示該方法為抽象方法。該方法不用撰寫{}區塊,直接“;”結束即可。
    • 注意:
    1. Java中有抽象方法的類一定是抽象類,但抽象類中的方法不一定都是抽象方法。
    2. 象類,但抽象類中的方法不一定都是抽象方法
  • Square(正方形)類繼承Rectangle(矩形)類合適嗎?
    合適,因為正方形是一種(IS-A)矩形,它擁有矩形的一般特點。

繼承語法細節

  1. protected成員:被聲明為protected的成員,相同包中的類可以直接存取,不同包中的類可以在繼承后的子類直接存取。
  2. 重新定義的細節:在調用方法前加上super關鍵字,重新定義父類中的方法在子類中權限只能擴大不能縮小,在jdk5之后返回類型也可以是父類中方法返回類型的子類。
  3. 構造函數。
  4. 垃圾收集:對於不再有用的對象,JVM的垃圾收集器會將其釋放。不同的需求會有不同的垃圾收集算法。
  5. 抽象類:如果還有些方面沒有確定,可以調用抽象方法,等到平台確定后,再對代碼進行符合這個平台的完善就行。
    public class Role1{
    private String name;
    private int level;
    private int blood;

第七章部分 - 接口與多態

何謂接口

  • 接口定義行為
    • 對於定義行為,Java中可以使用interface關鍵字定義。
    • 是一種特殊的類,里面全部是由全局常量(static final)和公共的抽象方法所組成。
    • 接口的數據成員,只允許被public, static, final修飾。
      接口的方法成員,只允許被public, abstract修飾。
    • 接口中的數據成員都為static final類型,必須進行初始化,且接口的數據成員的值不能被修改,允許省略static, final關鍵字。
    • 接口中的方法必須是“抽象方法”,不能有方法體,允許省略public及abstract關鍵字。
    • 對於接口多態語法的判斷,方式是“右邊是不是擁有左邊的行為”,或者“右邊對象是不是操作了左邊接口”。
  • implements
    • 接口不能用new運算符直接產生對象,必須利用其特性設計新的類,再用新類來創建對象與抽象類一樣,接口要使用也必須通過子類,子類通過implements關鍵字實現接口。
    • 操作某接口時,對接口中定義的方法有2種處理方式,一是操作接口中定義的方法,二是再度將該方法標示為abstract.
    • 實現格式:

      class 子類名稱 implements 接口A,接口B,….{
      //子類成員聲明
      }
  • 解決需求變更
    需求會不斷變化,架構也有可能因此而修改。好的架構在修改時,其實也不會全部的程序代碼都被牽動,這就是設計的重要性。一般來說,會確定一個程序的需求邊界,然后設計好架構,接着就是不斷朝着這個方向進行優化。

接口語法細節

  • 接口中的public abstract可以省略,但要注意:接口中的方法必須是“抽象方法”,不能有方法體,允許省略public及abstract關鍵字。
  • 接口中可以使用extends繼承接口,並且可以繼承多個接口
    • 接口不能繼承一個抽象類,卻可以通過extends同時繼承於多個接口。
    • 例如:interface A extends B, C{……}
  • 匿名內部類
    • 匿名內部類也就是沒有名字的內部類。正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫,但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口。
    • JDK8 前在匿名內部類中訪問局部變量,則該局部變量必須為final
  • enum
    • 可以用於定義常量,例如:

      public enum Color { 
      RED, GREEN, BLANK, YELLOW
      }
    • 可以用於switch語句,將enum定義的枚舉常數用以switch判斷選擇。

考試錯題解析

1. 填空:Linux Bash中,(grep )命令可以進行全文搜索。
4.填空:System.out.println(“”+52+25);的結果是(5225)
5.填空:System.out.println(52+25+””);的結果是(77)
8.CH04 填空:p86 命令行下編譯Guess.java的命令是(javac -d . Guess.java)
9.CH04 判斷:p86 Guess.java中guess的值無法輸入12。(X)
11.CH04 判斷: Java中,=與==並沒有在基本類型和類類型的不同。(OK)
14.CH04 填空:Java中的多維數組都是由(一維數組組成)。
16.CH04 填空:p104 CopyArray.java 中修改int [] scores2 = Arrays.copyOf(scores1, scores1.length,使得輸出的第二行只有前五個元素,修改后的代碼為(int [] scores2 = Arrays.copyOf(scores1, scores1.length/2) 或int [] scores2 = Arrays.copyOf(scores1, 5) )
24.CH05 判斷:Java中類總會有默認構造方法。(X)
29.CH05 填空:Java中成員方法中引用成員變量,要使用(this)關鍵字。
32.CH05 判斷:Java中方法內可以定義類。(OK)

學習進度表

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: