将int和int文字分配给一个字节之间的区别?

时间:2012-12-04 14:38:22

标签: java

byte b = 100 ; 

编译没有任何错误,但

int i = 100 ; 
byte b = i ; 

抛出错误。为什么?即使直接将100分配给b,我们也会分配一个int文字。那么为什么我会收到错误?

3 个答案:

答案 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常量。在这种情况下,您可以稍后在iinitialization 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;