Java 选择哪一种方法
我有两个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也可以接受 那么谁能告诉我这个的运行时逻辑呢?在所有
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查找调用方法的所有位置,并检查所传递变量的类型(而不是对象的类型)