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

技术问询:调用1、5时C转B类型及Print2.print(B b)执行原因

关于C转B类型及调用Print2.print(B)的原因解析

一、为什么C的数据类型会自动转换为B类型?

首先得明确一个核心前提:C肯定是B的子类(不然根本没法自动转成B类型哦)。Java里有个很基础的特性——自动向上转型:子类的对象可以直接当作父类的实例来使用,因为子类继承了父类的所有属性和方法,天然和父类类型兼容。

当你用C的实例去调用print方法时,如果当前的Print2类里没有定义专门接收C类型的print(C c)方法,Java编译器就会自动尝试把C向上转型成它的父类B,去匹配参数为B的重载方法。这个转换是完全自动的,不需要你手动写强制转换代码。

二、为什么会调用Print2类中的print(B b)方法?

这要说到Java方法重载的编译时绑定规则:

  1. 编译器在编译阶段就会确定要调用哪个重载方法,它会按优先级依次匹配:
    • 第一优先级:找参数类型和传入对象完全匹配的方法(比如如果有print(C c),就会直接调用这个);
    • 第二优先级:如果没有完全匹配的,就会找参数是传入对象父类的方法。这里B是C的父类,而且Print2正好有print(B b)方法,所以就会绑定这个方法;
  2. 这里要区分开方法重载和方法重写:方法重载是编译时确定的,不管运行时实际传入的是C对象,编译阶段已经敲定了要调用接收B类型的那个print方法啦。

举个简单的代码例子帮你更直观理解:

// 父类B
class B {}
// 子类C,继承自B
class C extends B {}
// Print2类
class Print2 {
    public void print(B b) {
        System.out.println("调用了print(B b)方法");
    }
    // 此处没有定义print(C c)方法
}

// 调用场景
public class Test {
    public static void main(String[] args) {
        Print2 printer = new Print2();
        C cInstance = new C();
        printer.print(cInstance); // 这里会自动把C转成B,调用print(B b)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:50:55