上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() {} }
当一个类实现多个接口时,就需要实现这些接口中的所有成员,如果出现同名成员,可以参考前面的内容,并按照实际需要进行处理。