Saturday, September 4, 2010

java物件繼承

給未來的裕翔

Autoboxing/Autounboxing沒事別用

因為有效能問題

雖然用java就表示效能並非首要考量

但是java已經夠不快了

別再用一些有的沒的讓它更慢

當然, 也許有一天它會適合我(在某種情況下)

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

java是限制單一繼承的

如此可避免行為混淆(怕遇到一堆有同名method的父類別)

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

對method而言, 有限制最寬鬆的public

同package和子類別和其他都可以使用

接著是protected

同package和子類別都可以使用

再來是default

同package才能使用

最後是private

只有本身該類別可以使用

protected老師說留到後面講

所以我先記default的筆記

default並不是真的寫這個關鍵字出來喔^^

真的在method前寫default的話編譯反而會錯

至於class, 只有public和default兩種

那為什麼需要default呢?

當我們在設計一個系統的時候

要先進行子系統切割

以汽車來講, 一萬多個零件

"爽斃了" by 老師

所以要進行子系統切割: 引擎系統, 機電系統, 底盤系統......

(其實我忘記老師到底說了哪些系統)

以引擎系統(package)而言

我不是真的去操作它

而是透過油門(package interface)

(其實就只是一個public class)

至於引擎內部(一堆default class)怎樣運作

我可以不用知道^^(耶~!)

哪天也許引擎內部(一堆default class)稍作修改

我依舊只需要踩油門(package interface)就能加速

暸改嗎? 所以package的封裝是藉由class的default來達成

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

一個類別可以包含

1. attribute

2. method

3. constructor

4. nested class

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

從父類別繼承的method可以override

signature要一樣

return type可以不一樣, 不過有限制

限制是: override後的return type必須是原來method的return type的子類別

不過這是5.0以後才有的啦

那如果signature不一樣, 也是可以的呦^^

這樣變成method overload了

compiler是不會發出警告或錯誤的

不過在5.0以後, 可以在該method上方加一行

@Override

這樣compiler就會幫我檢查, 這是java裡面的annotation之ㄧ

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

如果現在有兩個方法

public int mm() {...}
public String mm () {...}

這樣編譯會錯

但不是overload的問題

而是method redefine的錯誤

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

現在有個A, 它有個m方法

B繼承A

C繼承B

對C來說, 如果使用super.m()

它是呼叫B的m(), 實際執行A的m()

如果B有override過A的m()

那C使用super.m()時

它是呼叫B的m(), 實際執行B的m()

那此時如果我想使用A的m()呢?

super.super? 錯!!!

老師說有方法可以, 不過現在沒要提^^

如果要使用父類別的constructor

super(...)

所以比較一下

使用父類別的方法: super.m()

使用父類別的constructor: super(...)

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

constructor裡面可以呼叫另一個constructor

如果它又呼叫回來?

recursive? 聰明的編譯器會檢查來避免^^

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

當我沒建立costructor時

編譯器會為我準備一個

當我繼承某類別, 編譯器會為我子類別的constructor裡最前面那行加上

super()

注意, 參數列是空的喔

萬一, 我的父類別有自訂constructor

(那編譯器不會為我準備空的constructor)

那編譯器為我子類別加上的super()就會造成編譯器失敗

因為找無^^

順帶一提: 老師說沒事別用繼承, 也是效能問題

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

javap class-name

可以拿來反組譯class

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

Object是所有類別的根源

裡面有toString(), equals(), hashCode()這些方法

這是提供來讓我們override的

equals()視不同情況改寫

預設是

public boolean equals( Object o )
{
return this == o;
}

當我new了兩個物件, 它們就不會是identical

但某些內容可以equal

可是如果我不改寫equals()的話

它依舊只比較是否identical^^

所以如果兩個字串使用s1 == s2

一定是false的啦^^

應該要用s1.equals(s2)

(String類別有override過equals()方法)

hashCode()有個規則

如果a.equals(b)如果是true的話

a.hashCode() == b.hashCode()必須為true

至於實作, 也是依情況而定^^

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

Integer是int的包裝類別

如果現在wAmount是Integer

int r = wAmount + 1在java 5.0之前會錯

會錯是因為物件不能做算術運算

5.0之後是ok的, 因為有autoboxing

那如果現在要把String換成int

可參考下面

String sAmount = "10000"
int amount = Integer.parseInt(sAmount);

如果sAmount是"0x123A"或"12.3"都會錯

不過"12.3"可以用Double.parseDouble(sAmount)來轉^^

No comments:

Post a Comment