Java.Variable名称长度

时间:2010-12-05 16:08:58

标签: java variables compiler-construction

在我阅读的文档中

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;
}}

其中i - 不是i,其名称长度为3 000 000 chars的变量。 大小.java文件~3M。

我尝试编译这个文件:

javac Test.java

结果我的Test.class大小为Test.class 4 bayts。

现在我的问题是:

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

2)不必在类文件中维护局部变量名称(它们不能通过反射访问)。尝试制作一个文件,其实例变量名称很长,并查看生成的类文件。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

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