You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java编译时与运行时多态:方法调用的编译期绑定疑问

问题解答

编译阶段y.m()会绑定到接口Y的m()方法。

Java是静态类型语言,编译期只关注变量的静态声明类型,不会考虑它实际指向的对象类型。这里变量y被声明为Y类型,所以编译器会基于Y接口去查找m()方法,确认该方法存在后就完成编译时的绑定。

至于运行时,因为实际对象是B类的实例,而B重写了m()方法,所以会执行B类的实现,这就是你看到输出Class B m的原因。

你的代码整理:

接口X

package test;

public interface X {
    public void m();
}

接口Y

package test;

public interface Y {
    public void m();
}

抽象类A

package test;

public abstract class A implements X{
    public void m(){
        System.out.println("Class A: m");
    }
    abstract void m2();
}

类B

package test;

public class B extends A implements Y{
    public void m2(){
        System.out.println("Class B m2");
    }

    public void m(){
        System.out.println("Class B m");
    }
}

测试类test

package test;

public class test {
    public static void main(String[] args) {
        Y y = new B(); y.m();
    }
}

内容的提问来源于stack exchange,提问作者Park Bo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:05:11