Java自学笔记|接口之间的继承

【Java自学笔记|接口之间的继承】原文地址:http://socket.blog.163.com/blog/static/209873004200931511140616/
在JAVA中,众所周知,一个类只能继承另一个类。一个接口则可以实现多个接口,JAVA此措施一定程序上弥补了类只能单一继承的遗憾,比如实现多线程的类可以继承Thread,也可以实现Runnable接口,那么当你需要去继承如JFrame类的时候,你只能用后者去实现。如果再要响应鼠标事件,那再implements MouseListener这个接口。可能大家对于接口之间的继承,很少碰到,其实这只是语法层次上的讨论,在实现设计时,很少会这样做。接口之间继承用extends关键字,可以继承多个接口。并不是用extends 后边就只能有一个类。 interface A{ public void f(); }
interface B{ public int f(); }
interface C extends A,B{}
这里是编译出错的。只用返回类型不同,来区分方法是出错的。下例不出现这种情况,但也出现极大的混淆,并不编译出错,只是class E 中的mB方法是一种覆盖,当方法签名完全一致时,优先考虑是覆盖。
interface A{
public static final int PI = 3.14; //通常情况一个实现类可以不加接口名访问接口常量!
void mA();
}
interface B{
public static final int PI = 3.15; //下方C 去多重继承这两个接口时会产生混淆,所以调用接口常量一律加上接口名,否则编译失败!出错:The field PI is ambiguous
void mA();
void mB();
}
interface C extends A,B{ void mC(); }
class D implements B{
public void mB(){
System.out.println("D.mB");
}
}
public class E extends D implements C{
public void mA(){}
public void mB(){//注:这里就一种覆盖class D中mB方法的行为,并不是实现C中的mB方法。
System.out.println("E.mB");
}
public void mC(){
}

public static void main(String[] args) {
D ref1 = new E();
ref1.mB();
((D)ref1).mB(); //动态绑定到E类中的mB方法

D ref2 = new D();
ref2.mB(); //只用自身的方法。
}
}
如果延伸开来说的话,implements给编译器的指示,就是要你去检查所实现的实体类中有否此方法,即使这个方法是从父类继承下来的。接口是一种规程,只要遵守了这种规程的任何方法都是可行的。所以接口具有很强的开放性,所以设计模式中提倡面向接口编程,因为接口是开放的,被大家都接受的,所以也是更加稳定的。如下边的代码:
interface I{
void fun();
}
class G{
public void fun(){
System.out.println("G.fun");
}
}
class H extends G implements I{//这个类并没有实现接口I 中的方法fun,只是继承自父类。
public static void main(String[] args) {
new G().fun(); }
}

    推荐阅读