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

Java动态绑定技术问题:代码输出76的原因解析

代码执行结果76的底层机制解析
class A {
    public int m(A p) {
        return 12;
    }

    public int n(A p) {
        return 38;
    }
}
class B extends A {
    public int m(B p) {
        return 3;
    }

    public int n(A p) {
        return 7;
    }
}

class C extends A {
    public int m(A p) {
        return 38;
    }
    public int n(A p) {
        return 4;
    }
}
class D extends A {
    public int m(A p) {
        return 1;
    }

    public int n(D p) {
        return 2;
    }
}
class Main {
    public static void main(String argv[]) {
        A x = new C();
        A y = new D();
        D z = new D();
        System.out.println(x.m(z) + y.n(z)); // 输出76
    }
}

1. x.m(z)的执行逻辑

x的静态类型是A,编译时编译器会匹配A中参数兼容z(D是A子类)的m方法,即A.m(A p)。运行时因为x实际是C实例,且C重写了A.m(A p),所以调用C.m(A p),返回38。

2. y.n(z)的执行逻辑

y的静态类型是A,编译时匹配A.n(A p)(z是A子类,参数兼容)。运行时y实际是D实例,但D的n(D p)是方法重载(参数类型和A.n(A p)不同,方法签名不一致),并没有重写父类的n(A p),因此调用A.n(A p),返回38。

最终计算

38 + 38 = 76,这就是输出结果的由来。

核心依赖机制

  • 方法重载:编译阶段根据方法参数的静态类型确定调用哪个方法,属于静态绑定。
  • 方法重写:运行阶段根据对象的实际类型确定调用哪个方法,属于动态绑定。只有方法签名(方法名、参数类型及数量)完全一致的方法才会被视为重写,否则是重载。

内容的提问来源于stack exchange,提问作者How to

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:49:52