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

这篇博客介绍了Java接口从Java8开始引入的新特性,包括默认方法、静态方法和私有方法的定义与使用。默认方法解决了接口升级时避免修改已有实现类的问题,静态方法允许在接口中定义类级别的行为,而私有方法则为接口内部提供辅助功能,不对外暴露。示例代码展示了这些方法的实现和调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【接口系列】

接口【一】概述与举例
接口【三】接口的常量定义及使用和总结
接口【四】继承父类并实现多个接口

一、定义默认方法及使用

从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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值