在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会设置相应的值。