在看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方法,在执行时如果判断内部执行的方法没有对父类的方法进行覆盖则使用父类的方法,否则使用覆盖后的方法。