Friday, September 10, 2010

java的多型


給未來的裕翔

java有個重點是多型

這可是我當初自修完全看不懂的呢^^

汽車是車

所以我可以宣告一個車的參考指向汽車物件

同理, 經理也是員工

Employee e = new Manager();

這就是把經理找來當Employee用

那如果現在Employee有getInfo()方法

Manager裡面有覆寫getInfo()方法

試問, 我把經理當員工用

e.getInfo()是呼叫誰的getInfo() ?

經理的^^

老師的超棒例子!

"把所有員工找來報告, 經理報告的內容會和清潔工一樣嗎?"

那如果有個attribute是經理獨有, Employee沒有

ex: department

那我是不能存取它的department的

不過不能存取不代表他消失

老師的超棒例子

在我們面前是大師的他

回家變兒子的老子

此時的他依然擁有java知識

不過沒要教他兒子罷了

--------------------------------------------------

多型的好處, 異質集合

我可以宣告一個Employee陣列

裡面存放Manager, Engineer這些也算是員工的相異子類別

--------------------------------------------------

如果父類別有個方法要在子類別裡被覆寫

那麼它的存取控管必須大於等於父類別

也就是說, 如果在父類別裡是public的成員方法

在子類別裡它不能是private

因為在編譯器檢查的時候

是以父類別方法來檢查, 實際執行卻是執行子類別的方法

萬一上例在子類別宣告成private

那就會是"檢查通過, 但實際不能用" ^^

--------------------------------------------------

介於public和private中間還有兩個: default和protected

protected的方法可以被同package和子類別存取

default的方法可以被同package存取

什麼時候會用到protected呢

老師的超棒實務例子

"當我在規劃需要哪些方法時 先寫一個空的放在那"

"此時我不希望它被存取 因為是空的"

"之後被分配的人去把它實作 再把變protected改成public就可以被他人使用了"

"還有很多機會會用到啦 不過現在的你大概只能聽懂這個"

太棒了 被強者嗆就是爽^^

--------------------------------------------------

a instanceof b回傳boolean

可以想成判斷是否"a is b"

如果現在用Employee e參考指向Manager

e.getInfo()的話, 是Manager自己的getInfo()

可是如果想要使用Manager自己新增的playGolf()呢?

要先轉型回子類別Manager m = (Manager) e;

--------------------------------------------------

比較一下, 對陣來說, 它有個length成員變數

對字串來說, 它有個length()成員方法

--------------------------------------------------

子類別可以自動變父類別

父類別需要casting才可以變子類別

如果現在A是父類別, B和C是各自繼承A的兄弟類別

A a = new B();
B b = (B) a;
這樣ok

A a = new A();
B b = (B) a;
編譯ok, 執行失敗

那現在要怎樣才可以把B轉型成C呢?

B b = new B();
A a = b;
C c = (C) a;
這樣編譯會過喔^^

當然, 執行會錯啦~

--------------------------------------------------

Object o = new Object[n];

雖然看似tricky

但是這是合法的喔^^

因為陣列也是一種物件

如果現在Object o = new int[1]

裡面的element會不初始化成0

怎麼取值? 轉型!

if ( o isinstanceof int [] )
int[] ia = (int


No comments:

Post a Comment