gpt4 book ai didi

java - 为什么添加最终字节会生成一个字节,而添加非最终字节会生成一个 int?

转载 作者:行者123 更新时间:2023-12-03 02:26:04 25 4
gpt4 key购买 nike

byte b1=1,b2=2,b3,b6; 
final byte b4=4,b5=6;
b6=b4+b5; // line3
b3=b1+b2; // line4: error: incompatible types: possible lossy conversion from int to byte
System.out.println(b3+b6);

为什么第3行是正确的?看来类型不正确,我应该收到第 4 行出现的错误。

Live example on ideone

最佳答案

错误发生在第 4 行而不是第 3 行,因为编译器知道 final 变量的值,但不知道非最终变量。编译器会看到final,并且该变量在使用之前肯定被分配了一个常量值,并且由于该变量是final,因此该值无法更改。由于编译器知道这些值,因此它知道值 10 (b4+b5) 的转换不会有任何损失。事实上,它们实际上是常量,而您正在执行 b6=10 - 如果您查看删除第 4 行并调整第 6 行生成的字节码,我们会发现这正是编译器生成的字节码作用:完全优化 b4b5

如果您为 b4b5 选择不同的值(例如 100),您会在第 3 行收到错误,如下所示嗯:

byte b1=1,b2=2,b3,b6; 
final byte b4=100,b5=100;
b6=b4+b5; // line3 error: incompatible types: possible lossy conversion from int to byte
b3=b1+b2; // line4 error: incompatible types: possible lossy conversion from int to byte
System.out.println(b3+b6);

Live on ideone

这是演示这一点的东西,它将编译

byte b1=1,b2=2,b3,b6; 
final byte b4=4,b5=6;
b6=b4+b5; // line3
//b3=b1+b2; // line4
//System.out.println(b3+b6);
System.out.println(b6);

这是反汇编:

public static void main(java.lang.String[]) throws java.lang.Exception;    Code:       0: iconst_1       1: istore_1       2: iconst_2       3: istore_2       4: bipush        10       6: istore        4       8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;      11: iload         4      13: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V      16: return

注意

4: bipush        106: istore        4

...将文字值 10 存储在 b6 中。

关于java - 为什么添加最终字节会生成一个字节,而添加非最终字节会生成一个 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32005417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com