public class PlusEquals {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
a = a + b;
System.out.println(a);
}
}
这个程序打印什么?
你猜3吗?太糟糕了,这个程序不会编译 . 为什么?好吧,它恰好在Java is defined to return an int中添加了字节 . 我相信这是因为Java虚拟机没有定义保存在字节码上的字节操作(毕竟这些操作数量有限),而使用整数操作则是在语言中公开的实现细节 .
但是如果 a = a + b 不起作用,那就意味着如果 E1 += E2 被定义为 E1 = E1 + E2 , a += b 将永远不会对字节起作用 . 如前所述例子显示,情况确实如此 . 作为使 += 运算符用于字节和短路的hack,有一个隐式转换 . 它被删除了's not that great of a hack, but back during the Java 1.0 work, the focus was on getting the language released to begin with. Now, because of backwards compatibility, this hack introduced in Java 1.0 couldn' .
11 回答
这个演员的一个很好的例子是使用* =或/ =
要么
要么
要么
非常好的问题 . Java Language specification确认了您的建议 .
是,
基本上我们写的时候
编译器将其转换为
我刚检查了
.class
文件代码 .真的是一件好事
你需要在
i = i + l
的情况下从long
转换为int
explicitly
然后它将编译并提供正确的输出 . 喜欢要么
但是在
+=
的情况下它只是工作正常,因为运算符隐式地从右变量的类型到左变量的类型进行类型转换,因此不需要显式转换 .一如既往地提出这些问题,JLS就是答案 . 在这种情况下§15.26.2 Compound Assignment Operators . 提取物:
引自§15.26.2的一个例子
换句话说,你的假设是正确的 .
这里的问题涉及类型铸造 .
当你添加int和long时,
int对象被转换为long并且两者都被添加并且你获得了长对象 .
但长对象不能隐式转换为int . 所以,你必须明确地这样做 .
但是
+=
的编码方式是它可以进行类型转换 .i=(int)(i+m)
在Java类型中,当赋值操作右侧的表达式类型可以安全地提升为赋值左侧的变量类型时,将自动执行转换 . 因此我们可以安全地分配:
反之亦然 . 例如,我们不能自动将long转换为int,因为第一个需要比第二个更多的存储,因此信息可能会丢失 . 要强制执行此类转换,我们必须执行显式转换 .
Type - Conversion
有时候,可以在面试时询问这样的问题 .
例如,当你写:
没有自动类型转换 . 在C中,编译上面的代码不会有任何错误,但在Java中你会得到像
Incompatible type exception
这样的东西 .所以要避免它,你必须编写如下代码:
主要区别在于
a = a + b
,没有进行类型转换,因此编译器因为没有进行类型转换而生气 . 但是对于a += b
,它真正做的是将b
类型转换为与a
兼容的类型 . 所以,如果你这样做你真正在做的是:
这里微妙点......
当
j
是double并且i
是int时,i+j
存在隐式类型转换 . Java ALWAYS 在它们之间存在操作时将整数转换为double .澄清
i+=j
其中i
是一个整数而j
是一个双倍可以描述为见:this description of implicit casting
在这种情况下,为了清楚起见,您可能希望将
j
类型转换为(int)
.Java语言规范defines E1 op= E2 to be equivalent to be E1 = (T) ((E1) op (E2)) where T is a type of E1 and E1 is evaluated once .
这是一个技术答案,但你可能想知道为什么会这样 . 那么,让我们考虑以下计划 .
这个程序打印什么?
你猜3吗?太糟糕了,这个程序不会编译 . 为什么?好吧,它恰好在Java is defined to return an int中添加了字节 . 我相信这是因为Java虚拟机没有定义保存在字节码上的字节操作(毕竟这些操作数量有限),而使用整数操作则是在语言中公开的实现细节 .
但是如果
a = a + b
不起作用,那就意味着如果E1 += E2
被定义为E1 = E1 + E2
,a += b
将永远不会对字节起作用 . 如前所述例子显示,情况确实如此 . 作为使+=
运算符用于字节和短路的hack,有一个隐式转换 . 它被删除了's not that great of a hack, but back during the Java 1.0 work, the focus was on getting the language released to begin with. Now, because of backwards compatibility, this hack introduced in Java 1.0 couldn' .