首页 > 编程 > Java > 正文

Java关于子类对父类私有方法覆盖的问题

2019-11-08 02:08:36
字体:
来源:转载
供稿:网友

最近在学习到java的继承和多态时遇到了这样的一个问题:关于继承链中子类对父类的私有方法是否可以覆盖的问题,在此记录一下自己对这个问题解决以后的一些心得。

首先要明确:子类是不能够覆盖(重写)父类的私有方法的。比较直观的理由是,子类要能够重写父类的方法的前提条件是继承,子类对父类的私有方法并不继承,也没有访问权限,自然也是不能重写的。接下来看一个例子:

public class Test {	public static void main(String[] args) {		new A().PRintPerson();		new B().printPerson();	}}class A {	public void printPerson() {		System.out.println(getInfo());	}	private String getInfo() {		return "A";	}}class B extends A{	public String getInfo() {		return "B";	}}运行结果是 A A。如果将private修饰词去掉,运行结果是A B这是毫无疑问的,因为那正是B重写了父类A的getInfo方法;而加上了private修饰词以后,父类A的getInfo和子类B的getInfo实际上就是两个无关的方法,因为私有方法是不能被子类重写的,私有方法并不是父类接口的一部分,只是隐藏在父类中的一段程序代码。

可是为什么使用子类B的实例调用printPerson,结果是打印A呢?要注意到printPerson方法是在父类A中定义的,因此刚执行new B().printPerson()这行代码时,编译器在子类B中无法找到匹配的printPerson方法,于是到父类A中去寻找;此时在父类A中找到了匹配的printPerson方法,并调用该方法,在父类A中的该方法中调用的getInfo自然也是寻找到了A中的getInfo方法,同时由于该getInfo方法是私有的,无法被重写,于是直接调用该方法。因此,通过B的实例调用printPerson,打印的结果也是A了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表