java 介面中用private、protected、public、default和status修飾方法和變數
public interface Test {
int a = 0;
void test();
}
其實這個裡面有好多修飾符都是預設省略掉了。
正確的型別應該是:
public interface Test {
public static final int a = 0;
public void test();
}
省略的都是預設必須要帶的修飾。
介面中除了這幾個常見的方法和屬性外還有一些其他用法。
1、靜態方法
靜態方法必須要有方法體,並且靜態方法是不能被實現類實現的,只能通過介面呼叫這個方法,例如:Test.test2();
public interface Test { public static final int a = 0; public void test(); public static void test2(){ //正確的 } public static void test3();//錯誤的 }
2、java1.8 default修飾方法
default加入就是為了解決介面中不能有預設方法的問題,在實現類中可以重寫這個default方法也可以不重寫。
default修飾的方法跟介面中的靜態方法區別是default方法可以被實現類重寫,這樣可以得到擴充套件並且不修改原來介面中功能,而靜態方法就有點太苛刻了,還不如把靜態方法寫在實現類中,這樣每個實現類都可以自己寫自己的功能實現。
public interface Test { public static final int a = 0; public void test(); public static void test2(){ System.out.println("test2"); } default void test3(){ } default void test4();//錯誤,default修飾方法必須要有實現體 }
3、錯誤情況
在介面中方法都是不能用private和protected修飾的,這兩種修飾就違背了面向物件的原則。
private好理解,介面是需要被實現才有意義的,不能被實現也就沒有意義了。
protected需要理解面向物件的概念,protected是不在一個包內不能被訪問,所以在類和介面不在同一個包內時就會有問題。
假設public介面I有一個protected方法M,那麼位於其他包的public類C就可以實現這個介面(方法M依然是protected)。那麼C的同包類D呼叫方法M只能這樣訪問:
C c = new C();
c.M();
無法這樣訪問:I c = new C(); c.M();
這樣就失去了使用介面的重要意義:提供統一的介面,面向介面程式設計思想也無法體現。
4、為什麼介面中的屬性必須是public static final 修飾的
public跟方法的原因一樣了
static:我們假設有兩個介面A和B,而類C實現了介面A和B。假設,此時,A和B中都有一個變數N,如果N不是static型別的,那麼在C中該如何區分N到底是A的還是B的呢?而,如果是static型別的,我們可以通過A.N和B.N來區別呼叫A或者B中的成員變數N。
final:介面是一種通用的協議存在的,多個類實現同一個介面可以方便針對這個介面的呼叫類對接,所以final就是為了禁止在介面中不同的實現類修改屬性造成混亂。如果變數不是final,那麼每個實現介面的類就可以更改這個變數的值,也就違反了OCP(開閉原則)原則。
對於java介面的功能還是需要在使用中慢慢理解,掌握其中微妙的變化帶來的不同功能。