简介
本文介绍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(){
MyInterface myInterface = new MyInterfaceImpl();
myInterface.sayHello();
}
}
public class Demo {
public static void main(String[] args) {
MyInterfaceImpl impl = new MyInterfaceImpl();
impl.test();
}
}
运行结果
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