咱们一般所说的接口的做用是用于定义一套标准、约束、规范等,接口中的方法只声明方法的签名,不提供相应的方法体,方法体由对应的实现类去实现。ide
在JDK1.8中打破了这样的认识,接口中的方法能够有方法体,但须要关键字static或者default来修饰,使用static来修饰的称之为静态方法,静态方法经过接口名来调用,使用default来修饰的称之为默认方法,默认方法经过实例对象来调用。code
静态方法和默认方法的做用:orm
静态方法和默认方法都有本身的方法体,用于提供一套默认的实现,这样子类对于该方法就不须要强制来实现,能够选择使用默认的实现,也能够重写本身的实现。当为接口扩展方法时,只须要提供该方法的默认实现便可,至于对应的实现类能够重写也可使用默认的实现,这样全部的实现类不会报语法错误:Xxx不是抽象的, 而且未覆盖Yxx中的抽象方法。对象
IHello接口接口
public interface IHello { // 使用abstract修饰不修饰都行 void sayHi(); static void sayHello(){ System.out.println("static method: say hello"); } default void sayByebye(){ System.out.println("default mehtod: say byebye"); } }
HelloImpl实现类it
public class HelloImpl implements IHello { @Override public void sayHi() { System.out.println("normal method: say hi"); } }
Mainclass
public class Main { public static void main(String[] args) { HelloImpl helloImpl = new HelloImpl(); // 对于abstract抽象方法经过实例对象来调用 helloImpl.sayHi(); // default方法只能经过实例对象来调用 helloImpl.sayByebye(); // 静态方法经过 接口名.方法名() 来调用 IHello.sayHello(); // 接口是不容许new的,若是使用new后面必须跟上一对花括号用于实现抽象方法, 这种方式被称为匿名实现类,匿名实现类是一种没有名称的实现类 // 匿名实现类的好处:不用再单独声明一个类,缺点:因为没有名字,不能重复使用,只能使用一次 new IHello() { @Override public void sayHi() { System.out.println("normal method: say hi"); } }.sayHi(); } }
执行结果:扩展
normal method: say hi default mehtod: say byebye static method: say hello normal method: say hi
这篇文章虽然简单,可是我以为仍是有必要分享一下,毕竟与1.7相比,发生了很多的变化,但愿本文能对你有所帮助。语法