接口【二】接口方法的定义和使用
一、定义默认方法及使用
从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();
}
}