java - 为什么这个 Java 变量赋值是非法的?
问题描述
这是代码
import java.util.*;
class Example
{
public static void main(String args[])
{
final int x=127; int y=100;
byte b;
b=x; //Legal ?
b=y; //Illegal
}
}
你能解释为什么b=y
是非法的吗?我认为final
意味着没有进一步的改变,对吗?
解决方案
final
关键字确实意味着“没有进一步的变化”,所以你是对的。这里的问题与数据“宽度”有关。
Anint
可以容纳比 a 更多的数据byte
(即它比 a “更宽” byte
)。这意味着当你这样做时b = x
,你正在“缩小” 的宽度int
以适应byte
. 这仅在编译器可以保证int
足够小以适合 的情况下才有效byte
,这需要int
<= 127,并且也是最终的(以便以后不能将其更改为 > 127)。
在您的代码中,两者x
和y
都足够窄以适合 a byte
,但只有x
最终的,所以它是编译器允许直接分配给byte
变量的唯一一个。
final int x=127; final int y=100; // Made y final
byte b;
b=x; //Legal
b=y; //Also legal
final int x=200; final int y=100; // Made x too big
byte b;
b=x; //Illegal
b=y; //Legal
推荐阅读
- firefox - Firefox 中沙盒命令的替代品是什么?
- node.js - 对象未在 socket.io 中发送
- reactjs - 如何在使用道具的样式组件中使用变量值?
- c# - 如何在 C# 中插入对类对象的 xml 响应
- javascript - 使用新数组创建数组数组并填写 Javascript 时的奇怪行为
- rust - 单数链表,如“列表过多”示例,但没有指向头部的指针
- flutter - Flutter Url Launcher 不会将整个文本传递给短信
- python - Python:分配的内存在执行后不会被释放
- flutter - Flutter 保持旧页面在转换后的 PageView 中可见
- python - 尝试获取端口号(正则表达式)