正常覆盖(不使用接口)
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();
}
}
两种情况下的输出都是相同的,甚至实现也是类似的。我的问题是,为什么在使用动态方法调度可以做同样的事情时有接口?
答案 0 :(得分:2)
有一些要考虑的要点:
我希望这会让你明白两种设计的区别。
答案 1 :(得分:1)
Vikingsteve是对的,但我会添加一些细节。
类型继承和实现继承之间存在差异。在Java中,您可以拥有多个类型继承,但不能实现多个实现继承。
这意味着一个类可以实现多个接口,并从每个接口继承该类型。从该类创建的对象基本上是所有这些类型的对象。但是你只能扩展另一个类并继承它的实现。
答案 2 :(得分:1)
接口和超类适用于不同的用例:
代理时需要接口,因为代理只能实现接口而不扩展类。并且代理在像Spring这样的框架中被大量使用,以便进行简单的面向方面编程。