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();
    }
}