java8对接口的改变

一、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对接口进行注解 ,该接口只能有 一个抽象方法。

    

转载于:https://my.oschina.net/Howard2016/blog/1591057

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值