接口的多实现和多继承

注意

  • 接口中不允许有静态代码块和构造方法(接口不能直接new)。

接口的多实现

在继承体系中,一个类只能继承一个父类,而对于接口而言,一个类是可以实现多个接口的。

这种叫做接口的多实现。一个类能继承一个父类,且同时实现多个接口。

格式:

【】 :表示可选操作。

class 类名 【extends 父类名】 implements 接口名1,接口名2... {
	// 重写接口中的抽象方法【可选】
	// 重写接口中的默认方法【不重名时可选】
}

抽象方法重写

接口中,有多个抽象方法时,实现类必须重写所有抽象方法。如果抽象方法有重名,只需重写一次

爸爸妈妈都让去上学,说一次就行了

定义多个接口:

MyInterfaceA

public interface MyInterfaceA {
/*
    // error 接口不能有静态代码块
    static { }

    // error 接口不能有构造方法(接口不能直接new)
    public MyInterface() {}
*/

    public abstract void methodA();

    public abstract void methodSchool();

}

MyInterfaceB

public interface MyInterfaceB {

    public abstract void methodB();

    public abstract void methodSchool();  
    }
}

定义实现类:

package cn.luis.demo2.I2;


public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB {
    @Override
    public void methodA() {
        System.out.println("AAA");
    }

    @Override
    public void methodB() {
        System.out.println("BBB");
    }

    @Override
    public void methodSchool() {
        System.out.println("上学去!");
    }
}

默认方法重写

接口中,有多个默认方法时,实现类都可继承使用。如果默认方法有重名的,必须进行覆盖重写一次

例如:游戏和女朋友选哪一个

定义多个接口:

MyInterfaceA

public interface MyInterfaceA {

    public default void methodDefault() {
        System.out.println("妈妈说:先做语文作业");
    }
}

MyInterfaceB

public interface MyInterfaceB {
    
    public default void methodDefault() {
        System.out.println("爸爸说:先做数学作业");
    }
}

定义实现类:

public class MyInterfaceImpl /*extends Object*/ implements MyInterfaceA, MyInterfaceB {
  
    @Override
    public void methodDefault() {  // 实现类覆盖重写默认方法不带default【重要】
        //
        System.out.println("打游戏!");
    }
}

静态方法

接口中,存在同名的静态方法并不会冲突,因为只能通过各自接口名访问静态方法。

继承优先于接口实现

若一个类直接父类(亲爹)当中的方法,和接口中的默认方法重名,优先使用父类中的方法。

定义接口:

public interface MyInterface {

    public default void method() {
        System.out.println("打LOL");
    }
}

定义父类:

public class Fu {

    public void method() {
        System.out.println("玩CSGO");
    }
}

定义子类:

// 6.继承优先于接口实现
public class Zi extends Fu implements MyInterface {
	// 未重写method方法
}

定义测试类:

public class Demo01Interface {

    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.method();  // 父类方法
    }
}

结果:

玩CSGO

总结

接口是没有静态代码块或者构造方法的。

没有构造方法意味着无法创建对象

一个类的直接父类是唯一的,但是一个类可以同时实现多个接口

public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
 // 覆盖重写所有抽象方法
}

如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要重写一次即可

爸爸妈妈都让去上学,一次就行了

若实现类未覆盖重写所有接口当中所有的抽象方法,那么实现类必须是一个抽象类

若实现类所实现的多个接口中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。

游戏和女朋友选哪一个

如果一个类直接父类(亲爹)当中的方法,和接口中的默认方法产生了冲突,优先使用父类中的方法。

继承优先于接口实现

. 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,

默认使用public static final修饰。

实现类覆盖重写接口的默认方法不带default关键字 【重要】

接口的多继承

一个接口能继承另一个或多个接口,这和类之间的继承比较相似。接口的继承使用extends关键字,子接口能继承父接口的方法。

如果父接口中的默认方法重名,那么子接口需要重写一次。

定义父接口

MyInterfaceA

package cn.luis.demo3;

public interface MyInterfaceA {

    public abstract void methodA();
    public abstract void methodCommon();

    public default void methodDefault() {
        System.out.println("先吃鸡蛋");
    }
}

MyInterfaceB

package cn.luis.demo3;

public interface MyInterfaceB {

    public abstract void methodB();
    public abstract void methodCommon();

    public default void methodDefault() {
        System.out.println("先喝粥");
    }
}

定义子接口

这个子接口当中有几个方法? 答:4个

  • methodA()来源于接口A
  • methodB()来源于接口B
  • methodCommon()同时来源于接口A、B
  • methodZi()来源于自己
package cn.luis.demo3;

/*

 */
public interface MyInterfaceZi extends MyInterfaceA, MyInterfaceB {

    public abstract void methodZi();

    // 两个父接口默认方法冲突
    @Override
    public default void methodDefault() {  // 子接口必须进行默认方法的重写【default】
        System.out.println("methodDefault:听我的,先吃油条");
    }
}

你可能感兴趣的:(接口)