接口和动态方法调度

时间:2014-06-26 13:22:10

标签: java method-overriding

正常覆盖(不使用接口)

class A {
    int x = 0;
    void show() {
        System.out.println("In A. x : " + x);
    }
}

class B extends A {
    void show() {
        System.out.println("In B. x : " + x);
    }
}

class C extends A {
    void show() {
        System.out.println("In C. x : " + x);
    }
}

class Test {
    public static void main(String args[]){
        A obj = new B();
        obj.show();
        obj = new C();
        obj.show();
    }
}

这与使用接口进行操作相同:

interface A {
    int x = 0;
    void show();
}

class B implements A {
    public void show() {
        System.out.println("In B. x : " + x);
    }
}

class C implements A {
    public void show() {
        System.out.println("In C. x : " + x);
    }
}

class Test {
    public static void main(String args[]){
        A obj = new B();
        obj.show();
        obj = new C();
        obj.show();
    }
}

两种情况下的输出都是相同的,甚至实现也是类似的。我的问题是,为什么在使用动态方法调度可以做同样的事情时有接口?

3 个答案:

答案 0 :(得分:2)

有一些要考虑的要点:

  1. 接口为您提供了扩展其他类的选项。如您所知,您不能扩展多个类,但可以实现多个接口(实现多重继承)。
  2. 通过扩展类,你不能强制子类覆盖超类中的方法定义。而在实现接口强制中实现你的方法在子类中。
  3. 这取决于您需要的实施。您希望子类必须实现方法而不是您需要使用的界面设计,而您不必担心子类覆盖超类方法或不使用扩展设计。
  4. 我希望这会让你明白两种设计的区别。

答案 1 :(得分:1)

Vikingsteve是对的,但我会添加一些细节。

类型继承和实现继承之间存在差异。在Java中,您可以拥有多个类型继承,但不能实现多个实现继承。

这意味着一个类可以实现多个接口,并从每个接口继承该类型。从该类创建的对象基本上是所有这些类型的对象。但是你只能扩展另一个类并继承它的实现。

答案 2 :(得分:1)

接口和超类适用于不同的用例:

  • 超类允许对常用方法进行分解(但在java中,一个类只有一个父类)
  • 接口声明常量和/或方法签名,但是类可以实现所需的方法

代理时需要接口,因为代理只能实现接口而不扩展类。并且代理在像Spring这样的框架中被大量使用,以便进行简单的面向方面编程。