下面**輸出是什麼:
class a
public string run(a obj)
}class b extends a
public string run(a obj)
}class c extends b {}
class d extends b {}
public class test
}
關於上面所有注釋答案的解釋其實就乙個核心秘笈,多型是物件在不同時刻表現出來的多種狀態,是一種編譯時期狀態和執行時期狀態不一致的現象。
在編寫或者分析**時記住如下口訣:
意思是當父類變數引用子類物件時(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 方法(所以類 b 中引數為 b 的 run 方法其實是 b 類特有的過載方法,而不是重寫方法)。
6中 ab 在編譯時取決於左邊 a 的型別,執行時為右邊 b 的型別,所以編譯時包含了引數為 a、d 的 run 方法,而執行時傳遞給 run 方法的引數型別為 d,所以對應的方法為 a 類中引數為 d 型別的 run 方法(所以類 b 中引數為 b 的 run 方法其實是 b 類特有的過載方法,而不是重寫方法)。
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 方法。
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...
一道面試題
前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...
一道面試題
如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...