接口之间的继承

来源:互联网 发布:rpm yum 区别 编辑:程序博客网 时间:2024/06/07 18:46

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

0 0