简介
本文介绍Java的接口知识。包括:JDK8新特性(default、static),匿名内部类。
default
简介
JDK1.8增加default方法。
接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制) 。之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类。
default使得开发者可以在不破坏二进制兼容性的前提下,往现存接口中添加新的方法,即不强制那些实现了该接口的类也同时实现这个新加的方法。
二进制兼容性:指的就是在升级(也可能是 bug fix)库文件的时候,不必重新编译使用这个库的可执行文件或使用这个库的其他库文件,程序的功能不被破坏。
实际开发中应该谨慎使用:在复杂的继承体系中,默认方法可能引起歧义和编译错误。
实例
package com.example; interface MyInterface{ default void sayHello(){ System.out.println("sayHello"); } } class MyInterfaceImpl implements MyInterface{ public void test(){ } } public class Demo { public static void main(String[] args) { MyInterfaceImpl myInterface = new MyInterfaceImpl(); myInterface.sayHello(); } }
运行结果
sayHello
注意:如果两个接口都用default修饰同一方法,则会报错
package com.example; interface MyInterface1{ default void sayHello(){ System.out.println("sayHello(1)"); } } interface MyInterface2{ default void sayHello(){ System.out.println("sayHello(2)"); } } class MyInterfaceImpl implements MyInterface1,MyInterface2{ public void test(){ MyInterface1 myInterface = new MyInterfaceImpl(); myInterface.sayHello(); } } public class Demo { public static void main(String[] args) { MyInterfaceImpl impl = new MyInterfaceImpl(); impl.test(); } }
解决办法:在实现类中重写该方法。
package com.example; interface MyInterface1{ default void sayHello(){ System.out.println("sayHello(1)"); } } interface MyInterface2{ default void sayHello(){ System.out.println("sayHello(2)"); } } class MyInterfaceImpl implements MyInterface1,MyInterface2{ public void test(){ MyInterface1 myInterface = new MyInterfaceImpl(); myInterface.sayHello(); } @Override public void sayHello() { System.out.println("sayHello(Impl)"); } } public class Demo { public static void main(String[] args) { MyInterfaceImpl impl = new MyInterfaceImpl(); impl.test(); } }
运行结果
sayHello(Impl)
static
JDK1.8新增了static函数。static修饰的方法也是非抽象方法,有自己的方法体,在接口中定义一个静态方法,该方法可以直接用< 接口名.方法名() >的形式来调用。相当于调用类的静态方法一样
package com.example; interface MyInterface{ static void sayHello(){ System.out.println("sayHello"); } } public class Demo { public static void main(String[] args) { MyInterface.sayHello(); } }
运行结果
sayHello
请先
!