• 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方法时因为自己没有重写这个方法,所以是调用父类的该方法。

    即默认为

    @Override
        protected void printABCD() {
            // TODO Auto-generated method stub
            super.printABCD();
        }

    调用父类printABCD后接着要执行printA()、printB()、printC()、printD()四个方法。其中子类只对printA()进行了覆盖,printB()没有进行覆盖,printC()、printD()不存在覆盖。因此在调父类的printABCD方法,在执行时如果判断内部执行的方法没有对父类的方法进行覆盖则使用父类的方法,否则使用覆盖后的方法。

  • 相关阅读:
    【WIN10】我的第一個WIN10-UWP應用——古文觀止
    【WIN10】文本圖標
    【WIN10】VisualStateManager使用說明
    【WIN10】Storyboard動畫板
    【WIN10】Bind、Binding與Converter的使用
    struts执行过程
    在jsp中的局部和全局变量
    jsp页面中的:<%@ page contentType="text/html; charset=utf-8" language="java"%>的作用及含义
    jsp中的this
    在Java接口中怎样访问定义的常量呢?
  • 原文地址:https://www.cnblogs.com/liuleicode/p/4953892.html
Copyright © 2020-2023  润新知