public interface DefalutTest {
static int a =5;
default void defaultMethod(){
System.out.println("DefalutTest defalut 方法");
}ide
int sub(int a,int b);spa
static void staticMethod() {
System.out.println("DefalutTest static 方法");
}
}.net
接口裏的靜態方法,即static修飾的有方法體的方法不會被繼承或者實現,可是靜態變量會被繼承 code
例如:咱們添加一個接口DefalutTest的實現類DefaultTestImplorm
public class DefaultTestImpl implements DefalutTest{對象
@Override
public int sub(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}blog
}繼承
以下圖所示是這個實現類中全部可調用的方法:
在這些方法裏面咱們沒法找到staticMethod方法,則說明接口中的static方法不能被它的實現類直接使用。可是咱們看到了defaultMethod,說明實現類能夠直接調用接口中的default方法;
那麼如何使用接口中的static方法呢???
接口.static方法調用,如:DefalutTest.staticMethod();接口
public static void main(String[] args) {
DefaultTestImpl dtl = new DefaultTestImpl();
DefalutTest.staticMethod();
}圖片
當咱們試圖使用接口的子接口去調用父接口的static方法是,咱們發現,沒法調用,找不到方法:
結論:接口中的static方法不能被繼承,也不能被實現類調用,只能被自身調用
二、default方法
準備一個子接口繼承DefalutTest接口
public interface SubTest extends DefalutTest{
}
準備一個子接口的實現類
public class SubTestImp implements SubTest{
@Override
public int sub(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
}
如今咱們建立一個子接口實現類對象,並調用對象中的default方法:
public class Main {
public static void main(String[] args) {
SubTestImp stl = new SubTestImp();
stl.defaultMethod();
}
}
執行結果:
DefalutTest defalut 方法
結論1:default方法能夠被子接口繼承亦可被其實現類所調用
如今咱們在子接口中重寫default方法,在進行調用:
public interface SubTest extends DefalutTest{
default void defaultMethod(){
System.out.println("SubTest defalut 方法");
}
}
執行結果:SubTest defalut 方法
結論2:default方法被繼承時,能夠被子接口覆寫
如今,咱們去除接口間的繼承關係,並使得SubTestImp同時實現父接口和子接口,咱們知道此時父接口和子接口中存在同名同參數的default方法,這會怎麼樣?
以下圖所示,實現類報錯,實現類要求必須指定他要實現那個接口中的default方法
結論3:若是一個類實現了多個接口,且這些接口中無繼承關係,這些接口中如有相同的(同名,同參數)的default方法,則接口實現類會報錯,接口實現類必須經過特殊語法指定該實現類要實現那個接口的default方法
特殊語法:<接口>.super.<方法名>([參數])
示例代碼:
public class SubTestImp implements SubTest,DefalutTest{
@Override
public int sub(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
@Override
public void defaultMethod() {
// TODO Auto-generated method stub
DefalutTest.super.defaultMethod();
}
}
使用示例:
//接口代碼
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
//實現
Formula formula = new Formula() {
@Override public double calculate(int a) { return sqrt(a * 100); } }; formula.calculate(100); // 100.0 formula.sqrt(16); // 4.0