最近在学习到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了。
新闻热点
疑难解答