Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 变量名长度_Java_Variables_Compiler Construction - Fatal编程技术网

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
000
000个字符
。 java文件的大小为~3M

我尝试编译此文件:

javac Test.java
结果我有了
Test.class
和size Test.class
4
bayts

现在我的问题是:

  • 这真的很难,那名字
    无限长
  • 编译器如何翻译我的长度为3000000个字符的变量名,结果我有这么小的
    .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描述的行为相同。