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