接口【二】接口方法的定义和使用

一、定义默认方法及使用

从Java8开始接口可以定义默认方法,基本定义格式:

public default 返回值类型 方法名称(参数列表){
	方法体
}

ps: 接口当中的默认方法可以解决接口升级的问题。

先new创建一个接口
在这里插入图片描述
public class MyInterfaceDefault 改为 public interface MyInterfaceDefault即可将class文件改为Interface文件在这里插入图片描述
具体代码如下:

public interface MyInterfaceDefault{
	// 抽象方法
	public abstract void methodAbs();
}

编写实现类A,new在这里插入图片描述
(创建时没有文件名没有+Impl)

public class MyInterfaceDefaultA implements MyInterfaceDefault{
	@Override
	public void methodAbs(){
		System.out.println("实现了抽象方法,A")
	}
}

再创建编写一个实现类B做对比

public class MyInterfaceDefaultB implements MyInterfaceDefault{
	@Override
	public void methodAbs(){
		System.out.println("实现了抽象方法,B")
	}
}

进行接口升级,在接口中添加一个新的抽象方法,MyInterfaceDefault.java文件的代码更新如下:

public interface MyInterfaceDefault{
	// 抽象方法
	public abstract void methodAbs();
	
	// 新添加一个抽象方法
	public abstract void methodAbs2();
}

因为新添加的方法是抽象的,那么MyInterfaceDefaultA和MyInterfaceDefaultB实现类都要覆盖重写,不然会报错,但需求是不能修改这两个实现类,则需要有一个默认的方法(继续改写):

public interface MyInterfaceDefault{
	// 抽象方法
	public abstract void methodAbs();
	
	// 新添加一个抽象方法
	//public abstract void methodAbs2();
	
	//新添加的方法改为默认方法
	public default void methodDefault(){
		System.out println("这是新添加的默认方法")
	}
}

MyInterfaceDefaultA和MyInterfaceDefaultB实现类不再报错

最后进行使用,new一个在这里插入图片描述

public class Demo02Interface {
	public static void main(String[] args){
		//创建实现类对象
		MyInterfaceDefaultA a = new MyInterfaceDefaultA();
		a.methodAbs();//调用抽象方法,实际上运行右侧实现类
		//调用默认方法,若实现类当中没有,则会向上找接口
		a.methodDefault();
		MyInterfaceDefaultA b = new MyInterfaceDefaultB();
		b.methodAbs();
		b.methodDefault();
	}
}

编写完后执行在这里插入图片描述
1.接口的默认方法可以通过接口实现类对象直接调用
2.接口的默认方法也可以呗接口实现类进行覆盖重写

覆盖重写一下MyInterfaceDefault,再编写MyInterfaceDefaultB.java文件

public class MyInterfaceDefaultB implements MyInterfaceDefault{
	@Override
	public void methodAbs(){
		System.out.println("实现了抽象方法,B")
	}

	@Override
	public void methodDefault(){
		System.out.println("实现类B覆盖重写了接口的默认方法")
	}
}

再一次执行Demo02Interface

public class Demo02Interface {
	public static void main(String[] args){
		//创建实现类对象
		MyInterfaceDefaultA a = new MyInterfaceDefaultA();
		a.methodAbs();//调用抽象方法,实际上运行右侧实现类
		//调用默认方法,若实现类当中没有,则会向上找接口
		a.methodDefault();//这是新添加的默认方法
		MyInterfaceDefaultA b = new MyInterfaceDefaultB();
		b.methodAbs();
		b.methodDefault();//实现类B覆盖重写了接口的默认方法
	}
}

发现区别在这里插入图片描述

二、定义静态方法及使用

从Java8开始接口中可以定义静态方法,基本定义格式:

public static 返回值类型 方法名称(参数列表) {
	方法体
}

ps: 也就是将abstract或则default换成static,并带上方法体

先new创建一个静态方法接口
在这里插入图片描述

public interface MyInterfaceStatic {
	public static void methodStatic(){
		System.out.println("这是接口的静态方法")
	}
}

编写静态方法实现类:
在这里插入图片描述

public class MyInterfaceStaticImpl implements MyInterfaceStatic{
	//因为没有抽象方法,所以不用覆盖重写
}

编写静态方法的使用
在这里插入图片描述

public class Demo03Interface {
	public static void main(String[] args){
	//创建了实现类对象
	MyInterfaceStaticImpl impl = new MyInterfaceStaticImpl();
	//错误写法
	//impl.methodStatic();
	//不能通过接口实现类的对象来调用接口当中的静态方法
	//正确用法:通过接口名称,直接调用其中的静态方法,格式:
	//接口名称.静态方法名称(参数);
	MyInterfaceStatic.methodStatic();
	}
}

静态和对象没有关系,只和类有关系

三、定义私有方法及使用

如果有方法体的两个方法之间重复内容太多了,则需要抽取一些调用,如下:

先new创建一个接口
在这里插入图片描述
其中可以有默认方法

public interface MyInterfacePrivateA{
	public default void methodDefault1(){
		System.out.println("默认方法1");
		System.out.println("AAA");
		System.out.println("BBB");
		System.out.println("CCC");
	}
	
	public default void methodDefault2(){
		System.out.println("默认方法2");
		System.out.println("AAA");
		System.out.println("BBB");
		System.out.println("CCC");
	}
}

可以发现两个默认方法之间有重复的输出,因此需要把重复的内容写一个公共方法进行调用,但这个公共方法不应该被实现类使用,应该是私有化的。
解决方案:从Java9开始接口中可以定义私有方法 1.普通私有方法,解决多个默认方法之间重复代码问题,格式: private 返回值类型 方法名称(参数列表){ 方法体 } 2.静态私有方法,解决多个静态方法之间重复代码问题,格式: private static 返回值类型 方法名称(参数列表){ 方法体 }

public interface MyInterfacePrivateA{
	public default void methodDefault1(){
		System.out.println("默认方法1");
		methodCommon();
	}
	
	public default void methodDefault2(){
		System.out.println("默认方法2");
		methodCommon();
	}

	//public default void methodCommon(){}---错误写法---会被其他实现类直接访问到接口中的默认方法
	private void methodCommon(){
		System.out.println("AAA");
		System.out.println("BBB");
		System.out.println("CCC");
	}
}

编写默认方法的实现类
在这里插入图片描述

public class MyInterfacePrivateAImpl implements MyInterfacePrivateA{
	public void methodAnother(){
	methodCommon();
	}
}

(没有编写默认私有化写法的使用,其和之前定义默认方法的使用的类似的)

同理可得静态私有化写法,先new创建一个接口,编写代码

public interface MyInterfacePrivateA{
	public static void methodStatic1(){
		System.out.println("默认方法1");
		methodCommon();
	}
	
	public static void methodStatic2(){
		System.out.println("默认方法2");
		methodCommon();
	}

	//public default void methodCommon(){}---错误写法---会被其他实现类直接访问到接口中的默认方法
	private static void methodStaticCommon(){
		System.out.println("AAA");
		System.out.println("BBB");
		System.out.println("CCC");
	}
}

静态私有化方法的使用
在这里插入图片描述

public class Demo04Interface{
	public static void main(String[] args){
		MyInterfacePrivateB.methodStatic1();
		MyInterfacePrivateB.methodStatic2();
		//错误写法
		//MyInterfacePrivateB.methodStaticCommon();
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值