從字節碼角度分析接口中的成員域

在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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章