【Java基础】Java8新特性—接口中使用default和static关键字

Rochelle ·
更新时间:2024-09-20
· 890 次阅读

目录一.新特性二.defalut方法三.static方法
接口中的变量默认类型是public static final,也是就是说是 公有静态常量 。 而方法默认是public abstract公有抽象方法,但是事实真的是这样吗? 一.新特性

Java 1.8对接口有两个方面的增强:接口中可以添加使用default或者static修饰的方法

增加default方法:又叫做接口扩展方法,即在不破坏java现有实现架构的情况下能往接口里增加新方法, default关键字可以给接口添加一个非抽象的方法实现,子类可以直接调用!

如果想对接口增加一个新方法,那么需要对实现该接口的所有类进行修改,如果接口实的现类很多,就会带来很大的工作量,而且还很容易破坏以前的代码,带来一些问题。如果把新的方法定义为default方法,就可以避免对其他实现类的修改。尽管如此,Default 方法不适合过多使用

增加static方法: 接口中用static修饰的方法也可以有方法体,和类的静态方法一样,可以通过 接口名.方法名 进行接口中 static方法的调用。

二.defalut方法 实现类会继承接口中的default方法

如果接口A中有default方法:

public interface A { public default void a(){ System.out.println("这是AAA"); } }

B类实现接口A:

public class B implements A{ }

那么B类将会继承接口A中的a方法:

public class Main { public static void main(String[] args) { B b = new B(); b.a(); } }

执行结果:
在这里插入图片描述

如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

为什么要重写呢?是因为,类在继承接口中的default方法时,不知道应该继承哪一个接口中的default方法。

接口A:

public interface A { public default void a(){ System.out.println("这是A"); } }

接口B:

public interface B { public default void a(){ System.out.println("这是B"); } }

Test类:
在这里插入图片描述

com.demo.test.Test inherits unrelated defaults for a() from types com.demo.test.A and com.demo.test.B

可以看出,接口的实现类可以直接调用接口中用default修饰的方法,并且不需要实现该方法(也可以实现)

如果子类继承父类,父类中有a方法,该子类同时实现的接口中也有a方法(被default修饰),那么子类会继承父类的a方法而不是继承接口中的a方法

接口A:

public interface A { public default void a(){ System.out.println("AAA"); } }

类B:

public class B { public void a(){ System.out.println("BBB"); } }

子类C:

public class C extends B implements A{ public static void main(String[] args) { C c = new C(); c.a(); } }

执行结果:
在这里插入图片描述
说明子类继承的b方法为父类C中的b方法,不是接口中的default b(){}方法。

三.static方法

static关键字常用于修饰类的属性和方法,同样,在Java8,static也可以修饰接口的方法

接口A:

public interface A { public static void a(){ System.out.println("AAA"); } }

调用接口A的静态方法:

public class B { public static void main(String[] args) { A.a(); } }

执行结果:
在这里插入图片描述
可以看出,在接口中用static修饰的方法,可以直接用接口名.方法名(这里A.a())调用,并且实现类不能实现接口中static修饰的方法。


作者:oollXianluo



java8 java基础 JAVA DEFAULT static 接口

需要 登录 后方可回复, 如果你还没有账号请 注册新账号