一、java8对接口的改变
1、增加了default方法和static方法,这两种方法完全可以有方法体。
2、default方法属于实例,static方法属于类(接口)。
3、接口中的静态方法不会被继承,而静态变量可以被继承。
4、如果一个类实现了多个接口,并且这些接口之间没有继承关系,同时又存在相同的默认方法,
会报错:不相关默认值;
如果多个接口有继承关系,默认方法会被子接口覆盖。
5、如果遇到一个类实现了多个接口,这些接口之间没有继承关系,但是存在相同的默认方法,实现 类可以通过特殊的语法指定要访问那个接口的默认方法
在实现类(或子接口)中重写默认方法,在方法里面写:
<接口名>.super.<方法名>([参数]);
示例:
@Override
public void test2() {
TestInter2.super.test2();
}
6、如果一个接口只有一个抽象方法(包括继承的),该接口是一个函数式接口,函数式接口可以使用Lambda表达式实现。
7、如果接口里面使用FunctionalInterface注解,限定接口里面只能有一个抽象方法。
二、代码描述
1、TestInterfaceMain.java
/**
* @Title: TestInter.java
* @Package com.lty.java8
* @Description: TODO
* @author Liu
* @date 2017年12月17日 上午11:40:05
* @version V1.0
*/
package com.lty.java8;
/**
* @ClassName: TestInter
* @Description: TODO
* @author Liu
* @date 2017年12月17日 上午11:40:05
*
*/
interface TestInter {
static void test1(){
System.out.println("TestInter里面的静态方法");
}
default void test2(){
System.out.println("TestInter里面的默认方法");
}
default void test3(){
System.out.println("TestInter里面的test3方法");
}
}
//静态方法不会被继承
interface TestInter2 //extends TestInter
{
static void test1(){
System.out.println("TestInter2里面的静态方法");
}
default void test2(){
System.out.println("TestInter2里面的默认方法");
}
}
interface TestInter3 extends TestInter,TestInter2{
/* (非 Javadoc)
* <p>Title: test2</p>
* <p>Description: </p>
* @see com.lty.java8.TestInter2#test2()
*/
//子接口可以重写父接口的默认方法
@Override
default void test2() {
TestInter2.super.test2();
}
}
//实现了两个接口,但是静态方法不会被继承
class TestInterface implements TestInter,TestInter2{
/* (非 Javadoc)
* <p>Title: test2</p>
* <p>Description: </p>
* @see com.lty.java8.TestInter2#test2()
*/
//实现类可以重写父接口的默认方法
@Override
public void test2() {
// TODO Auto-generated method stub
TestInter2.super.test2();
}
}
public class TestInterfaceMain{
public static void main(String[] args) {
TestInter.test1();
TestInter2.test1();
TestInterface ti = new TestInterface();
ti.test2();
}
}
2、TestFunctionalInterface.java
/**
* @Title: TestFunctionalInterface.java
* @Package com.lty.java8
* @Description: TODO
* @author Liu
* @date 2017年12月17日 下午5:14:06
* @version V1.0
*/
package com.lty.java8;
interface TestFunctionalInterface1{
void test();
}
//没有抽象方法的接口是普通接口,这种接口通常用于标记使用,例如java的序列化
interface TestFunctionalInterface2{
}
//使用@FunctionalInterface的接口,有且仅有一个抽象方法(static方法和default方法无限制)
@FunctionalInterface
interface TestFunctionalInterface3{
void test();
static void test2(){
System.out.println("test2");
}
}
//找到多个抽象方法,不是函数式接口,不能使用@FunctionalInterface注解
//@FunctionalInterface
interface TestFunctionalInterface4{
void test();
void test2();
}
/**
* @ClassName: TestFunctionalInterface
* @Description: TODO
* @author Liu
* @date 2017年12月17日 下午5:14:06
*
*/
public class TestFunctionalInterface {
}
二、java8接口的变化总结
1、静态方法和默认方法,方法前面使用static或者default进行修饰,这种方法必须有方法体;
2、如果一个接口只有一个抽象方法,默认自动变为函数式接口;
3、如果使用了FunctionalInterface对接口进行注解 ,该接口只能有 一个抽象方法。