接口【四】继承父类并实现多个接口

接口【四】继承父类并实现多个接口

继承父类接口

使用接口时需要注意:
1.接口没有静态代码块或者构造方法的。
先创建一个接口
在这里插入图片描述

public interface MyInterface{
	//错误写法1,接口不能有静态代码块
	//static{}
	//错误写法2,接口不能有构造方法
	//public MyInterface(){}
}

2.一个类的直接父类是唯一的(有且只有一个),但一个类可以同时实现多个接口。基本格式:public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB{//覆盖重写所有抽象方法}

创建编写一个MyInterfaceA.java接口文件

public interface MyInterfaceA{
	public abstract void methodA();
}

再创建编写一个MyInterfaceB.java接口文件

public interface MyInterfaceB{
	public abstract void methodB();
}

创建一个实现类MyInterfaceImpl.java
在这里插入图片描述

public class MyInterfaceImpl /*extend Object Java中任何一个类都是Object直接或间接子类,可以省略该两个关键字*/ implements MyInterfaceA, MyInterfaceB {
	//快捷方式Alt键+回车,选择Implement methods,再根据需求选择接口的抽象方法来覆盖重写
	@Override
	public void methodA(){
		System.out.println("覆盖重写了A方法")
	}
	
	@Override
	public void methodB(){
		System.out.println("覆盖重写了B方法")
	}
}

3.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次。
1)MyInterfaceA.java接口文件当中编写:

public interface MyInterfaceA{
	public abstract void methodA();
	public abstract void methodAbs();//这是抽象方法
}

2)MyInterfaceB.java接口文件当中编写:

public interface MyInterfaceB{
	public abstract void methodB();
	public abstract void methodAbs();//这是抽象方法
}

3)MyInterfaceImpl实现类文件当中编写:也就是Alt键+回车选择methodAbs():void

public class MyInterfaceImpl /*extend Object Java中任何一个类都是Object直接或间接子类,可以省略该两个关键字*/ implements MyInterfaceA, MyInterfaceB {
	//快捷方式Alt键+回车,选择Implement methods,再根据需求选择接口的抽象方法来覆盖重写
	@Override
	public void methodA(){
		System.out.println("覆盖重写了A方法")
	}
	
	@Override
	public void methodB(){
		System.out.println("覆盖重写了B方法")
	}
	
	@Override
	public void methodAbs(){
		System.out.println("覆盖重写了AB接口都有的抽象方法")
	}
}

4.如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类必须是一个抽象类。
先创建一个实现类文件在这里插入图片描述

public abstract class MyInterfaceImplimplements MyInterfaceA, MyInterfaceB {
	@override
	public void methodA(){}

	@override
	public void methodAbs(){}
}

5.如果实现类所实现的多个接口当中,存在重复默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
在MyInterfaceA.java接口文件编写:

public interface MyInterfaceA{
	public abstract void methodA();
	
	public abstract void methodAbs();
	
	public default void methodDefault(){
		System.out.println("默认方法AAA")
	}
}

在MyInterfaceB.java接口文件编写:

public interface MyInterfaceA{
	public abstract void methodA();
	
	public abstract void methodAbs();
	
	public default void methodDefault(){
		System.out.println("默认方法BBB")
	}
}

在MyInterfaceImpl.java实现类文件编写:

public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
	//快捷方式Alt键+回车,选择Implement methods,再根据需求选择接口的抽象方法来覆盖重写
	@Override
	public void methodA(){
		System.out.println("覆盖重写了A方法")
	}
	
	@Override
	public void methodB(){
		System.out.println("覆盖重写了B方法")
	}
	
	@Override
	public void methodAbs(){
		System.out.println("覆盖重写了AB接口都有的抽象方法")
	}

	@override
	public void methodDefault(){
		System.out.println("对多个接口当中冲突的默认方法进行了覆盖重写")
	}
}

在MyInterfaceAbstract.java实现类文件编写:

public abstract class MyInterfaceImplimplements MyInterfaceA, MyInterfaceB {
	@override
	public void methodA(){}

	@override
	public void methodAbs(){}
	//快捷方式Alt键+回车选择Implement methods,再分析哪个默认接口方法冲突就选择哪个
	@Override
	public void methodDefault(){}
}

6.一个类如果直接实现父类中的方法,和接口中的默认方法产生冲突,优先使用父类中的方法。
先new创建编写一个父类在这里插入图片描述

public class Fu{
	public void method(){
		System.out.println("父类方法");
	}
}

创建一个子类在这里插入图片描述

public class Zi extends Fu implements MyInterface{}

接着创建一个接口在这里插入图片描述

public interface MyInterface {
	public default void method(){
		System.out.println("接口的默认方法");
	}
}

在Java中继承由于接口实现
创建尝试使用在这里插入图片描述

public class Demo01Interface{
	public static void main(String[] args){
		Zi zi = new Zi();
		zi.method();
	}
}

最后运行实现在这里插入图片描述

接口间的多继承

1.类与类之间是单继承的,直接父类只有一个。
2.类与接口之间多实现的,一个类可以实现多个接口。
3.接口与接口之间是多继承的。

在这里插入图片描述

在这里插入图片描述

public interface MyInterfaceA {
	public abstract void methodA();
	public abstract void methodCommon();
}

同理再创建一个MyInterfaceB.java

public interface MyInterfaceB {
	public abstract void methodB();
	public abstract void methodCommon();
}

在这里插入图片描述

public interface MyInterface extends MyInterfaceA, MyInterfaceB{
	public abstract void method();
}

//这个子接口有4个方法
//methodA 来源于接口A
//methodB 来源于接口B
//methodCommon 同时来源于接口A和B
//method 来源自己

创建一个实现类验证有4个方法
在这里插入图片描述

public class MyInterfaceImpl implements MyInterface {
	//Alt键+回车键选择“Implement methods”,接着全选内容
	@Override
	public  void method(){}
	public  void methodA(){}
	public  void methodB(){}
	public  void methodCommon(){}
}

多个父接口中的抽象方法之间有重复,没有关系,因为抽象方法没有方法
但,如果父类接口默认方法之间有重复,那么子接口必须进行默认方法的覆盖重写,而且需要带有default关键字,它的解决方案如下:

比如MyInterfaceA.java的编码为

public interface MyInterfaceA {
	public abstract void methodA();
	public abstract void methodCommon();

	public default void methodDefault(){
		System.out.println(){"AAA"}
	}
}

同样MyInterfaceB.java的编码为

public interface MyInterfaceB {
	public abstract void methodB();
	public abstract void methodCommon();

	public default void methodDefault(){
		System.out.println(){"BBB"}
	}
}

这里两个父类接口的默认方法被子接口继承,则子接口发生错误,子接口需要在MyInterfaceA.java和MyInterfaceB.java两个接口之间的默认方法选择

public interface MyInterface extends MyInterfaceA, MyInterfaceB{
	public abstract void method();
	//Alt键+回车键选择“Implement methods”,接着冲突的默认方法“methodDefault():void”
	@Override
	default void methodDefault(){}
	//public default void methodDefault(){} //新手写法
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值