public abstract class A {
public abstract void method1();
public void method2() {
// A method2:子类直接复用
}
}
public class B extends A {
public void method1() { /* B method1 */ }
}
public class C extends A {
public void method1() { /* C method1 */ }
}
A 的子类 B、C 不必重写 method2,A 为它们提供了公共功能,也约束了行为。method1 没有实现,B、C 按自己的特点写,体现松散耦合。
public interface A {
public void method1();
public void method2();
}
public class B implements A {
public void method1() { /* B method1 */ }
public void method2() { /* B method2 */ }
}
public class C implements A {
public void method1() { /* C method1 */ }
public void method2() { /* C method2 */ }
}
接口 A 无法为 B、C 提供现成的 method2,两个方法都得各自实现一遍。A 约束的是“必须有这些方法”,不管具体怎么写。
三、单继承 vs 多实现
一个类只能继承一个直接父类(可以是抽象类),但可以实现多个接口,这是接口的优势。
interface A { public void method2(); }
interface B { public void method1(); }
class C implements A, B {
public void method1() { /* C method1 */ }
public void method2() { /* C method2 */ }
}
A a = new C();
B b = new C();
C 还可以继续实现别的接口。若改成两个抽象类叠在一起,C 继承了 B(B 再继承 A)之后,就没有机会再继承其他父类了:
abstract class A {
public abstract void method1();
}
abstract class B extends A {
public abstract void method2();
}
class C extends B {
public void method1() { /* C method1 */ }
public void method2() { /* C method2 */ }
}