java default接口_Java 8 - Interface Default Method接口默认方法

Java 8 相比于Java 7 推出了几大特色(features)(接口默认方法)default methods in interface, (接口静态方法)static method in interface, 函数编程(functional programming), lamda expression, stream API.

这里首先介绍以下默认接口方法

1。什么是默认接口方法

java 8 允许在接口定义并编写实现方法。例子:interface Collection{

void add();

void remove();

//new feature in java 8

//default method

default void put(){

System.out.println("put the key in");

}

}

由例子可以看出,java 8 添加新的关键字 default 用来实现在接口定义并实现一个方法。

2。 为什么需要默认接口方法

默认接口方法的语法很简单, 但是java 8 为何需要引入这个新的概念却大有文章。

这里我举一个现实的例子, 现在我们需要向一个叫collection的接口添加一个新的方法,并且所有实现这个接口的类都可以调用这个方法。 这个在java 7 是可以实现的不过需要向每个实现这个接口的类重新重写override 这个方法。 这样其实很不好, 因为这里需要修改每个实现接口类的方法。 不然没办法通过编译。

但是如果允许接口实现方法即(默认接口方法)可以很好解决这个问题。废话不多说先上例子:interface Collection{

void add();

void remove();

//new requirement: project need add a new method

//but we can‘t overrided the method in each implements classes

//default method is to solve this problems

default void put(){

System.out.println("put the key in");

}

}

class List implements Collection{

@Override

public void add() {

// TODO Auto-generated method stub

}

@Override

public void remove() {

// TODO Auto-generated method stub

}

}

public class WhyNeedDefault {

public static void main(String[] args) {

List list = new List();

list.add();

//now list have new method put

list.put();

}

}

上面例子简单的利用接口默认方法为所有实现collection 接口的类添加的一个新的put方法.并且list 类不需要任何代码修改。最后list.put() 可以直接被调用。

3 使用default interface method 需要注意的一些细节

3.1 当一个类实现多个接口并且多个接口都有相同的方法

假设:IDefaultMethods, IRegular 接口都有一个叫做 void talk()的方法

java8编译器会报错 如果FianlClass2 不重写override talk()方法//error will show if IDM and IRr has the same method define unless overrided the talk method

public class FinalClass2 implements IDefaultMethods, IRegular{

public static void main(String[] args) {

}

@Override

public void move() {

// TODO Auto-generated method stub

}

@Override

public void fly() {

// TODO Auto-generated method stub

}

@Override

public void talk() {

// TODO Auto-generated method stub

System.out.println("final class 2 talk method");

}

3.2 当一个类继承一个类并且实现多个接口。这个父类和多个接口都有相同的方法

假设:ClassA, IDefaultMethods, IRegular 接口都有一个叫做 void talk()的方法

编译结果这个时候可能会另大家失望了,编译器没有报错即使finalclass4 不重写talk() 方法。

因为classA 会被优先调用talk()>接口方法talk()//no error shows even FC4 not overrided the talk method

//error only happen if compiler can‘t figure out which method need to be called

public class FinalClass4 extends ClassA implements IDefaultMethods,IRegular{

@Override

public void move() {

// TODO Auto-generated method stub

}

@Override

public void fly() {

// TODO Auto-generated method stub

}

public static void main(String[] args) {

FinalClass4 fc4 = new FinalClass4();

fc4.talk();  //输出classA 的talk 方法

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值