在java中接口是可以有成員變量的,比如下面源碼:
public interfaceTestInterface {
int a = 999;
Stringstr= "hello world";
}
字節碼:
Last modified 2017-7-23; size 213 bytes
MD5checksum 60dbee19d1d48536e2145bd213a5c86e
Compiledfrom "TestInterface.java"
public interface TestInterface
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
#1= Class #2 // TestInterface
#2= Utf8 TestInterface
#3= Class #4 // java/lang/Object
#4= Utf8 java/lang/Object
#5= Utf8 a
#6= Utf8 I
#7= Utf8 ConstantValue
#8= Integer 999
#9= Utf8 str
#10= Utf8 Ljava/lang/String;
#11= String #12 // hello world
#12= Utf8 hello world
#13= Utf8 SourceFile
#14= Utf8 TestInterface.java
{
public static final int a;
descriptor: I
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: int 999
public static final java.lang.String str;
descriptor: Ljava/lang/String;
flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
ConstantValue: String hello world
}
SourceFile: "TestInterface.java"
--可以看到,接口中定義的兩個變量被編譯器加上了public static final這三個限定詞,所以在java中只能存在public static final變量。如果你沒寫,編譯器會幫你寫上,如果你違法了那麼編譯器就會抱錯通不過。另外需要注意的是編譯器對接口不會和正常類一樣幫忙添加clinit方法和構造方法。而是在變量定義段多了一個ConstantValue屬性。因爲對於這種常量變量而言,是不屬於clinit方法和構造方法初始化的。並且在類加載的準備階段JVM會設置相應的值。