在看java繼承這一塊的時候發現了一個問題,即父類未被子類覆蓋的方法是如何調用的?
是子類擁有了父類的該方法只是沒有顯示表示,還是子類調用了父類的該方法。
為此做了一下驗證
代碼如下:
public class One { protected void printA() { System.out.println("父類printA"); } private void printB() { System.out.println("父類printB"); } private void printC() { System.out.println("父類printC"); } protected void printABC() { printA(); printB(); printC(); } } public class Two extends One { protected void printA() { System.out.println("子類printA"); } private void printB() { System.out.println("子類printB"); } public void printC() { System.out.println("父類printC"); } public static void main(String[] args) { Two t = new Two(); // One t = new Two(); t.printABC(); } }
對於第一種情況:子類擁有了父類的該方法只是沒 有顯示表示
由於printABCD方法中調用了printA()、printB()、printC()、printD(),並且printB()在父類中是私有的,所以不可以被子類繼承。如果是這種情況的話,應該會編譯時報錯。然而沒有報錯,顯然不是第一種情況。
對於第二種情況:子類調用了父類的該方法
根據運行結果
這里就會有個疑問-如果是調用了父類方法為什么會printA會使用子類的方法呢?
事實上運行過程應該是這樣的,子類在調用printABCD方法時因為自己沒有重寫這個方法,所以是調用父類的該方法。
即默認為
@Override protected void printABCD() { // TODO Auto-generated method stub super.printABCD(); }
調用父類printABCD后接着要執行printA()、printB()、printC()、printD()四個方法。其中子類只對printA()進行了覆蓋,printB()沒有進行覆蓋,printC()、printD()不存在覆蓋。因此在調父類的printABCD方法,在執行時如果判斷內部執行的方法沒有對父類的方法進行覆蓋則使用父類的方法,否則使用覆蓋后的方法。