继承父类并实现多个接口与接口之间的多继承
继承父类并实现多个接口
接口的多实现
之前学过,在继承体系中,一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接
口的多实现。并且,一个类能继承一个父类,同时实现多个接口。
实现格式:
package day01.quanbu; /* 使用接口的时候,需要注意: 1. 接口是没有静态代码块或者构造方法的。 2. 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。 格式: public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB { // 覆盖重写所有抽象方法 } 3. 如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。 4. 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。 5. 如果实现类锁实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。 6. 一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。 */ public class Demo01Interface { public static void main(String[] args) { Zi zi= new Zi(); zi.method(); } }
package day01.quanbu; public class Zi extends Fu implements MyInterfaceC { }
package day01.quanbu; public class Fu { public void method(){ System.out.println("父类方法"); } }
package day01.quanbu; public interface MyInterfaceA { //错误写法!接口不能有静态代码块 // static { // // } //错误写法!接口不能有构造方法 // public MyInterface(){ // // } public abstract void methodA(); }
package day01.quanbu; public interface MyInterfaceC { public default void method(){ System.out.println("接口的默认方法"); } }
package day01.quanbu; public abstract class MyInterfaceAbstract implements MyInterfaceA,MyInterfaceB { @Override public void methodA() { } @Override public void methodAbs() { } @Override public void methodDefult() { } }
抽象方法
接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果抽象方法有重名的,只需要重写一次。代码如
下:
定义多个接口:
interface A { public abstract void showA(); public abstract void show(); } interface B { public abstract void showB(); public abstract void show(); }
定义实现类:
public class C implements A,B{ @Override public void showA() { System.out.println("showA"); } @Override public void showB() { System.out.println("showB"); } @Override public void show() { System.out.println("show"); } }
默认方法
接口中,有多个默认方法时,实现类都可继承使用。如果默认方法有重名的,必须重写一次。代码如下:
定义多个接口:
interface A { public default void methodA(){} public default void method(){} } interface B { public default void methodB(){} public default void method(){} }
定义实现类:
public class C implements A,B{ @Override public void method() { System.out.println("method"); } }
静态方法
接口中,存在同名的静态方法并不会冲突,原因是只能通过各自接口名访问静态方法。
优先级的问题
当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执
行父类的成员方法。代码如下:
定义接口:
interface A { public default void methodA(){ System.out.println("AAAAAAAAAAAA"); } }
定义父类:
class D { public void methodA(){ System.out.println("DDDDDDDDDDDD"); } }
定义子类:
class C extends D implements A { // 未重写methodA方法 }
定义测试类:
public class Test { public static void main(String[] args) { C c = new C(); c.methodA(); } }
接口的多继承【了解】
一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。接口的继承使用 extends 关键字,子接口继
承父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。
1.类与类之间是单继承的。直接父类只有一个。
2类与接口之间是多实现的。一个类可以实现多个接口。3.接口与接口之间是多继承的。
注意事项:
1多个父接口当中的抽象方法如果重复,没关系。
2.多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,【而且带着default关键字】
代码如下:定义父接口:
interface A { public default void method(){ System.out.println("AAAAAAAAAAAAAAAAAAA"); } } interface B { public default void method(){ System.out.println("BBBBBBBBBBBBBBBBBBB"); } }
定义子接口:
interface D extends A,B{ @Override public default void method() { System.out.println("DDDDDDDDDDDDDD"); } }
小贴士:
子接口重写默认方法时,default关键字可以保留。
子类重写默认方法时,default关键字不可以保留。