我想知道子句中Boolean.TRUE
和true
值之间的区别if
。当我使用Boolean.TRUE
而不是时,为什么会给我一个编译错误(一个值可能尚未初始化)true
。
下面是我的代码:
public class Test {
public void method1() {
int x;
if(Boolean.TRUE) {
x = 200;
}
System.out.println("x: " + x); // Compilation error
}
public void method2() {
int x;
if(true) {
x = 200;
}
System.out.println("x: " + x); // Compiles fine
}
}
简短答案
对于if (true)
编译器,可以推断出x
在读取之前已初始化的内容。这并非if (Boolean.TRUE)
如此。
正式答案: 在读取之前,
所有局部变量都必须有一个 确定的赋值
(14.4.2。局部变量声明的执行):
[…]如果声明符没有初始化表达式, 则对变量的每次引用都必须在对变量的赋值之前执行 ,否则第16条的规则会发生编译时错误。
在这种情况下if
,在变量引用之前的代码中包含一条语句,因此编译器执行一些流分析。但是,如第16章所述。明确分配:
除了对条件布尔运算符
&&
,||
和? :
和 布尔值常量表达式 的特殊处理外,在流分析中不考虑 表达式 的值。
因此,由于true
是一个布尔值常量表达式,并且Boolean.TRUE
(它是对堆中值的引用,因此需要自动拆箱等),因此它不是
if (true) {
x = 200;
}
产生x
while 的明确分配
if (Boolean.TRUE) {
x = 200;
}
才不是。
为什么在Python中比慢?难道不应该比快吗? 我试图学习模块。从基础开始,我尝试了这些: null 注意:我运行三次,取结果的平均值,然后将时间和代码一起张贴在这里。 这个问题与如何做微基准测试无关(我在这个例子中做了,但我也明白它太基础了),而是为什么检查一个‘真’变量比一个常量慢。
问题内容: PS:我了解“真实”与真实之间的区别。 编辑:我也明白Boolean.TRUE是原始true的包装,然后我的问题是-为什么原始boolean接受Boolean.TRUE作为值?例如, 似乎是一个有效的声明。 问题答案: 原因 之所以 起作用 ,是因为 autounboxing 是Java 5的一项功能,该功能允许包装器对象在需要时自动转换为其等效的原始对象。相反, autoboxing
问题内容: 给出以下代码: 为什么会这样?我以为布尔值会被强制转换为数字。因此变得和变。第二条if语句很有意义,但是我不明白为什么第一条语句导致要评估内部循环。这里发生了什么? 问题答案: 它被强制转换为布尔值。任何非空字符串的求值为true。 根据[ECMAScript语言规范]: ## 12.5 声明 ### 语义学 生产 IfStatement : Expression Statement
为什么以下输出为True? 这将始终输出,即使条件似乎表明并非如此。如果我删除括号,那么它可以工作,但我不明白为什么。
问题内容: 当用于运行“ ”(仅作为示例)时,在Windows上我们得到以下信息: 因此,可以按照我的期望很好地打印出该版本。但是在Linux上,我们得到以下信息: 因为gcc尚未收到该选项。 文档没有明确指定Windows下的args应该发生什么,但是它确实说在Unix上, “如果args是一个序列,则第一项指定命令字符串,任何其他项都将被视为其他shell参数。 。” 恕我直言,Windows
问题内容: 今天,我刚刚发现了一个问题,因为我的一个单元测试由于从Java 7升级到Java 8而失败了。该单元测试调用一个方法,该方法试图在子类上注释的方法上找到注释,但返回类型不同。 在Java 7中,似乎只有在代码中确实声明了注释时,才会找到注释。在Java 8中,似乎包含在子类中声明的注释。 为了说明这一点,我创建了一个简单的(??)测试类IAPTest(用于IsAnnotationPre