這個主題是在聖經本的第二章 - 物件導向 public class ExploitBadOO public class Box public int getSize() public void setSize(int newSize)
2.1 封裝
之所以先挑這一章起來念,是因為這一章所提及的名詞,是我之前最熟悉,卻又一知半解的部份。
先看看認證目標吧!
Exam Objective 5.1 -
在類別內實作封裝(Encapsulation)、鬆散偶合(loose coupling)、高內聚力(high cohesion),並敘述其好處。
首先,物件導向的好處為:具很高的彈性和可維護性。
這讓我想到在面試當天好人文問我的JAVA有什麼好處,我確只說了讓程式比較好寫,並且讓程式較淺顯易懂。但其實跟本就是這兩個特性就可概括一切了,可惜我當時腦袋空空如也無法出口成章,居然連API這麼重要的關鍵字都沒提到,真的是回答的很失敗呀!!<囧>
好,回到主題,書裡提第一個OO概念是 -- 封裝(Encapsulation)。我想他的精神就是將自己寫的class做一定的處理,增加其彈性與可維護性,若某天這個class被人廣為使用,並且出現一些問題時,不致於因為修改這個class的程式碼而使得別人的程式碼也得重新寫過,講白一點,封裝就是將class以API的方式呈現。
1、Concept - Keep instance variables protected (using private).
- 內部宣告public method並且強迫他人必須使用該method來存取
instance variable.
- 為了讓人方面使便(看得順眼?),通常會將這些public method 取名
為set<someproperty>和get<someproperty>,也就是getter和setter。
※ 讓使用者透過method存取instance variable而不是直接用object.instance variable
來直接存取,如此便能有效的保護instance variable。
EX : <<<<錯誤的寫法>>>>
public class BadOO
{
public int size;
public int weight;
...
}
{
public static void main (String [] args)
{
BadOO b = new BadOO();
b.size = -5; // Legal but bad!!
}
}
<<<<正確的寫法>>>>
{
private int size;
{
return size;
}
{
size = newSize;
}
}
2.2 繼承
有一句名言是這麼說的:在JAVA中,繼承無所不在。
沒錯,這是我掰的XD 但這也是事實!因為JAVA裡的每一個class都繼承自Object,就連我們自己寫的也不例外。所以我們寫的class永遠有equal、wait、clone、notify等method可以用,只是當我們沒有對這些method進行宣告且實作的話,有用就等於沒用一樣XD
1、為什麼要使用繼承?
- Reusable : 可減少code的重覆性,常使用的method可以只寫在superclass,其他
class要用的話就直接繼承便可使用。
- 多型:變數的型態決定他相對應呼叫的方法,只要是該class以及其superclass沒有
的method,一律無法呼叫。
2、IS-A :以繼承和實作為基礎。就好比野豬是一種豬,可表示為『野豬 IS-A 豬』。
並且不管有幾層的繼承,subclass IS-A superclass。
3、HAS-A:假如class A在該class內宣告class B為一物件,便可稱為A HAS-A B。
- Dec 27 Wed 2006 01:29
【SCJP】Encapsulation and Inheritance
close
全站熱搜
留言列表