Java 变量名长度
在我阅读的文件中,我认为:Java 变量名长度,java,variables,compiler-construction,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,它的变量名为length-3000000个字符。 java文件的大小为~3
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,它的变量名为length-3
000000个字符
。
java文件的大小为~3M
我尝试编译此文件:
javac Test.java
结果我有了Test.class
和size Test.class4
bayts
现在我的问题是:
无限长
.class
文件iiiii..
是一个局部变量,即不能从其他类访问它。因此,它的名字并不重要;编译器不需要存储它。此外,编译器可能会查看您的代码并确定{int i=10;}
实际上没有做任何事情,并且可以被{}
替换,因为这两个版本都产生相同的程序输出(无)。1)如果某些编译器实现有(合理的)限制,而其他人可以处理任意长度的变量名。不幸的是,我不知道任何记录在案的具体例子,也没有任何具体的经验
2) 局部变量名称不必在类文件中维护(它们不能通过反射访问)。试着用这么长的实例变量名创建一个文件,然后查看生成的类文件。编译器可能已经将您真正的长名称更改为“a”之类的无聊名称
变量名是为了方便程序员而存在的。对于编译器和JVM来说,只要它是唯一的,那么它是1个字符还是100万个字符都没有区别。局部变量名并不是这样存储的。它们往往作为编译器优化的一部分被删除,并用数字替换(参见示例) 尝试使用
javac-g
或javac-g:vars
进行编译,应该会留下更多信息,您可以使用javap
进行检查
这应该有关于这个主题的有趣细节
因为您的示例代码实际上并没有做任何事情,所以它很可能被优化为一个空方法。这并不总是正确的。例如,编译器永远不会重命名库中的
public static
变量,这些变量将被其他包引用。@Matt,即使是私有成员也不会被重命名,但据我所知,最初的问题是关于局部变量。否,反编译程序结果:public class Test{public static void main(字符串[]var0){boolean var1=true;}}@user471011如果我不清楚,很抱歉:编译器可以这样优化:您正在使用的特定编译器产品和版本决定不进行优化。如果您的源代码中有一个值为10的int,如何将其反编译为值为true的布尔值?好的,我确实尝试过,并且发现了一些非常有趣的结果!尝试添加System.out.println(一);
在变量声明之后,重新编译,然后使用此服务再次反编译它。您将看到它将被声明为字节
,因为编译器认为它将收到的最大值适合此类型,所以为什么要浪费更多。因为您的第一个版本根本没有使用它,所以编译器甚至懒得使用它将其设置为数字类型,并将其默认为boolean。这在所有实际用途中都与phihag描述的行为相同。