Java 为什么强制转换决定调用哪个重载方法?
如果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
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,然后在main中有以下内容:SuperBoss b=new Boss()代码>b.测试((对象)b)哦,你知道吗?忽略我之前的评论。你的回答已经很完美了:)谢谢!