:
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。
现在我的问题是:
unlimited-length
?? .class
?答案 0 :(得分:5)
iiiiiii..
是一个局部变量,即无法从其他类访问它。因此,它的名字无关紧要;编译器不需要存储它。此外,编译器可能会查看您的代码并确定{int i = 10;}
实际上没有执行任何操作,并且可以由{}
替换,因为两个版本都生成相同的程序输出(无)。
答案 1 :(得分:1)
1)如果某些编译器实现具有(合理的)限制而其他人可以处理任何长度的变量名称,我不会感到惊讶。不幸的是,我不知道任何记录在案的具体例子,也没有任何具体的经验。
2)不必在类文件中维护局部变量名称(它们不能通过反射访问)。尝试制作一个文件,其实例变量名称很长,并查看生成的类文件。
答案 2 :(得分:1)
本地变量名称不会这样存储。它们往往作为编译器优化的一部分被删除,并被数字替换(例如,参见aload_<n>
)。
尝试使用javac -g
或javac -g:vars
进行编译,它应该留下更多信息,您可以使用javap
查看这些信息。
这个answer应该有关于这个主题的有趣细节。
由于您的示例代码实际上并没有执行任何操作,因此可能会将其优化为空方法。
答案 3 :(得分:0)
编译器可能已将您真正的长名称改为像“a”这样无聊的东西。
变量名是为了程序员的方便。对于编译器和JVM来说,只要它是1个字符或100万个就没有区别,只要它是唯一的。