Java关于子类对父类私有方法覆盖的问题
来源:互联网 发布:js隐藏网页源代码 编辑:程序博客网 时间:2024/06/05 15:08
最近在学习到Java的继承和多态时遇到了这样的一个问题:关于继承链中子类对父类的私有方法是否可以覆盖的问题,在此记录一下自己对这个问题解决以后的一些心得。
首先要明确:子类是不能够覆盖(重写)父类的私有方法的。比较直观的理由是,子类要能够重写父类的方法的前提条件是继承,子类对父类的私有方法并不继承,也没有访问权限,自然也是不能重写的。接下来看一个例子:
运行结果是 A A。如果将private修饰词去掉,换成protected和public修饰,运行结果是A B这是毫无疑问的,因为那正是B重写了父类A的getInfo方法;而加上了private修饰词以后,父类A的getInfo和子类B的getInfo实际上就是两个无关的方法,因为私有方法是不能被子类重写的,私有方法并不是父类接口的一部分,只是隐藏在父类中的一段程序代码。
可是为什么使用子类B的实例调用printPerson,结果是打印A呢?要注意到printPerson方法是在父类A中定义的,因此刚执行new B().printPerson()这行代码时,编译器在子类B中无法找到匹配的printPerson方法,于是到父类A中去寻找;此时在父类A中找到了匹配的printPerson方法,并调用该方法。
此处需要提及一下子类在继承父类时对父类的成员变量及方法继承的问题。对于使用protected或者public修饰的成员变量及方法,会被子类继承,且可通过子类直接调用,那么,对于子类不可见的private成员,以及没有修饰词修饰的成员(若子类与父类在不同的包中,这一类成员也是对子类不可见的),他们不被子类继承,那么在子类的实例所代表的内存空间中,这些成员是否存在呢?答案是肯定的,父类的私有变量及方法虽然不会被子类继承,对于子类来说不可见,但当创建了子类的实例的时候,这些成员一样会被加载入内存,并“隐藏”在内存当中。
因此,通过子类B的实例调用printPerson方法,会在父类的成员中寻找匹配的printPerson方法,找到以后,进入printPerson的方法体,调用getInfo方法,程序回到上层去寻找getInfo方法的匹配,并在内存空间中寻找到了A中的getInfo方法,同时由于该getInfo方法是私有的,无法被重写,因此不会触发java的动态绑定机制,于是直接调用该方法。因此,通过B的实例调用printPerson,打印的结果也是A了。
- Java关于子类对父类私有方法覆盖的问题
- Java关于子类对父类私有方法覆盖的问题
- 关于java子类方法覆盖(Override)父类方法时,该子类方法返回值的问题
- 关于Java子类访问父类的私有变量
- JAVA子类方法覆盖父类方法
- Java中关于子类覆盖父类的抛出异常问题
- 有关java中子类覆盖父类的方法的返回值的问题
- 子类覆盖父类方法问题
- (java)父类的静态方法为子类覆盖后,丢失多态性的问题
- Java子类与父类方法的隐藏和覆盖
- java 子类有没有继承父类的私有属性和私有方法呢 [
- Java:子类能够继承父类的私有变量和私有方法?
- 子类覆盖父类的方法
- java 子类可以继承父类中的什么,子类中方法覆盖,final关键字的含义
- 继承 子类对父类方法的覆盖 构造方法的继承 super
- java 中子类如何实现对父类私有域的继承
- Java子类父类属性的覆盖
- Java子类父类属性的覆盖
- 四种常见的 POST 提交数据方式
- 详解location.href几种用法的区别
- 快速理解c++编译器名称查找规则koenig lookup(ADL)
- ffmpeg中av_find_best_stream()函数的使用
- 沉浸栏-将activity页面延伸到状态栏
- Java关于子类对父类私有方法覆盖的问题
- Linux下tomcat重新启动
- ICN数据包格式封装
- 计算机网络–物理层
- iOS 修饰符~ NS_UNAVAILABLE、NS_REQUIRES_SUPER
- 计时器的开始与暂停
- 金融科技&大数据产品推荐:百融信贷决策审批系统
- 金融科技&大数据产品推荐:蜂巢——数据科学驱动的互联网风控解决方案
- 大数据投融资9月榜:共28起融资事件,总金额超84.7亿元