如何解决接口和继承之间的问题

时间:2014-09-22 12:46:11

标签: java inheritance interface

我正面临困惑。请查看下面的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()被调用(接口/父类)?

5 个答案:

答案 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没有实现它们,那么它是父节点。)。