一道題解析物件導向的特徵

2021-08-10 04:21:40 字數 2008 閱讀 7414

public

class

testdt

}class

a public string run(a obj)

}class

bextends

a public string run(a obj)

}class

cextends

b class

dextends

b

關於上面所有注釋答案的解釋其實就乙個核心秘笈,多型是物件在不同時刻表現出來的多種狀態,是一種編譯時期狀態和執行時期狀態不一致的現象。我們在編寫或者分析**時記住如下口訣:

成員變數:編譯看左,執行看左(因為無法重寫);

成員方法:編譯看左,執行看右(因為普通成員方法可以重寫,變數不可以);

靜態方法:編譯看左,執行看左(因為屬於類);

意思是當父類變數引用子類物件時(base base = new child();),在這個引用變數 base 指向的物件中他的成員變數和靜態方法與父類是一致的,他的非靜態方法在編譯時是與父類一致的,執行時卻與子類一致(發生了複寫)。所以有了上面的口訣我們很容易分析出執行結果:

注釋1中 aa 在編譯時取決於左邊 a 的型別,所以包含了引數為 a、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 a,所以執行了 a 類中引數為 a 型別的 run 方法。

注釋2中 aa 在編譯時取決於左邊 a 的型別,所以包含了引數為 a、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 c,而此時只支援引數為 a、d 的 run 方法,而 c 又繼承自 b,b 繼承自 a,所以執行了 a 類中引數為 a 型別的 run 方法。

注釋3中 aa 在編譯時取決於左邊 a 的型別,所以包含了引數為 a、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 d,而此時恰巧支援引數為 a、d 的 run 方法,所以直接執行了 a 類中引數為 d 型別的 run 方法。

注釋4中 ab 在編譯時取決於左邊 a 的型別,執行時為右邊 b 的型別,所以編譯時包含了引數為 a、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 b,所以對應的方法為 a 類中引數為 a 型別的 run 方法,而由於 ab 在執行時右側的 b 類中重寫了 a 類中引數為 a 型別的 run 方法,所以執行時最終執行了 b 類中重寫的引數為 a 型別的 run 方法(所以類 b 中引數為 b 的 run 方法其實是 b 類特有的過載方法,而不是重寫方法)。

注釋5中 ab 在編譯時取決於左邊 a 的型別,執行時為右邊 b 的型別,所以編譯時包含了引數為 a、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 c,c 又最終繼承自 a,所以對應的方法為 a 類中引數為 a 型別的 run 方法,而由於 ab 在執行時右側的 b 類中重寫了 a 類中引數為 a 型別的 run 方法,所以執行時最終執行了 b 類中重寫的引數為 a 型別的 run 方法。

注釋6中 ab 在編譯時取決於左邊 a 的型別,執行時為右邊 b 的型別,所以編譯時包含了引數為 a、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 d,所以對應的方法為 a 類中引數為 d 型別的 run 方法。

注釋7中 b 在編譯時取決於左邊 b 的型別,執行時為右邊 b 的型別,所以編譯時包含了引數為 a、b、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 b,所以對應的方法為 b 類中引數為 b 型別的 run 方法(b 在編譯時已經繼承了 a 的方法)。

注釋8中 b 在編譯時取決於左邊 b 的型別,執行時為右邊 b 的型別,所以編譯時包含了引數為 a、b、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 c,而 c 的第一父類是 b,此時恰巧 b 中有支援引數為 b 的 run 方法(所以不用再往上找),所以對應的方法為 b 類中引數為 b 型別的 run 方法。

注釋9中 b 在編譯時取決於左邊 b 的型別,執行時為右邊 b 的型別,所以編譯時包含了引數為 a、b、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 d,所以對應的方法為 b 類中從 a 類繼承來的引數為 d 型別的 run 方法。

JS的一道this例題解析

在學習js裡this的指向時,發現了一道有點 的面試題,看懂了對學習this應該是挺有幫助的 例題如下 function parent this.show function function child child.prototype new parent var parent new parent...

pwn題解第一道

今天聽說了乙個 pwnable.kr。很適合初學者,就試著做了一道題目。第一道題目,按照網頁上給的鏈結,使用putty鏈結工具聯入。輸入ls命令檢視檔案內容。很開心的看到了flag檔案,於是直接開啟,果然不出所料,我是沒有許可權開啟的。然後檢視了一下fd.c的 include include inc...

一道面試題的解析

一道面試題的解析 題目 1.畫三角形,四邊形,圓形,在視窗中移動,碰到視窗邊緣會自動彈回 2.通過選單,可以增加三角形,四邊形,圓形 3.對選中的圖形,可以設定填充顏色,線條寬度 4.畫三角形,四邊形,圓形,採用 bitmap 和位置兩種方式實現,位圖實現不設定填充顏色,線條寬度,隨機產生位置。5....