Java多态中的问题(一)“覆盖”私有方法
程序员文章站
2022-07-15 16:50:26
...
动态绑定:在运行时根据对象的类型调用恰当的方法。Java中除了static方法(构造方法可看做static方法)和final方法(private方法可看做final方法)之外,其他普通方法都是动态绑定的。
如果在继承中,“覆盖”私有方法,并利用多态特性访问该方法,则可能得不到期望的结果,以下代码可反映问题。
package polymorphism;
public class PrivateOverride {
//私有方法
private void f(){
System.out.println("private f()");
}
public static void main(String[] args){
//基类引用子类对象
PrivateOverride po = new PrivateOverride();
po.f();
// 输出为"private f()"
}
}
class Derived extends PrivateOverride{
//"覆盖"并将其改为public
public void f(){
System.out.println("public f()");
}
}
/*output为:
private f()
*/
通常情况下,期望输出为“public f()”,但是由于private方法被自动认为是final方法,而且对子类即Derived是屏蔽的,根本不能被重载和重写,所以此时Derived类里面的"public void f()"方法属于一个全新的方法,对基类的引用po来说也不可见,调用的只能是"private void f()"。
结论:只有非private方法才能被真正的覆盖,虽然上面的例子编译器不报错,但是结果并不是我们期望的。对于子类来说,最好不要采用和基类private方法相同的名字做方法名。
上一篇: 【Python学习】python学习手册--第三十章 类的设计
下一篇: 继承
推荐阅读
-
java实现一次性压缩多个文件到zip中的方法示例
-
关于工作中.net转java遇到的一个远程调用传递重复参的问题。
-
一、Java学习中的总结---方法的使用
-
java基础 静态 static 问在多态中,子类静态方法覆盖父类静态方法时,父类引用调用的是哪个方法?
-
【每日一道算法题】Leetcode之longest-increasing-path-in-a-matrix矩阵中的最长递增路径问题 Java dfs+记忆化
-
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
-
SpringCache @Cacheable 在同一个类中调用方法,导致缓存不生效的问题及解决办法
-
360安全浏览器使用过程中遇到的一些问题与解决方法汇总
-
java web中的中文乱码问题和解决方法
-
Java多态中的问题(一)“覆盖”私有方法