byte b = 100 ;
编译没有任何错误,但
int i = 100 ;
byte b = i ;
抛出错误。为什么?即使直接将100分配给b,我们也会分配一个int文字。那么为什么我会收到错误?
答案 0 :(得分:5)
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
,因此它不再是compile time
常量。在这种情况下,您可以稍后在i
和initialization of i
之间修改 assignment of i to byte
的值,如上例所示。哪个肯定会失败。
这就是编译器不允许将i
分配给byte
类型的原因。
但是,您可以使用显式转换来编译它,当然在运行时可能crash
。通过做一个显式演员,你告诉编译器 - “我知道我在做什么,只为我做”。因此,它不会打扰该转换的运行时行为,并且会相信您没有做错任何事情。
因此,您可以将int i
声明为final
,或者您需要进行投射: -
int i = 100 ; // replace 100 with 130, and you will be surprised that it works
byte b = (byte)i ;
因此,当您使用值130
并将其强制转换为byte
时,您将通过compiler
,但肯定会在运行时崩溃。这是compiler
试图避免的问题。
现在让我们回到第一个案例: -
byte b = 128;
上述作业现在无法编译。因为即使值128
是编译时常量,它也不足以容纳byte
,并且compiler
知道。
答案 1 :(得分:1)
byte b=100
会编译,因为字节的范围是从 -128到127 。
int i = 100 ; byte b = 129 ;// would give a compiler error
答案 2 :(得分:1)
i
不是最终版,可能会在平均时间内发生变化。
以下工作:
final int i = 100;
byte b = i;