Java自动类型提升

时间:2018-08-23 12:25:41

标签: java

当我写short a = 2 * 3;时,我什么都没遇到,但是当我写

short a = 2;
a = a * 3;

然后它显示类型转换错误。

我不了解这种行为,我知道每当我们执行任何表达式时,所有操作数都将转换为int,因此根据这种逻辑,我也应该为前一个错误。

请解释一下这种逻辑吗?

3 个答案:

答案 0 :(得分:1)

有人肯定会在这里引用JLS,但用简单的英语:

short a = 2 * 3;

编译器会“看到” 2 * 3实际上是6(它是int并适合于该short)。就像这样做:

short a = (short) 2 * 3;

另一种情况:

a = a * 3;

可以说也是6-编译器不能。它认为a * 3int,不知道是否适合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带来太大的结果,从而导致错误。