Java与Android移动应用开发:技术、方法与实践
上QQ阅读APP看书,第一时间看更新

4.3 接口的继承

接口同样可以被继承,而且支持多重继承。下面的代码分别定义I1和I2两个接口。

(I1.java文件)

    package com.caohuayu.javademo;
public interface I1 { void m1(); }

(I2.java文件)

    package com.caohuayu.javademo;
public interface I2 { void m1(); void m2(); }

在I1接口中定义m1()方法,而在I2接口中定义m1()和m2()两个方法。请注意,m1()方法同时定义在I1和I2接口中。

此时,如果I2接口是I1接口的扩展,可以将I2接口定义为继承I1接口。下面就是修改后的代码(I2.javaI文件)。

    package com.caohuayu.javademo;
    public interface I2 extends I1 {
        void m2();
    }

接下来,使用C1类实现I1接口,如下面的代码(C1.java文件)所示。

    package com.caohuayu.javademo;
public class C1 implements I1{ public void m1() { System.out.println("I1.m1() method is working"); } }

下面使用C2类实现I2接口。现在的问题是,如何处理m1()方法的实现。分三种情况来讨论。

□ 如果I1.m1()和I2.m1()方法的实现完全一样,则可以让C2类继承自C1类,这样就不需要重写m1()方法,只需要在C2类中实现m2()方法就可以了。通常,这是最理想的情况。

□ 如果I1.m1()和I2.m1()方法只是名称一致,实现完全不同,可以让C2类直接实现I2接口,这样,C2类的定义与C1类无关。

□ 如果C2类需要同时使用I1.m1()和I2.m1()方法,则可以让C2类继承自C1类,然后通过不同的方法名分别实现I1.m1()和I2.m1()方法。因为在Java中无法处理不同接口中的同名方法,所以这只能是权宜之计。

下面的代码(C2.java文件)使用第三种情况来实现C2类。

下面的代码演示C2类的使用。

    public static void main(String[] args) {
        C2 c = new C2();
       c.m1();
       c.m2();
       c.m1_I1();
    }

代码执行结果如图4-1所示。

此外,与类的继承不同,一个类可以同时实现多个接口,如下面的代码所示。

图4-1 接口的继承

    public class C1 implements I1, Cloneable {
        //
        public void m1() {}
        //
        public Object clone() {}
    }

当一个类实现多个接口时,就需要实现这些接口中的所有成员,如果出现同名成员,可以参考前面的内容,并按照实际需要进行处理。