Questions tagged «jls»

14
为什么x ==(x = y)与(x = y)== x不同?
考虑以下示例: class Quirky { public static void main(String[] args) { int x = 1; int y = 3; System.out.println(x == (x = y)); // false x = 1; // reset System.out.println((x = y) == x); // true } } 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧(x = y)进行比较,根据括号中的顺序,应该首先计算该右侧()。 为什么第一个表达式求值false,而第二个表达式求值true?我本来希望(x = y)先被评估,然后再x与自身(3)比较并返回true。 这个问题与Java表达式中子表达式的求值顺序不同,因为x这里绝对不是“子表达式”。需要加载它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的x == (x = y),与通常为棘手的面试问题设计的牵强的不切实际的构造不同,该表达式来自一个真实的项目。它原本应该是“一键替换”成语的单行替换 …

2
有效最终与最终-不同的行为
到目前为止,我认为有效的final和final或多或少是等效的,并且JLS将在实际行为上将它们视为相同或相似的内容。然后我发现了这个人为的场景: final int a = 97; System.out.println(true ? a : 'c'); // outputs a // versus int a = 97; System.out.println(true ? a : 'c'); // outputs 97 显然,JLS在这两者之间起了重要的作用,我不确定为什么。 我读了其他主题 最终和有效最终之间的区别 有效的最终变量与最终变量 变量“有效最终”是什么意思? 但它们没有详细说明。毕竟,从更广泛的意义上讲,它们似乎是等效的。但是深入研究,它们显然有所不同。 是什么导致此行为,任何人都可以提供一些解释此问题的JLS定义吗? 编辑:我发现了另一个相关的方案: final String a = "a"; System.out.println(a + "b" == "ab"); // outputs true // …

4
为什么我们不能通过未初始化的局部变量访问静态内容?
看下面的代码: class Foo{ public static int x = 1; } class Bar{ public static void main(String[] args) { Foo foo; System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized } } 如您所见,尝试x通过未初始化的局部变量Foo foo;代码访问静态字段时会foo.x生成编译错误:Variable 'foo' might not have been initialized。 它可能看起来像这样的错误是有道理的,但直到我们意识到,访问static成员的JVM不实际使用的价值变量,但只有它的类型。 例如,我可以foo使用value进行初始化,null这将使我们能够x毫无问题地进行访问: Foo foo = null; System.out.println(foo.x); //compiles and at …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.