Java:为什么从未调用过这个函数?

Ale*_*lex 0 java inheritance compilation class

package main;

class F {
    void f() {
        System.out.print("F.f() ");
        this.g();
    }

    void g() {
        System.out.print("F.g() ");
    }
}

class Fbis extends F {
    void f() {
        System.out.print("Fbis.f() ");
        this.g();
    }

    void g() {
        System.out.print("Fbis.g() ");
        super.f();
    }
}

public class Main {
    public static void main(String[] args) {
        F f = new Fbis();
        ((F) f).f();
    }
}
Run Code Online (Sandbox Code Playgroud)

嗨,我试图理解为什么永远不会调用F类中的g()函数.此代码编译并运行,但会导致无限循环显示:

Fbis.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() Fbis.g() F.f() ...
Run Code Online (Sandbox Code Playgroud)

所以会发生什么,是Fbis.f被调用,它调用Fbis.g,调用F.f而不是调用F.g,F.f调用Fbis.g.

Dav*_*ebb 9

基本上,这就是继承的工作原理.本Fbis类覆盖了g()方法,以便对任何情况下Fbis调用g()运行从代码Fbis级的,即使这从内调用F类本身.

这通常是理想的行为.例如,想象一个delete()方法.在父类中,当应用程序删除对象时,这会进行一些清理.在儿童班中,它为这个孩子做了额外的清理工作.您希望在delete()调用时进行额外的清理,即使这是来自父类.