回答
行为是由Java Lanaguage Specification #15.1有关赋值运算符定义取代它。即(重点煤矿):
否则,需要三个步骤:
- 首先,左边的操作数进行评估,以产生可变的。如果此评估突然完成,则由于同样的原因,分配表达式会突然完成;右侧的操作数不会被评估,也不会进行分配。
- 否则,评估右侧操作数。如果此评估突然完成,则由于同样的原因,分配表达式会突然完成,并且不会进行分配。
- 否则,将右侧操作数的值转换为左侧变量的类型,将值集转换(第5.1.13节)转换为相应的标准值集(而不是扩展指数值设置),并将转换结果存储到变量中。
所以表达式str = str = "";
的评价是由右至左,但左边的操作数String str
第一个被评估,并创建变量。
只是为了建立这个...首先创建str的变量引用(String str),然后评估下一个部分 - str = str将str的现有引用传递给str。然后在第三部分中创建一个新的String对象(“”等同于新的String()),然后将其分配给str的引用。所以这是一个完全有效的方案 - 虽然是多余的。 – Dan 2012-08-17 12:09:03
Java允许从右向左分配对象。
以下代码清楚地显示了这一点。
String a;
String b;
String c;
String str = a = b = c = "Hello World!";
没有什么像第二个字符串。
String str = str = ""; // There is only 1 str here and it is declared properly.Thus the compiler doesnt give any error.
String str = a = ""; // This will give Error Though since a is undeclared
在这之前你已经宣布了a,b,c之前,你不是吗? – namalfernandolk 2012-08-17 11:39:42
当然是。我们应该声明变量。 JAVA只支持这种方式的分配。 – Byter 2012-08-17 11:53:22
@ Byter:是Byter。但在我的例子中,看起来第二个str还没有被宣布,并且你将要“”到第二个str,它现在还没有被声明。告诉我什么是我的错。为什么? – namalfernandolk 2012-08-17 12:01:25
编译器为您生成Assignment to variable str has no effect
一个警告,这意味着编译器简单地
String str = "";
根据paragraph 6.3 of Java Language specification,允许在其自己的初始值设定项中使用(局部)变量。
局部变量声明的块中的范围(§14.4)是 其余在其中出现的声明的块,开始 其自己初始化和包括任何进一步说明符到 右边的在局部变量声明语句中。
在初始化之前不允许读取变量,但该语句不会执行该操作。
- 1. 声明和初始化全局变量
- 2. Maya MEL变量声明和初始化
- 3. 声明和初始化结构变量
- 4. 变量声明和初始化在Java中
- 5. scala - 未初始化的变量声明
- 6. 声明和初始化Java开关内的变量
- 7. 声明和初始化在java中
- 8. C++:变量声明初始化顺序
- 9. 初始化静态final变量声明与初始化在Application.OnCreate()
- 10. 变量初始化并声明后可能尚未初始化
- 11. 如果声明中的数组声明和初始化Java
- 12. Java - 对象声明和初始化
- 13. c声明和初始化
- 14. Vb.net声明和初始化
- 15. 在XLST中声明和初始化变量
- 16. JavaScript变量的初始化和声明顺序
- 17. 优选的方式声明和初始化实例/类变量
- 18. C#变量的初始化问题
- 19. 变量的初始化问题
- 20. 问题的实例变量初始化
- 21. 问题初始化的全局变量
- 22. 未初始化的变量问题
- 23. Java实例变量在两个语句中声明和初始化
- 24. PIC18变量声明和初始化失败硬件
- 25. 变量声明,初始化和unamanaged内存分配
- 26. 编程基础:变量声明,初始化,赋值和范围
- 27. C++,而内部声明和初始化变量循环
- 28. C++变量声明和初始化规则
- 29. 范围内多变量声明和初始化
- 30. 如何在Java中的抽象类中声明未初始化的变量?
它为我编译 – 2012-08-17 11:22:34
你为什么认为应该给错误? – roni 2012-08-17 11:29:07
@ roni:原因我认为str(第二个)尚未被声明或初始化。我们一定有什么问题。我想知道那是什么? – namalfernandolk 2012-08-17 11:37:35