Java8新特性系列(Interface)

題圖:by pixel2013 From pixabay

在Java8版本之前,Interface接口中全部的方法都是抽象方法常量,那麼在Java8中,Interface有什麼新特性呢?java

靜態成員

在Java8之前,咱們要定義一些常量,通常會寫一個類,類中都是final static的一些變量,以下:微信

public class Constants {
	public static final int MAX_SERVICE_TIME = 100;
}

public class Hello {
	public static void main(String[] args) {
		System.out.println(Constants.MAX_SERVICE_TIME);
	}
}
複製代碼

在Java8中Interface支持靜態成員,成員默認是public final static的,能夠在類外直接調用。函數

public interface MyInterface {
	int MAX_SERVICE_TIME = 100;
}

public class Hello {
	public static void main(String[] args) {
		System.out.println(MyInterface.MAX_SERVICE_TIME);
	}
}
複製代碼

default函數

在Java8之前,Interface中的函數是不能實現的,以下:工具

public interface MyInterface {
	int MAX_SERVICE_TIME = 100;

	void test();
}
複製代碼

在Java8中,Interface中支持函數有實現,只要在函數前加上default關鍵字便可,以下:spa

public interface MyInterface {
	int MAX_SERVICE_TIME = 100;

	void test();
	
	default void doSomething() {
		System.out.println("do something");
	}
}
複製代碼

default函數,實現類能夠不實現這個方法,若是不想子類去實現的一些方法,能夠寫成default函數。設計

在Java8以前,若是咱們想實現這樣的功能,也是有辦法的,那就是先定義Interface,而後定義Abstract Class實現Interface,而後再定義Class繼承Abstract Class,這樣Class就不用實現Interface中的所有方法。code

static函數

在Java8中容許Interface定義static方法,這容許API設計者在接口中定義像getInstance同樣的靜態工具方法,這樣就可以使得API簡潔而精練,以下:cdn

public interface MyInterface {
	default void doSomething() {
		System.out.println("do something");
	}
}

public class MyClass implements MyInterface {

}

public interface MyClassFactory {
	public static MyClass getInstance() {
		return new MyClass();
	}
}
複製代碼

@FunctionalInterface註解

  • 什麼是函數式接口

函數式接口其實本質上仍是一個接口,可是它是一種特殊的接口:SAM類型的接口(Single Abstract Method)。定義了這種類型的接口,使得以其爲參數的方法,能夠在調用時,使用一個Lambda表達式做爲參數。blog

@FunctionalInterface
public interface MyInterface {
	void test();
}
複製代碼

@FunctionalInterface註解能幫咱們檢測Interface是不是函數式接口,可是這個註解是非必須的,不加也不會報錯繼承

@FunctionalInterface
public interface MyInterface {//報錯
	void test();

	void doSomething();
}
複製代碼

Interface中的非default/static方法都是abstract的,因此上面的接口不是函數式接口,加上@FunctionalInterface的話,就會提示咱們這不是一個函數式接口。

  • 函數式接口的做用?

函數式接口,能夠在調用時,使用一個lambda表達式做爲參數。

因此,Java8下一個特性便是Lambda表達式,請看下回詳解。

微信公衆號: 碼上論劍
請關注個人我的技術微信公衆號,訂閱更多內容
相關文章
相關標籤/搜索