正如这里简洁描述的那样,在Java中覆盖私有方法是无效的,因为父类的私有方法是"自动最终的,并且从派生类中隐藏".我的问题主要是学术问题.
如何不允许父级的私有方法被"覆盖"(即,在子类中使用相同的签名独立实现),是不是违反封装?根据封装原则,子类无法访问或继承父级的私有方法.它是隐藏的.
那么,为什么要限制子类使用相同的名称/签名实现自己的方法呢?有没有一个很好的理论基础,或者这只是某种实用的解决方案?其他语言(C++或C#)对此有不同的规定吗?
我知道我可以使用反射来调用私有方法,并获取或设置一个私有变量的值,但我要重写的方法.
public class SuperClass {
public void printInt() {
System.out.println("I am " + getClass() + ". The int is " + getInt());
}
private int getInt() {
return 1;
}
}
public class SubClass extends SuperClass {
public static void main(String[] args) {
(new SubClass()).printInt();
}
public int getInt() {
return 2;
}
}
Run Code Online (Sandbox Code Playgroud)
我想要 打印输出的main方法,但它打印出来.我听说这可以通过反思完成,但我无法弄清楚如何.如果没有反思,有没有人知道另一种方式呢?(除了保护,复制和粘贴方法之外.)如果实际覆盖私有方法是不可能的,有没有办法在它上面放置某种类型的触发器,它将调用我的子类中的方法之前或私有方法执行后?SubClass21SuperClass.getInt()printInt()SubClass