2015年4月3日 星期五

Java interface中定義變數是合法的?!

最近被朋友聊天的時候聊到一個問題: "Interface中定義變數(field)是合法的?!"

描述

為啥要討論這問題呢? 請各位看官看看以下的描述 from Wikipedia: Interface (Java)
==================================================
介面通常以interface來宣告,它僅能包含方法簽名(Method Signature)以及常數宣告(變數宣告包含了 static 及 final),一個介面不會包含方法的實作(僅有定義)。
==================================================

接著來看個範例吧
interface ControllStatus {
       String QAQ = "qaq";
}

public class Test {
    public static void main (String[] args){
        System.out.println(ControllStatus.QAQ);
    }
}

執行結果如下:


討論

在上述的範例中interface定義了QAQ字串竟然能正常執行!!!
但是Wikipedia的描述中卻說介面只宣告不包含定義,除非用static及final來宣告

根據其他OO的語言,直覺上Java應該是將上述的程式碼偷偷加入public static final的修飾
  1. public: 公開
  2. static:   程式一開始時就被配置記憶體且擁有"唯一"的特性
  3. final:     不可修改

由此可以猜測Java是不是偷偷地把interface中定義的變數弄成public, static and final,接著來看以下兩個Stack Overflow的討論吧
  Why are interface variables static and final by default?
  Is “public static final” redundant for a constant in a Java interface?

這兩個討論都提到Java隱含式的轉換變數為public, static and final
但是Stack Overflow終究是個討論區,接下來我們直接看Java的技術文件吧:
  Chapter 9. Interfaces
      -- 9.3. Field (Constant) Declarations
  Every field declaration in the body of an interface is implicitly public, static, and final. It is permitted to redundantly specify any or all of these modifiers for such fields.

顯然的Java真的做了隱含式轉換,所有interface內的filed會被轉換成public static final,因此上述的程式碼不僅正確,該filed還是唯一且不可變的物件!

參考資料

1. Wikipedia: 介面 (Java)
2. Stack Overflow: Why are interface variables static and final by default?
3. Stack Overflow: Is “public static final” redundant for a constant in a Java interface?
4. Oracle Java Language Specification Chapter 9. Interfaces: 9.3. Field (Constant) Declarations

沒有留言:

張貼留言