我正面临困惑。请查看下面的java代码。
public interface Interface {
public void draw();
}
public class A {
public void draw()
{
System.out.println("Draw in A");
}
}
public class B extends A implements Interface {
@Override
public void draw()
{
System.out.println("Draw in B");
}
}
public class Main {
public static void main(String [] args)
{
Interface i = new B();
i.draw();
A a = new B();
a.draw();
B b = new B();
b.draw();
}
}
对于所有我得到相同的输出(“画在B中”)。你能告诉我哪个draw()被调用(接口/父类)?
答案 0 :(得分:12)
Java执行late binding,这意味着它是被调用的实例的方法,而不是与该类型对应的方法。
A a = new B();
^ ^
type instance
在这种情况下,您只创建B
个实例(new B()
),因此每次调用B
的方法,无论您将此实例分配给类型为{的变量{1}}。
另请参阅:dynamic dispatch
答案 1 :(得分:4)
调用的方法取决于创建的Object。因此,始终调用RHS(B
)的方法。
答案 2 :(得分:4)
正如您可能已经猜到的那样,正在调用B类中的draw()方法。这是因为即使您已将变量i,a和b声明为能够引用不同类型,您也可以选择将B类型的实例分配给所有类型。换句话说,当调用draw时,重要的是对象的运行时类型(由新B()创建的那个),而不是如何声明变量。
答案 3 :(得分:1)
每次创建B类的实例,并且正在调用其方法
答案 4 :(得分:1)
简单来说,这是因为new B()
。无论它是什么类型,当你从B
实例化时,将调用来自B
的所有方法(如果B没有实现它们,那么它是父节点。)。