1. 程式人生 > >java 介面中用private、protected、public、default和status修飾方法和變數

java 介面中用private、protected、public、default和status修飾方法和變數

通常使用java 的介面時都是不帶修飾符的
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介面的功能還是需要在使用中慢慢理解,掌握其中微妙的變化帶來的不同功能。