【发布时间】:2018-10-21 07:18:30
【问题描述】:
class Base {
private void func(){ // method overridden if public
System.out.println("In base func method");
};
public void func2() {
System.out.println("func2");
func(); // alternatively, this could be: ((Derived) this).func();
}
}
class Derived extends Base {
public void func(){
System.out.println("In Derived Class func method");
}
}
class Test {
public static void main(String [] args) {
Derived d = new Derived();
d.func2();
}
}
正如所写,此代码将调用 Base 类的 func(),因为此方法是私有的,并且没有方法覆盖。
但是,如果将func2() 的func() 行更改为((Derived) this).func(),则会调用派生类的func()。
据我所知,一旦控件进入 Base 类的 func2(),Derived 对象似乎被视为 Base 对象。
我的理解正确吗?如果基类的func() 是public 而不是private 并且发生运行时绑定,那么我的理解如何与重写方法相协调? func2()中对func()的调用是不是先找到Base类func(),然后由于方法覆盖而决定在子类中使用func()?运行时到底发生了什么?
【问题讨论】:
-
idownvotedbecau.se/noresearch 如果你在 StackOverflow 上搜索过
java private override,你会找到很多答案。 -
我的意思是我确实做过研究...我清楚地了解这里发生的很多事情。我的目标是在我已经看过的问题之间调和我的理解。确实,每当一个对象在另一个类中获得方法调用时,它似乎确实被视为该方法正在作用于其自己类型的变量;即,Derived 对象被视为已像
Base obj = d;一样被强制转换。然后func()由 Base 类型解析,然后运行时多态性接管并执行 Derived 中的func()。我不是在没有了解/研究的情况下来到这里的。 -
所有重复项都说同样的话:你不能覆盖私有方法。因此,当编译器看到对私有方法的调用时,它会生成一个直接方法调用,这意味着该调用甚至不会在运行时寻找覆盖。这与非私有方法调用不同,当编译器生成 动态 方法调用时,在运行时调用的实际方法可能是子类方法(动态调度)。
-
在底层(字节码),调用静态方法是
invokestatic指令,调用构造函数和私有实例方法是invokespecial指令,调用非私有实例方法是@987654343 @指令。