在論壇上看到的乙個例子,**如下
public class superclass
public void addvalue(int v)
public int getvalue()
}public class subclass extends superclass
public void method(superclass p)
}public class example
}輸出結果為 10 4,為什麼?
這道題的關鍵在於方法的過載與多型。多型,簡單來說就是,[color=red]定義為父類的物件被賦予了子類的例項,那麼執行該物件的方法的時候,會優先呼叫子類的方法。[/color]
這樣一來,看一下這段邏輯混亂的**,o2.method(o3);o2是父類的型別所以即使賦給他子類的實體也是無法呼叫父類沒有定義過的函式,也就是說superclass.method(subclass)這個方法不存在,所以編譯器認為這個method是那個引數為父類的函式,即為superclass.method(superclass);同時實體是子類的實體,所以結果就是呼叫子類override過的引數為父類的函式。
最後,論壇上的高手說的比較好,關於設計的一些基本原則,盡可能不要override已經有實體的函式,如果乙個函式打算在子類被override那就不要在父類做具體實現而是宣告成抽象函式。否則很容易違背黎克特制代換原則以及無法實現物件導向設計最根本的目的開閉原則的。物件導向的overlode和override不是被創造出來給人們討論這類的繁瑣的問題,而是用來讓設計更清晰更人性更容易被人理解以及變更修改的。這樣的**的存在就已經違背了多型過載的初衷了。
乙個有意思的問題
a b這個表示式如何理解?應該理解成a b還是a b,還是a b呢?應該按第一種方式理解。編譯的過程分為詞法解析和 語法解析兩個階段,在詞法解析階段,編譯器總是從前到後找最長的合法token。把這個表 達式從前到後解析,變數名a是乙個token,a後 面有兩個以上的 號,在c語言中乙個 號是合法的t...
乙個有意思的問題
最近做乙個交通管理系統,其中有個使用者投票功能。設想是直接開發乙個自定義的控制項。完成顯示,投票,ip檢索等全部功能。然而卻遇到乙個有意思的問題。具體來說就說,因為是用radiobuttonlist顯示的資料,在用radiobuttonlist.value捕獲使用者輸入時卻發現取出的索引始終為0.即...
乙個有意思的正則
在乙個框架中偶然發現一段比較有意思的正則,到現在還沒完全搞懂,先記錄下 1 3 str string 4 第乙個引數為正則 是左右定界符,就代表每個字串都匹配 5 preg split no empty 不返回空的 6 第 個引數 代表分割多少個陣列 7 chars preg split str,1...