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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值