为了账号安全,请及时绑定邮箱和手机立即绑定

Java动态绑定失败

Java动态绑定失败

蝴蝶不菲 2021-10-06 10:25:56
我真的不明白为什么下面的代码不起作用。我希望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 A1 error根据我的理解,thisin的动态类型A.g始终是B. 其结果是,Java的动态方法查找应该能够找到B.f的this.f,然后执行它。
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

Java 的动态调度只能看到定义在当前类或其超类上的方法。因为 A 没有定义方法,所以它看不到 B 定义了它,你会得到一个错误。

但是,如果该方法是私有以外的任何访问,B 可以覆盖它,因此即使在通过“A”实例类型访问该方法时,对 B 实例的方法调用也将被动态分派到 B 的实现。


查看完整回答
反对 回复 2021-10-06
?
大话西游666

TA贡献1817条经验 获得超14个赞

这将不起作用,因为 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");

    }

}


查看完整回答
反对 回复 2021-10-06
  • 2 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信