JDK7及其之前
- 接口的变量都是public final static 全局静态常量,无变化
- 接口中都是抽象abstract方法,不能有static方法(因为abstract和static、final、private不能共存)
JDK1.8及其之后
- 接口中可以添加非抽象方法(static),实现类不能重写,只能通过接口名调用。
- 如果子类中定义了相同名字的静态方法,那就是完全不同的方法了,直接从属于子类。可以通过子类名直接调用
- 接口中可以添加非抽象方法(default),实现类可以重写,只能通过对象名调用
- 实现类可以直接使用default方法,可以重写default方法,但是必须去掉default。(default只能接口中使用)
- 上级接口中default方法的调用:MyInterface.super.method2()
提供非抽象方法的目的
- 为了解决实现该接口的子类代码重复的问题(使用default,当实现类很多的时候,抽象方法加default变成非抽象方法,可以使得实现类 不重写时,使用默认抽象方法)
- 为了既有的成千上万的Java类库的类增加新功能,且不必对这些类重新进行设计。比如只需在Collection接口中增加default Stream<E> stream(),相应的Set和List接口以及它们的子类都包含此的方法,不必为每个子类都重新copy这个方法。
public class Myclass implements MyInterface { @Override public void method1(){ } public static void method2() { System.out.println("----MyClass static method2----"); } @Override public void method3() { System.out.println("----MyClass method-----"); } public static void main(String[] args) { MyInterface.method2(); Myclass.method2(); Myclass mc = new Myclass(); //mc.method2();//不能够通过对象名调用 MyInterface.method2(); mc.method3(); } }
public interface MyInterface { //全局静态常量没有变化 //变化1 抽象方法 void method1(); //2.非抽象方法:static 修饰 不能被实现类重写 只能通过接口名调用 public static void method2() { System.out.println("MyInterface static method"); } //3.非抽象方法: default 修饰 类可以继承也可以重写,只能通过对象名调用不能通过接口名调用 //如果重写 在实现类中去掉default关键字 public default void method3() { System.out.println("------MyInterface default method3-----"); } public static void main(String[] args) { MyInterface.method2(); } }