从字节码角度分析接口中的成员域

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

发布了80 篇原创文章 · 获赞 57 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章