【Java基础】接口(2):接口中默认/静态/私有方法的定义、使用
从Java 8开始,接口中允许定义默认方法、静态方法
一、接口中默认方法的定义、使用
【默认方法格式】:
public default 返回值类型 方法名称 (参数列表){
方法体
}
接口当中的默认方法,可以解决接口升级的问题。(后期还有新的用法)
场景:当接口中新增抽象方法时,因为实现类需要覆盖重写(实现)接口中所有的抽象方法,否则会报错,如果一个个的手动去重写方法,搁谁都不乐意吧,哈哈哈。
解决途径:新增方法时,改为默认方法,则无需在实现类中挨个重写该新增方法
【默认方法定义、使用】:
1、接口中定义默认方法
public interface MyInterfaceDefault { //抽象方法 public abstract void methodAbs(); //接口中新增抽象方法时,实现类会报错 //public abstract void methodAbs2(); //新添加方法时,解决途径:改成默认方法 public default void methodDefault(){ System.out.println("这是新添加的默认方法"); } }
2、定义了两个实现类
public class MyInterfaceDefaultA implements MyInterfaceDefault{ @Override public void methodAbs() { System.out.println("实现了抽象方法,AAA"); } }
可以看到,上图实现类只重写了一个抽象方法,对于新增的默认方法并未重写;
public class MyInterfaceDefaultB implements MyInterfaceDefault{ @Override public void methodAbs() { System.out.println("实现了抽象方法,BBB"); } @Override public void methodDefault() { System.out.println("实现类B对默认方法进行了覆盖重写"); } }
第二个实现类对默认方法也进行了重写;
3、使用接口的默认方法
/* 1、接口的默认方法,可以通过接口实现类的对象直接调用 2、接口的默认方法,也可以被接口实现类覆盖重写 */ public class Demo02Interface { public static void main(String[] args) { //创建实现类对象 MyInterfaceDefaultA a = new MyInterfaceDefaultA(); a.methodAbs();//实现了抽象方法,AAA //调用默认方法,如果实现类中没有,会向上找接口 a.methodDefault();//这是新添加的默认方法 MyInterfaceDefaultB b = new MyInterfaceDefaultB(); b.methodAbs();//实现了抽象方法,BBB b.methodDefault();//实现类B对默认方法进行了覆盖重写 } }
第一个实现类中没有默认方法,此时会向上找到接口的默认方法,同样可以调用成功;
第二个实现类中对默认方法进行了重写,通过实现类对象直接调用;
二、接口中静态方法的定义、使用
【静态方法格式】:
public static 返回值类型 方法名称 (参数列表){
方法体
}
【静态方法定义、使用】:
1、接口中定义一个静态方法
public interface MyInterfaceStatic { public static void mehtodStatic(){ System.out.println("这是接口的静态方法!"); } }
2、接口中静态方法的使用(这里可以参考类名称.静态方法)
public class Demo03Interface { public static void main(String[] args) { /*错误写法: 不能通过实现类的对象调用静态方法 MyInterfaceStaticImpl impl = new MyInterfaceStaticImpl(); impl.mehtodStatic(); */ //正确用法:通过接口名称.静态方法名 MyInterfaceStatic.mehtodStatic();//这是接口的静态方法! } }
三、接口中私有方法的定义、使用
【私有方法定义、使用】:
从Java 9开始,接口当中允许定义私有方法。
1、普通私有方法:解决多个默认方法之间重复代码问题
格式:
private 返回值类型 方法名称 (参数列表){
方法体
}
2、静态私有方法:解决多个静态方法之间重复代码问题
格式:
private static 返回值类型 方法名称 (参数列表){
方法体
}
案例说明:当我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题。
示例:
public interface MyInterfacePrivate { 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"); } }
代码改造1.0:
public interface MyInterfacePrivate { public default void methodDefault1() { System.out.println("默认方法1"); methodCommon(); } public default void methodDefault2() { System.out.println("默认方法2"); methodCommon(); } public default void methodCommon(){ System.out.println("AAA"); System.out.println("BBB"); System.out.println("CCC"); } }
发现问题:通过改造,避免了代码重复,但同时又可以发现新增共有方法是public,那实现类同样可以访问该方法,不大合理。
解决途径:这个共有方法不应该让实现类使用,应该是私有化的。
代码改造2.0
public interface MyInterfacePrivateA { public default void methodDefault1() { System.out.println("默认方法1"); methodCommon(); } public default void methodDefault2() { System.out.println("默认方法2"); methodCommon(); } private void methodCommon(){ System.out.println("AAA"); System.out.println("BBB"); System.out.println("CCC"); } }
此时共有方法为私有,实现类不能直接访问,问题解决!