所有分类
  • 所有分类
  • 未分类

Java-接口(JDK8新特性等)-详解/实例

简介

本文介绍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
5

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录