当我写short a = 2 * 3;
时,我什么都没遇到,但是当我写
short a = 2;
a = a * 3;
然后它显示类型转换错误。
我不了解这种行为,我知道每当我们执行任何表达式时,所有操作数都将转换为int,因此根据这种逻辑,我也应该为前一个错误。
请解释一下这种逻辑吗?
答案 0 :(得分:1)
有人肯定会在这里引用JLS
,但用简单的英语:
short a = 2 * 3;
编译器会“看到” 2 * 3
实际上是6
(它是int
并适合于该short
)。就像这样做:
short a = (short) 2 * 3;
另一种情况:
a = a * 3;
您可以说也是6
-编译器不能。它认为a * 3
是int
,不知道是否适合a
,因此会发出错误消息。
答案 1 :(得分:0)
a * 3
的结果为int
,因为编译器认为3
如此。
您需要执行以下类型转换:short a=2;a=(short) (a*3);
原因是编译器能够在编译时推断出,2*3
的结果适合short
(并且实际上执行了计算)。另一方面,a*3
是在运行时执行的,此运行时计算的结果是int
。
如果使用javac编译此类,则可以验证这一点:
public class Test {
public static void main(String[] args) {
short a=2;
a = (short) (a*3);
}
}
然后用javap.exe -c Test.class
反编译字节码:
$ javap.exe -c Test.class
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iload_1
3: iconst_3
4: imul
5: i2s
6: istore_1
7: return
}
答案 2 :(得分:0)
GetData = "<h1>Employee List</h1><table border="1" width="100%"><tbody><tr><th>Sr. No</th><th>Name</th><th>Email</th><th>Photo</th></tr><tr><td>1</td><td>Alpesh</td><td>alpesh@gmail.com</td><td><img width="50px" src="images/1.jpg"></td></tr><tr><td>2</td><td>Rajesh</td><td>rajesh@gmail.com</td><td><img width="50px" src="images/2.jpg"></td></tr></tbody></table>"
此处,编译器会预先计算a=2*3;
,因此它的常量值为2*3
。
这与编写6
完全相同。
a=6;
此处,编译器无法预先计算结果,因为a=2;
a=a*3;
是变量,可以具有任何值。由于a
可以具有任何值,因此a
可能会给a*3
带来太大的结果,从而导致错误。