在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);
}
}
複製代碼
在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
在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();
}
}
複製代碼
函數式接口
?函數式接口其實本質上仍是一個接口,可是它是一種特殊的接口: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表達式,請看下回詳解。