Java动态绑定失败

我真的不明白为什么下面的代码不起作用。我希望B.f被打印出来。


public class Main {

    public static void main(String[] args) {

        B b = new B();

        b.g();

    }

}


class A {

    void g() {

        f();    /* or this.f() */

    }

}


class B extends A {

    void f() {

        System.out.println("B.f");

    }

}

编译器抱怨:


Main.java:13: error: cannot find symbol

        f();    /* or this.f() */

        ^

  symbol:   method f()

  location: class A

1 error

根据我的理解,thisin的动态类型A.g始终是B. 其结果是,Java的动态方法查找应该能够找到B.f的this.f,然后执行它。


蝴蝶不菲
浏览 171回答 2
2回答

幕布斯7119047

Java 的动态调度只能看到定义在当前类或其超类上的方法。因为 A 没有定义方法,所以它看不到 B 定义了它,你会得到一个错误。但是,如果该方法是私有以外的任何访问,B 可以覆盖它,因此即使在通过“A”实例类型访问该方法时,对 B 实例的方法调用也将被动态分派到 B 的实现。

大话西游666

这将不起作用,因为 A 类对方法 f() 一无所知。如果您不想f()在 A 中定义,则可以使用f()abstract 代替,您可以使 classA也为 abstract :abstract class A {    void g() {        f();    /* or this.f() */    }    abstract void f();}class B extends A {    void f() {        System.out.println("B.f");    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java