java - 将 int 和 int 文字分配给字节之间的区别?

标签 java

byte b = 100 ; 

编译没有任何错误,但是

int i = 100 ; 
byte b = i ; 

抛出一个错误。为什么?即使直接将 100 赋值给 b,我们也是在赋值一个 int 字面值。那么为什么我会收到错误消息?

最佳答案

byte b = 100 ;

这里的100是一个编译时间常量。因此可以分配给 byte

int i = 100 ; 
// i = i + 100;  // It's allowed to add this statement later on, 
                 // if `i` is not declared final. And hence, the next assignment
                 // will clearly fail at runtime. So, compiler saves you from it
byte b = i ; 

现在在这种情况下,因为 i 没有被声明为 final,所以它不再是一个编译时常量。在这种情况下,您稍后可以在 i 的初始化赋值之间修改 i 的值i 到 byte,如上例所示。这肯定会失败。 这就是编译器不允许将 i 赋值给 byte 类型的原因。

但是,您可以使用显式转换对其进行编译,这当然可能会在运行时崩溃。通过显式转换,您告诉编译器 - “我知道我在做什么,只需为我做”。因此,它不会担心该转换的运行时行为,并且会相信您没有做错任何事情。

因此,您可以将 int i 声明为 final,或者您需要进行转换:-

int i = 100 ;    // replace 100 with 130, and you will be surprised that it works
byte b = (byte)i ; 

因此,当您使用值 130 并将其转换为 byte 时,您通过了编译器,但肯定会在运行时崩溃.而这正是 编译器 试图避免的问题。


现在让我们回到第一个案例:-

byte b = 128;

上面的赋值现在将无法编译。因为尽管值 128 是一个编译时间常量,但它的大小不足以放入一个 byte 中,而且 compiler 知道这一点。

关于java - 将 int 和 int 文字分配给字节之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13705322/

相关文章:

java - 带星号的数字

javax.crypto.IllegalBlockSizeException : last block incomplete in decryption

java - 如何在没有 JButton 的情况下使 ImageIcon(或任何类型的图像)可见?

java - java中for循环数组只处理一个元素?

java - Android: java.lang.RuntimeException: takePicture 失败

java - 当我想要抛出异常时退出程序的最佳方法是什么?

java - 设计面向对象的系统/GUI

java - 使用正则表达式 (Java) 从这些字符串中提取子字符串

java - 如何查找网页的所有元素(仅加载 25 个而不是全部)

java - 创建条件语句,一次查询得到结果和行数