Java.Variable名称长度

在我阅读的文档中,:

A variables name can be any legal identifier — an **unlimited-length** sequence of Unicode letters and digits 

所以,我创建了这个类:

 class Test{ public static void main(String args[]) { int i=10; }} 

在哪里我 – 它不是我,它的名字长度变量 – 3 000 000 chars 。 大小.java文件~3M。

我尝试编译这个文件:

 javac Test.java 

结果我有Test.class大小Test.class 4 bayts。

现在我的问题是:

  1. 它真的尝试,这个名字unlimited-length
  2. 编译器如何使用长度3000000个字符转换我的变量名称,结果我有这么小的.class文件?

iiiiiii..是一个局部变量,即无法从其他类访问它。 因此,它的名字无关紧要; 编译器不需要存储它。 此外,编译器可能会查看您的代码并确定{int i = 10;}实际上没有执行任何操作,并且可以由{}替换,因为两个版本都生成相同的程序输出(无)。

1)如果某些编译器实现具有(合理的)限制而其他人可以处理任何长度的变量名称,我不会感到惊讶。 不幸的是,我不知道任何记录在案的具体例子,也没有任何具体的经验。

2)不必在类文件中维护局部变量名称(它们不能通过reflection访问)。 尝试使用长实例变量名创建一个文件并查看生成的类文件。

局部变量名称不会这样存储。 它们往往作为编译器优化的一部分被删除,并被数字替换(例如,参见aload_ )。

尝试使用javac -gjavac -g:vars进行编译,它应该留下更多信息,您可以使用javap进行检查。

这个答案应该有关于这个主题的有趣细节。

由于您的示例代码实际上并不执行任何操作,因此可能会将其优化为空方法。

编译器可能已经将你真正的长名称改为像“a”这样无聊的东西。

变量名称是程序员方便的。 对于编译器和JVM来说,只要它是1个字符或100万个就没有区别,只要它是唯一的。