Java中方法的继承以及父类未被子类覆盖的方法调用的问题
在看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方法時因為自己沒有重寫這個方法,所以是調用父類的該方法。
即默認為
@Overrideprotected void printABCD() {// TODO Auto-generated method stubsuper.printABCD();}調用父類printABCD后接著要執行printA()、printB()、printC()、printD()四個方法。其中子類只對printA()進行了覆蓋,printB()沒有進行覆蓋,printC()、printD()不存在覆蓋。因此在調父類的printABCD方法,在執行時如果判斷內部執行的方法沒有對父類的方法進行覆蓋則使用父類的方法,否則使用覆蓋后的方法。
轉載于:https://www.cnblogs.com/liuleicode/p/4953892.html
總結
以上是生活随笔為你收集整理的Java中方法的继承以及父类未被子类覆盖的方法调用的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详细类库排行榜网址
- 下一篇: 构造不可变类及其优点