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
相关产品推荐
相关产品推荐

