一、java8对接口的改变
1、增加了default方法和static方法,这两种方法完全可以有方法体。
2、default方法属于实例,static方法属于类(接口)。
3、接口中的静态方法不会被继承,而静态变量可以被继承。
4、如果一个类实现了多个接口,并且这些接口之间没有继承关系,同时又存在相同的默认方法,
会报错:不相关默认值; 如果多个接口有继承关系,默认方法会被子接口覆盖。5、如果遇到一个类实现了多个接口,这些接口之间没有继承关系,但是存在相同的默认方法,实现 类可以通过特殊的语法指定要访问那个接口的默认方法
在实现类(或子接口)中重写默认方法,在方法里面写: <接口名>.super.<方法名>([参数]); 示例: 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) *Title: test2
*Description:
* @see com.lty.java8.TestInter2#test2() */ //子接口可以重写父接口的默认方法 @Override default void test2() { TestInter2.super.test2(); } }//实现了两个接口,但是静态方法不会被继承class TestInterface implements TestInter,TestInter2{ /* (非 Javadoc) *Title: test2
*Description:
* @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方法无限制)@FunctionalInterfaceinterface TestFunctionalInterface3{ void test(); static void test2(){ System.out.println("test2"); }}//找到多个抽象方法,不是函数式接口,不能使用@FunctionalInterface注解//@FunctionalInterfaceinterface 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对接口进行注解 ,该接口只能有 一个抽象方法。