Java8新特性系列(Interface)

史培培發表於2018-02-08

題圖:by pixel2013 From pixabay

在Java8版本以前,Interface介面中所有的方法都是抽象方法常量,那麼在Java8中,Interface有什麼新特性呢?

靜態成員

在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關鍵字即可,如下:

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中的全部方法。

static函式

在Java8中允許Interface定義static方法,這允許API設計者在介面中定義像getInstance一樣的靜態工具方法,這樣就能夠使得API簡潔而精練,如下:

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表示式作為引數。

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

@FunctionalInterface註解能幫我們檢測Interface是否是函式式介面,但是這個註解是非必須的,不加也不會報錯

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

	void doSomething();
}
複製程式碼

Interface中的非default/static方法都是abstract的,所以上面的介面不是函式式介面,加上@FunctionalInterface的話,就會提示我們這不是一個函式式介面。

  • 函式式介面的作用?

函式式介面,可以在呼叫時,使用一個lambda表示式作為引數。

所以,Java8下一個特性即是Lambda表示式,請看下回詳解。

Java8新特性系列(Interface)

微信公眾號:碼上論劍
請關注我的個人技術微信公眾號,訂閱更多內容

相關文章