在继承体系中,一个类只能继承一个父类,而对于接口而言,一个类是可以实现多个接口的。
这种叫做接口的多实现。一个类能继承一个父类,且同时实现多个接口。
格式:
【】 :表示可选操作。
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()
来源于接口AmethodB()
来源于接口BmethodCommon()
同时来源于接口A、BmethodZi()
来源于自己package cn.luis.demo3;
/*
*/
public interface MyInterfaceZi extends MyInterfaceA, MyInterfaceB {
public abstract void methodZi();
// 两个父接口默认方法冲突
@Override
public default void methodDefault() { // 子接口必须进行默认方法的重写【default】
System.out.println("methodDefault:听我的,先吃油条");
}
}