欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

接口的多实现和多继承

程序员文章站 2024-03-18 21:24:40
...

注意

  • 接口中不允许有静态代码块和构造方法(接口不能直接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:听我的,先吃油条");
    }
}

相关标签: # Java基础