Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 选择哪一种方法_Java_Inheritance_Overloading - Fatal编程技术网

Java 选择哪一种方法

Java 选择哪一种方法,java,inheritance,overloading,Java,Inheritance,Overloading,我有两个java类 class A {} class B extends A {} 我有一个接受这些类的类,但需要不同的实现方法 class Holder { public void accept(A a) {} // choice 1 public void accept(B b) {} //choice 2 } 如果我为一个持有者提供一个B对象,它会选择哪种方法 看一下我会选择选项2的代码,但是由于继承的原因,选项1也可以接受 那么谁能告诉我这个的运行时逻辑呢?在所有

我有两个java类

class A {}
class B extends A {}
我有一个接受这些类的类,但需要不同的实现方法

class Holder {
     public void accept(A a) {} // choice 1
     public void accept(B b) {} //choice 2
}
如果我为一个持有者提供一个B对象,它会选择哪种方法

看一下我会选择选项2的代码,但是由于继承的原因,选项1也可以接受

那么谁能告诉我这个的运行时逻辑呢?

在所有情况下,都会调用最具体的方法

如果要传递的对象的类型为
B
,则将调用
B
方法,但如果将
B
实例分配给
a
类型的变量,则将调用
a
方法:

A obj = new B();
accept(obj);  // will invoke the A method

对象的运行时类型不用于绑定到方法,因为Java是一种静态类型语言,方法绑定在编译时完成。

如果传递类型为
B
的对象,它将选择较晚的方法。Hmmh,我现在有点难过,因为我想这可能是我面临的一个错误的原因heh@MichaelDibbets当您的类扩展了两个接口,并且有问题的方法接受这些接口时,可能仍然存在无法确定的情况。@Michael检查最近的编辑。B的实例是通过a类型的变量传递的吗?不应该,但我可能错过了一个点,在某个点上它可能是a。这会改变情况吗?是的,这可能是问题所在。使用IDE查找调用方法的所有位置,并检查所传递变量的类型(而不是对象的类型)