在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表示式,請看下回詳解。