Java 接口与动态调度方法

Java 接口与动态调度方法,java,overriding,Java,Overriding,正常重写(不使用接口) 这与使用接口执行此操作相同: 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.prin

正常重写(不使用接口)

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

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();
    }
}

这两种情况下的输出将是相同的,甚至实现也是相似的。我的问题是,当您可以使用动态方法分派来做同样的事情时,为什么还要有接口呢?

Vikingsteve是正确的,但我将添加更多细节

类型继承和实现继承之间有区别。在Java中,可以有多类型继承,但不能有多个实现继承


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

Vikingsteve是正确的,但我将添加更多细节

类型继承和实现继承之间有区别。在Java中,可以有多类型继承,但不能有多个实现继承


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

,这里有一些要考虑的要点:

  • 接口为您的类提供了使用其他类扩展的选项。如您所知,您不能扩展多个类,但可以实现多个接口(以实现多重继承)
  • 通过扩展类,您不能强制子类重写在超类中定义的方法。而在接口的实现中,强制在子类中实现您的方法
  • 这取决于您需要的实施。您希望子类必须实现方法,而不是使用接口设计所需的方法,而不必担心子类重写超类方法或不使用扩展设计
    我希望这会使你对这两种设计都有明显的不同。

    < P>有一些要考虑的要点:

  • 接口为您的类提供了使用其他类扩展的选项。如您所知,您不能扩展多个类,但可以实现多个接口(以实现多重继承)
  • 通过扩展类,您不能强制子类重写在超类中定义的方法。而在接口的实现中,强制在子类中实现您的方法
  • 这取决于您需要的实施。您希望子类必须实现方法,而不是使用接口设计所需的方法,而不必担心子类重写超类方法或不使用扩展设计
    我希望这将使您清楚地了解这两种设计的区别。

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

    • 超类允许分解常见方法(但在java中,类只有一个父类)
    • 接口声明常量和/或方法签名,但类可以实现它所需的任意多个方法

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

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

    • 超类允许分解常见方法(但在java中,类只有一个父类)
    • 接口声明常量和/或方法签名,但类可以实现它所需的任意多个方法

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

    由于在Java中不可能有多重继承,您也可以在中提供show()的实现,因此派生类不需要提供重写,因为接口不能提供重写。这是Mark的观点。使用您的接口方式,您无法打印“In A.x:”。由于在Java中不可能多重继承,您还可以在中提供show()的实现,因此派生类不需要提供重写,因为接口不能。添加到Mark的点。使用您的界面方式,您无法打印“A.x:”。
    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();
        }
    }