首页 > 解决方案 > 为什么这个 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意味着没有进一步的改变,对吗?

标签: java

解决方案


final关键字确实意味着“没有进一步的变化”,所以你是对的。这里的问题与数据“宽度”有关。

Anint可以容纳比 a 更多的数据byte(即它比 a “更宽” byte)。这意味着当你这样做时b = x,你正在“缩小” 的宽度int以适应byte. 这仅在编译器可以保证int足够小以适合 的情况下才有效byte,这需要int<= 127,并且也是最终的(以便以后不能将其更改为 > 127)。

在您的代码中,两者xy都足够窄以适合 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 

推荐阅读