这个问题很少有人遇到,但是java中定义的属性或者方法是有上限的,可以粗略的计算为65535,也就是两字节无符号数的最大值;我在这里说的上限不是运行中内存不够之类发生的上限,而是无法通过编译为class字节码文件的上限。
测试结果
首先放出测试结果
我在测试类中什么都没有干,只是不停的在创建int类型的属性,最终在65501处触发了编译错误,而注释掉一个属性编译错误就不会发生。那么65535这个数是怎么来的呢?
字节码文件结构
首先解释下java的编译过程:首先java会把后缀为java的文件通过javac命令把其中的每个类编译为一个后缀为class的文件,其中的内容是以二进制存储的字节码信息,字节码信息包括的内容如下所示:
简单来说包括:魔数、class文件版本、常量池、访问标志、类(接口)索引、字段表、方法表和属性表的集合。其中u1、u2、u4、u8是这些部分的类型,分别代表无符号一字节、二字节、四字节、八字节的类型;看到这里可能你已经猜出来了,这些都是有上限的数字,u2最大就是65535,是不是和这个有关呢?
class文件中常量池的结构存储的是字面量和