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

Java中Object类隐式继承下向上转型调用方法的差异疑问

为什么这两种调用结果会不一样?

这事儿其实要从Java的编译时类型检查和运行时多态两个核心点说起,咱们一个个拆解清楚:

1. 为什么 Object o = new A(); o.print(); 会编译报错?

当你写 Object o = new A(); 时,变量o其实有两个“身份”:

  • 编译时类型:就是你声明的Object类型,Java编译器在检查代码合法性的时候,只认这个类型。
  • 运行时类型:是实际创建的A对象,但这是程序跑起来之后才会生效的信息。

而Java的Object类本身并没有定义print()方法,编译器看到你调用o.print()时,发现Object类里找不到这个方法,直接就抛出编译错误了——根本轮不到运行时去调用A类的print()方法。

2. 为什么 A a = new B(); a.print(); 能正常输出B?

再看这个例子,变量a的两个“身份”:

  • 编译时类型:是声明的A类型,A类里明确有print()方法,所以编译器检查通过,允许这段代码编译。
  • 运行时类型:实际创建的是B对象,而B重写了A的print()方法。Java的多态机制会在运行时根据实际对象的类型,调用它重写后的方法,所以最终输出B。

简单总结:

  • 编译阶段只看变量的声明类型有没有对应的方法,没有就直接报错;
  • 运行阶段才会根据实际对象类型来调用重写后的方法,这就是多态的核心体现。

内容的提问来源于stack exchange,提问作者Akshay Katoch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:14:35