java1.8新特性之介面定義增強
阿新 • • 發佈:2019-02-19
本篇重點:使用default和static定義介面方法
從java發展之初到今天已經經過了20多年的時間了,在這20多年的時間裡所有的java開發者都知道java中的介面是由全域性常量和抽象方法組成。但是從jdk1.8的時代這一組成改變了。
為什麼會改變?
如果說有某一個介面,這個介面隨著時間的發展已經產生了2w個子類。突然發現,這個接口裡的方法不足,應該再增加一個方法,而針對於所有不同的子類,這個方法的功能實現是完全一樣的。按照最初的做法應該在每一個子類上都實現這個新的方法,那麼就要修改2w個子類。
所以為了解決這樣的問題,允許在接口裡面定義普通方法了。但是要定義普通方法就必須明確的使用default
定義default方法:
package com.wonglar.demo;
interface IMessage{
public void print(); //介面中原始的方法
default void fun(){ //這是一個普通方法
System.out.println("很神奇的一個方法。。。。。");
}
}
class MessageImpl implements IMessage{
@Override
public void print() {
System.out.println("Hello World !" );
}
}
public class Demo {
public static void main(String[] args) {
IMessage m = new MessageImpl();
m.print();
m.fun(); //此方法是在介面中直接定義的
}
}
除了使用default定義方法之外,還可以使用static定義方法,一旦使用了static定義方法,意味著這個方法只能由類名稱呼叫。
定義static方法:
package com.wonglar.demo;
interface IMessage{
public void print(); //介面中原始的方法
default void fun(){ //這是一個普通方法
System.out.println("很神奇的一個方法。。。。。");
}
//在介面中定義static方法
static void get(){
System.out.println("直接由介面呼叫!");
}
}
class MessageImpl implements IMessage{
@Override
public void print() {
System.out.println("Hello World !");
}
}
public class Demo {
public static void main(String[] args) {
IMessage m = new MessageImpl();
m.print();
m.fun(); //呼叫介面中的方法
IMessage.get(); //直接由介面呼叫
}
}
在java1.8裡面還有一個重要的概念:內部類訪問方法引數的時候可以不加上final關鍵字,所有出現的這些新特性,完全打破了java已有的程式碼組成形式。
總結:
1、接口裡面使用default和static定義方法的意義是避免子類重複實現同樣的程式碼。
2、介面的使用還應該以抽象方法為主。