技术问询:调用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方法重载的编译时绑定规则:
- 编译器在编译阶段就会确定要调用哪个重载方法,它会按优先级依次匹配:
- 第一优先级:找参数类型和传入对象完全匹配的方法(比如如果有
print(C c),就会直接调用这个); - 第二优先级:如果没有完全匹配的,就会找参数是传入对象父类的方法。这里B是C的父类,而且Print2正好有
print(B b)方法,所以就会绑定这个方法;
- 第一优先级:找参数类型和传入对象完全匹配的方法(比如如果有
- 这里要区分开方法重载和方法重写:方法重载是编译时确定的,不管运行时实际传入的是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
相关产品推荐
相关产品推荐

