2015年1月18日 星期日

JAVA7-課程6

  今天課程內容非常豐富,腦袋快要運作不過來了!
  今日主題:1.Encapsulation(封裝)
                      2.Inheritance(繼承)
                      3.Override(覆蓋、覆寫、遮蔽) 與 Overload(多載)
                      4.Abstract class(抽象類別) 與 Abstract method(抽象方法)
  JAVA是屬於物件導向的語言,今日老師說明了這點:「所有的類別都有一個根(Root),那就是Object」。


  ♠Encapsulation(封裝):
    目的:保護重要的屬性變數或副程式。(讓外部程式不可隨意存取)
    方法:將變數或副程式宣告為private(私有)。
    開發:有限度的開放被保護的屬性變數或副程式。
                getter 取值        
                setter 設值
getter及setter必須達到以下的功能:
1.檢查值的合法性(有效性)。
2.檢查安全性。
     例子:銀行帳戶的金額 存款 取款
  ♥將變數宣告為private。(矩形)
♦在設值的副程式 setLen 與 setWidth裡
檢查值的合法性 或 有效性
♦直接取len的值時,編譯時會出錯。
因為len被設置為private,不能被外部程式使用。

♦complier error

  ♥所以要用副程式設值與取值
♦使用副程式取值

   ♥老師的講解
♦程式碼與解析
 ♦記憶體的配置方式

  ♥封裝的練習(BMI)



  ♠Inheritance(繼承) :
      superclass:父類別
      subclass:子類別
      目的:不開發重複功能的程式碼
      方法:使用extends關鍵字。例如:子類別  extends  父類別
      開發:子類別在使用時,會去呼叫父類別的建構子。
          其呼叫原則為 
          1.如果未特別告知,則會去呼叫父類別的預設建構子。
          2.如果有撰寫super關鍵字,則看super如何撰寫。

      兩個關鍵字的用法(this、super):
          ♣呼叫自己類別的建構子:this() 只能寫在建構子的第一行
                ♣呼叫自己類別的屬性變數:this.屬性變數
                ♣呼叫自己類別的方法:this.方法()

                ♣呼叫父類別的建構子:super() 只能寫在建構子的第一行
                                                    如果子類別想要同時呼叫自己的與父親的建構子,
                                                            其寫法必須先呼叫自己的建構子,
                                                            再由自己的其他建構子去呼叫父親的建構子。
                ♣呼叫父類別的屬性變數:super.屬性變數
          ♣呼叫父類別的方法:super.方法()

   ♥測試繼承的呼叫方式與結果呈現


  ♥Father類別中,未寫預設建構子
    ♦只要有寫任何一個建構子
      javac就不會幫你寫
      預設建構子public Father(){}
    (預設建構子:小括弧不寫任何參數)
  ♦complier error
    Son類別會去呼叫Father類別中的預設建構子
    但Father類別沒有預設建構子可以呼叫
        
   ♥上一個例子,在Son類別中添加super(10);,則可成功執行。


  ♠Override(覆蓋、覆寫、遮蔽):
      目的:外部程式無法存取父類別中的方法
      原因:1.父、子類別中的計算公式不同
                  2.父類別中的方法,不符合子類別的需求
      方法:在子類別中,宣告一個與父類別同名的方法
  規則:

  ♥實作Override






  ♦ override 與 overload 考題很常考,易混淆

  ♥Override失敗的例子:存取修飾子權限問題
    存取修飾子不可比原來的父類別中的方法還嚴謹。
    JAVA存取修飾子等級:
    public > protected > default > private
             
 ♦cannot override
  如果把子類別中錯誤的地方remark,則可以成功執行且 s.method1(10.5) 是使用繼承過來的父類別方法


  ♥方法有傳回值時,如果要Override,必須遵守規則
    傳回值型態必須
    與父類別傳回值型態一致。
   或是
    原方法(父類別的方法)傳回值型別的子類別。


  ♥父類別中的方法有宣告拋出例外類別,如要Override,必須遵守規則
    子類別中的方法也拋出相同例外類別
   或
    該例外類別的子類別
   或
    不拋出例外
  ♦例外類別的繼承關係
  ♦實例:宣告拋出例外類別


  ♥繼承關係中,有一個觀念的考題
    is a(是一種)
    has a(有一個、擁有什麼)




  ♠Abstract class(抽象類別) 與 Abstract method(抽象方法)
    目的:父類別中的方法無法完美的給子類別中使用,導致每個子類別都必須要Override此方法時,父類別就乾脆什麼都不寫,只規定方法的格式。
     ※寫圖形介面很常用到Abstract class 與 Abstract method。
 ♦宣告不可以有任何程式碼,連{}都不可以出現
  修飾子abstract:不可寫在變數                    
  修飾子final:如果用在類別 -> 不可被繼承
                         方法 -> 不可被覆蓋
                         變數 -> 常數、值不可改變 
  ♥實例:
♦抽象物件要求"繼承";抽象方法要求"覆蓋"。
  程式看到abstract關鍵字,就不會載入記憶體,
  也就是說,無法使用這段程式碼,
  只能繼承或覆蓋來實踐。


作業:
  1.BMI跟NormalWeight使用繼承來寫
  2.火車過隧道使用abstract class 與 abstract method來寫

後記:
  1.原來繼承會衍生出許多的問題,而這些問題會有一些解決的方式,如覆蓋方法、抽象類別、抽象方法。
  2.每個概念都有自己的規則,每個規則又有諸多細項去涵括所有情況。
  3.找到離上課地點最近的7-11了...

沒有留言:

張貼留言