今日主題: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失敗的例子:存取修飾子權限問題
存取修飾子不可比原來的父類別中的方法還嚴謹。
JAVA存取修飾子等級:
public > protected > default > private
♥父類別中的方法有宣告拋出例外類別,如要Override,必須遵守規則
子類別中的方法也拋出相同例外類別
或
該例外類別的子類別
或
不拋出例外
※寫圖形介面很常用到Abstract class 與 Abstract method。
2.每個概念都有自己的規則,每個規則又有諸多細項去涵括所有情況。
3.找到離上課地點最近的7-11了...
♦ override 與 overload 考題很常考,易混淆
存取修飾子不可比原來的父類別中的方法還嚴謹。
JAVA存取修飾子等級:
public > protected > default > private
♦cannot override
如果把子類別中錯誤的地方remark,則可以成功執行且 s.method1(10.5) 是使用繼承過來的父類別方法
♥方法有傳回值時,如果要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了...
沒有留言:
張貼留言