无名变量声明 - 为啥它起作用?

Posted

技术标签:

【中文标题】无名变量声明 - 为啥它起作用?【英文标题】:Nameless variable declaration - why does it work?无名变量声明 - 为什么它起作用? 【发布时间】:2013-07-10 06:41:49 【问题描述】:

我很惊讶看到这种行为。

是bug还是什么?

for(Object obj = new Object(), Integer = new Integer(300);
    obj.toString().length()>3;
    System.out.println("on object's loop")) 

 //causes an infinite loop (not foreach loop, of course)

上面的代码编译并运行良好,无需任何参考new Integer(300)。为什么会这样?

我只想知道为什么Integer = new Integer(300); 没有任何参考就可以了。

【问题讨论】:

它声明了一个名为Integer 类型为Object 的新变量,初始值为“一个新的java.lang.Integer,值300”。你有什么问题? 重新打开 -- 这是一个合理的问题(如果可能措辞不当)。 (对于 OP 来说改写标题可能是明智的。) 【参考方案1】:
Object obj = new Object(), Integer = new Integer(300);

这会创建两个变量:

    obj 属于 Object 类型,分配给 new Object()Integer(是的,这是变量的名称也是类型为Object,它被分配给new Integer(300)

顺便说一句,这与for-loop 无关;该行可以自行编译。现在,如果 , 真的是 ;,那就另当别论了。

一般来说,我们可以构造如下形式的有效语句:

Type t1 = ..., t2 = ..., t3 = ..., ...;

相当于

Type t1 = ...;
Type t2 = ...;
Type t3 = ...;
...

【讨论】:

啊!由于逗号,“Integer”被解释为“Object”类型的变量名。 (我从来都不喜欢逗号扩展的声明,因为它们会产生各种错误/混乱的机会。) 并使用整数作为标识符,将这两者混淆了很多。 由于Integer不是Java保留关键字(与int相反),它可以用作变量名。 @LuiggiMendoza:你是对的,正如我所说,这令人困惑。 @Nambari 是的,它是 =\ 但是在您最喜欢的 IDE(eclipse、netbeans、intellij 或其他)中复制粘贴代码时,您会发现它工作正常,并且可能因为没有注意到某些东西而吓坏了简单(发生在我身上=S)【参考方案2】:

我认为他在问为什么 Integer = new Integer(300) 有效。 – arshajii 2 分钟前

Integer 是有效的标识符名称,其类型为 Object,因为

Object obj = new Object(), Integer = new Integer(300);

相当于

int a=2, b=4;

obj.toString() 打印 String(由类名和哈希码组成),其长度 > 3,因此无限循环

【讨论】:

【参考方案3】:
    String String = "foo";
    System.out.println(new String(String));

也是合法的——编译器足够聪明,可以分辨出哪个是变量引用,哪个不是。

【讨论】:

以上是关于无名变量声明 - 为啥它起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不声明实例变量?

为啥/何时应该使用静态声明变量?

为啥 C# 8.0 中使用声明的变量的闭包不同?

为啥在构造函数内部声明和初始化的变量已经在外部以相同的名称声明时被视为不同的变量?

如果在声明变量之前使用了变量,为啥不会抛出 ReferenceError?

为啥要在 main 中声明一个静态变量?