2013-10-14 18 views
4

請參閱下面的代碼 -爲什麼編譯器說,在界面中的公共靜態字段是「最終的」,雖然它不是

public interface TestInterface { 
    public static String NON_CONST_B = "" ; 
} 

public class Implemented implements TestInterface { 
    public static String NON_CONST_C = "" ; 
} 

public class AutoFinal { 

    public static String NON_CONST_A = "" ; 

    public static void main(String args[]) { 
     TestInterface.NON_CONST_B = "hello-b" ; 
     Implemented.NON_CONST_C = "hello-c"; 
     AutoFinal.NON_CONST_A = "hello-a" ; 
     Implemented obj = new Implemented(); 
    } 
} 

然而,編譯器抱怨TestInterface.NON_CONST_B是最後 -

AutoFinal.java:6: error: cannot assign a value to final variable NON_CONST_B 
     TestInterface.NON_CONST_B = "hello-b" ; 
       ^
1 error 

爲什麼?

+10

默認情況下,接口中的所有字段都是'public static final',就像所有方法都是'public abstract'一樣。 –

+1

@PeterLawrey,從Java 8開始,方法可以有'default'實現(非'abstract')。請參閱:https://www.journaldev.com/2389/java-8-features-with-examples#interface-default-static-method。 (也允許'static'方法)。 –

+0

@ Mir-Ismaili在Java 1到18.3中,方法的缺省修飾符是'public abstract',但是如果將'default'作爲關鍵字添加到Java 8的方法中,則可以給它一個'public' * default *實現;) Java 9允許將'private'方法添加到接口中。 –

回答

12

關於:

public interface TestInterface { 
    public static String NON_CONST_B = "" ; 
} 

public class AutoFinal {  
    public static void main(String args[]) { 
     TestInterface.NON_CONST_B = "hello-b" ; 
     // .... 
    } 
} 

然而,編譯器抱怨TestInterface.NON_CONST_B是最後 -


但它實際上是最終是否你明確聲明它因爲它是在界面中聲明的。在接口中不能有非最終變量(非常量)。不管它是否被明確聲明,它也是公共和靜態的。

JLS 9.3 Interface Field (Constant) Declarations

在接口的身體的每個字段聲明是隱含公共,靜態和決賽。允許冗餘地爲這些字段指定任何或所有這些修飾符。

3

在java中,所有變量在接口1宣稱是在接口中聲明的公共靜態最終默認

2

變量總是公共靜態最終默認在java中。接口變量是靜態的,因爲Java接口不能單獨實例化;變量的值必須在沒有實例存在的靜態上下文中分配。最終修飾符確保賦給接口變量的值是一個真正的常量,不能被程序代碼重新賦值。

0

由於所有的答案都說默認情況下在Interface中聲明的所有變量都是靜態最終變量。

僅供參考,您不能在界面中聲明static方法。您可以在this SO question. 中找到原因,但是,您可以在可以包含方法和非靜態和非最終變量的接口中聲明Inner Class

相關問題