Java 为什么强制转换决定调用哪个重载方法?

Java 为什么强制转换决定调用哪个重载方法?,java,Java,如果java是按值传递的,并且该值是实际类型的内存地址,那么为什么调用的重载方法由引用/声明的类型决定 class Boss { void test(Object o){ System.out.println("object"); } void test(Boss b){ System.out.println("boss"); } public static void main( String[] args ) { Boss b = new

如果java是按值传递的,并且该值是实际类型的内存地址,那么为什么调用的重载方法由引用/声明的类型决定

class Boss {

  void test(Object o){
    System.out.println("object"); 
  }

  void test(Boss b){ 
    System.out.println("boss"); 
  }

  public static void main( String[] args ) {
    Boss b = new Boss();
    b.test((Object)b); //prints out object, why?
  }

}

动态绑定应用于调用方法的对象,而不是其参数和方法重载

在本例中,该方法在编译时被确定为void test(Object o),因为这是与参数类型匹配的重载

在运行时,根据调用对象选择
test(objecto)
的实现。在本例中,这就是Boss中的实现

例如,假设您已经这样做了:

class Director extends Boss { ... }.

Boss d = new Director();
Boss b = new Boss;
d.test((Object)b);

然后就方法重载而言,在编译时选择的方法仍然是
test(objecto)
。在运行时,实现可以在Director中,因为d引用一个Director

动态绑定应用于调用方法的对象,而不是其参数和方法重载

在本例中,该方法在编译时被确定为void test(Object o),因为这是与参数类型匹配的重载

在运行时,根据调用对象选择
test(objecto)
的实现。在本例中,这就是Boss中的实现

例如,假设您已经这样做了:

class Director extends Boss { ... }.

Boss d = new Director();
Boss b = new Boss;
d.test((Object)b);

然后就方法重载而言,在编译时选择的方法仍然是
test(objecto)
。在运行时,实现可以在Director中,因为d引用一个Director

重载是在编译时决定的,即编译器决定在编译期间正确执行哪个方法,而不考虑在运行时传递给它的对象。由于传递的是
Object
的参考变量,而不是
Boss
,因此尽管对象是
Boss
,但它执行重载的
无效测试(Object b)
方法

重载是在编译时决定的,即编译器决定在编译期间正确执行哪个方法,而不考虑在运行时传递给它的对象。由于传递的是
Object
的参考变量,而不是
Boss
,因此尽管对象是
Boss
,但它执行重载的
无效测试(Object b)
方法

还有什么可以决定调用什么方法?就JVM而言,强制转换的结果是类型为
Object
的引用。传入的值,即Boss对象的内存地址。因此,我希望实际类型确定调用哪个方法。-第一个相关的问题,Jon Skeet回答…听说过C指针吗<代码>int*myIntVar=malloc(sizeof(int));void*myVoidPtr=myIntVar之后,如果不查看
myIntVar
,就无法确定
myVoidPtr
中包含的地址处的值的类型@Kacyraye还有什么可以决定调用什么方法?就JVM而言,强制转换的结果是类型为
Object
的引用。传入的值,即Boss对象的内存地址。因此,我希望实际类型确定调用哪个方法。-第一个相关的问题,Jon Skeet回答…听说过C指针吗<代码>int*myIntVar=malloc(sizeof(int));void*myVoidPtr=myIntVar之后,如果不查看
myIntVar
,就无法确定
myVoidPtr
中包含的地址处的值的类型@KacyRayeUgh…好吧,我对编辑我的回复很失望,所以我把它完全删除了。如果要使用的重载方法是在编译时确定的,那么如何解释编译器何时确定要使用的方法在超类中?然后根据实际类型更改运行时要使用的方法。例如,如果有一个具有相同方法的超类SuperBoss,然后在main中有以下内容:
SuperBoss b=new Boss()
b.测试((对象)b)SuperBoss b=new Boss()
b.测试((对象)b)