Java8 interface 笔记

public class TestInterface {
    public static void main(String[] args) {
        Fly.say();
        Run.say();

        Bird bird = new Bird();
        bird.name();
        bird.action("");
    }
}

interface Fly {
    void name();

    // 子类不能继承静态方法
    static void say() {
        System.out.println("I can fly!");
    }

    default void action(String s) {
        System.out.println("I use " + s + " to fly!");
    }
}


interface Run {
    void name();

    // 子类不能继承静态方法
    static void say() {
        System.out.println("I can run!");
    }

    default void action(String s) {
        System.out.println("I use " + s + " to run!");
    }

}

// 实现多个接口时,有相同的 default 方法,必须重写
class Bird implements Fly, Run {
    @Override
    public void name() {
        System.out.println("I am s bird");
    }

    @Override
    public void action(String s) {
        System.out.println("I use wings to run!");
        System.out.println("I use leg to run!");
    }
}

 

1. 先谈谈JDK8新特性接口

 

在JDK7以及以前的版本中,接口里的方法都是抽象的,并且不能存在静态方法

所有方法的声明都用 public [返回类型] [方法名](参数列表) [抛出异常];

在jdk8中存在2种类型的方法。

1)静态方法 public static [方法名]([参数列表]) [throws 异常列表]

由于Java中可以同时实现多接口,如果2个接口同时存在同名,同参数的静态方法,如果同子类.静态方法,将不知道访问哪一个。

因此不允许使用【子类.父类静态方法】形式访问,不能通过super方法.

InterA interA = new CImpl();

InterA.method(); //只可以父类名访问静态方法

子类实现多个接口,存在的静态方法并不会冲突。因为只能通过各自父类访问父类静态方法。

public class CImpl implements InterA,InterB

其中InterA InterB存在同名静态方法;甚至子类也可以存在同名方法,但是不能用override修饰,因为static方法不能重写

public static void method(){

System.out.println("子类C中的静态方法");

}

2) JDK8还允许存在默认方法 public default void defaultMethod(){} (default不能省略);

子类重写接口默认方法时,必须去掉default。

@Override

public void defaultMethod(){

System.out.println("子类A中的默认方法,必须去掉default修饰符");

}

子类实现多个接口时,如果存在同名的默认方法,子类将不知道继承哪一个,因此编译器要求子类重写父类中的默认方法;不过注意的事,

子类不能用default修饰,default只能修饰接口中的默认方法。

@Override

public void defaultMethod() {

// TODO Auto-generated method stub

Inter8A.super.defaultMethod();

}

 

3)优先级的问题

如果一个类继承一个接口的默认方法,同时又继承了另外一个类的方法。

那么子类的方法优先跟父类的方法行为一致.

Inter8A s = new Son();

s.method(); //此处虽然声明是接口类,但是调用子类的方法,而子类的方法跟父类的一致。

public class MyTest {

 

public static void main(String[] args) {

 

Test1.run2();//接口中定义的静态方法直接调用

Test2.run2();

 

Test test = new Test();

test.show();

test.run1();

test.run3();

 

}

 

}

 

 

 

class Test extends Test3 implements Test1,Test2{

@Override

public void show(){

Test2.super.run1();

}

 

@Override

public void run1() {

Test1.super.run1();

}

 

}

 

 

interface Test1{

void show();

default void run1(){

System.out.println("test1 run1.... ");

}

static void run2(){

System.out.println("test1 run2.....");

}

default void run3(){

System.out.println("test1 run3.... ");

}

}

 

interface Test2{

void show();

default void run1(){

System.out.println("test2 run1.... ");

}

static void run2(){

System.out.println("test2 run2.....");

}

 

}

 

class Test3{

public void run3(){

System.out.println("test3 run3...");

}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值