Java 将控件传递给超类时的方法绑定
如前所述,此代码将调用基类的Java 将控件传递给超类时的方法绑定,java,oop,Java,Oop,如前所述,此代码将调用基类的func(),因为此方法是私有的,并且没有方法重写 但是,如果将func2()的func()行更改为((派生)this).func(),则将调用派生类的func()。 据我所知,一旦控件进入基类的func2(),派生对象似乎就被视为基类对象 我的理解正确吗?如果基类的func()改为public而不是private并且发生了运行时绑定,那么我的理解如何与方法重写相协调呢?在func2()中调用func()是否首先找到基类func(),然后由于方法重写而决定在子类中使用
func()
,因为此方法是私有的,并且没有方法重写
但是,如果将func2()
的func()
行更改为((派生)this).func()
,则将调用派生类的func()
。
据我所知,一旦控件进入基类的func2()
,派生对象似乎就被视为基类对象
我的理解正确吗?如果基类的
func()
改为public
而不是private
并且发生了运行时绑定,那么我的理解如何与方法重写相协调呢?在func2()
中调用func()
是否首先找到基类func()
,然后由于方法重写而决定在子类中使用func()
?运行时到底发生了什么?根据我从您的问题中了解到的情况,当从基类的func2()调用方法func()时,您对运行时会发生什么感到困惑。
当Java在超类的方法中找到一个在子类中被重写的方法时,它会发现该方法在子类中。
因此,在您的例子中,由于后期绑定,执行的不是基类而是派生类的func()方法。由于派生对象正在调用方法func2(),因此方法func()返回子类(派生)。但是,如果对基类进行了调用,则将调用基类的func
因此,总的结论是:后期绑定完全基于调用函数的对象。Java在后期绑定(运行时)期间检查子类的重写方法。如果您搜索了StackOverflow,您会找到很多答案。我的意思是我做了研究……我已经清楚地了解了这里发生的很多事情。我的目标是在我已经看过的问题之间调和我的理解。它确实看起来像是每当一个对象在另一个类中得到一个方法调用时,它就被视为该方法作用于它自己类型的变量;i、 例如,派生对象被视为像
Base obj=d一样被铸造代码>。然后由类型基解析func()
,但运行时多态性接管,并执行派生中的func()
。我来这里并不是没有理解/研究。所有的副本都说了一件事:你不能重写私有方法。因此,当编译器看到对私有方法的调用时,它会生成一个直接方法调用,这意味着调用在运行时甚至不会寻找重写。这与非私有方法调用不同,当编译器生成动态方法调用时,在运行时调用的实际方法可能是子类方法(动态分派)。在低级(字节码),对静态方法的调用是invokestatic
指令,对构造函数和私有实例方法的调用是invokespecial
指令,对非私有实例方法的调用是invokevirtual
指令。
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();
}
}