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.
基本上,这就是继承的工作原理.本Fbis类覆盖了g()方法,以便对任何情况下Fbis调用g()运行从代码Fbis级的,即使这从内调用F类本身.
这通常是理想的行为.例如,想象一个delete()方法.在父类中,当应用程序删除对象时,这会进行一些清理.在儿童班中,它为这个孩子做了额外的清理工作.您希望在delete()调用时进行额外的清理,即使这是来自父类.