为什么这种类型的最终变量初始化不能在 Java 中编译?

达米卡·普什帕库马拉
class Example{
  public static void main(String args[]){   
    final int x=127;

    final int y;
    y=100;

    byte b;

    b=x;
    b=y;
  }
}

考虑这个程序 x 和 y 变量声明为最终变量。所以我需要将 x 和 y 值分配给 b。b=x; 编译和 b=y; 没有编译。为什么此代码无法正常工作。请需要解释。

不是我

我没有真正的线索你想通过这段代码实现什么,但我可能会尝试解释为什么它适用xy. 我可能拼错了严格的命名法,但它是这样的。

一个(也可能是主要的)原因是因为编译器如何分析源代码。
Final 关键字仅意味着一旦分配/初始化该值就无法更改(并且必须在访问该值之前对其进行初始化)。

b=x;分配工作,因为确切的最终值x变量是在编译时已知的和的值x是127,其是在字节类型的范围。因此它可以分配给b-x不会改变,因为它是最终的并且它的值在字节范围内并且在编译时是已知的。
超出x变量的字节范围(例如 128)会产生相同的错误。

b=y;不会,因为,虽然看起来很怪异,终值y变量在编译时不知道。编译器并没有遵循所有的指令来评估变量的值。因此,编译器不知道在 的初始化和声明之间y是否有其他指令可能会更改分配给 的值y换句话说,分配给的值y是在运行时评估的——因为它是另一条指令。

看到的错误b=y是:

error: incompatible types: possible lossy conversion from int to byte

尝试执行以下操作时会产生相同的错误:

int z = 126;
final int zz=z;
b=zz;

或类似的东西:

final int zz=new Scanner(System.in).nextInt();
b=zz;

在我zz和你的y情况下,这些变量的最终值是在运行时评估的,编译器不知道它们的值是否不会溢出b字节范围

编译器不是很聪明的东西,或者......是,但没有进行广泛的优化和检查。要求编译器知道这y=100会使编译时间变得更长(因为它还需要评估zz=new Scanner...表达式)。

它也适用于以下内容:

final int x=127*2/2;
b=x;

因为x可以在编译时评估的确切值

如果您需要一些规范页面,请告诉我,我可以稍后再查找。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能在Java中的开关内初始化变量?

在Java中,为什么不能在父类中声明最终成员(不进行初始化),并在子类中设置其值?我该如何解决?

为什么不能在init块编译中初始化变量接口属性的代码?

为什么Java不允许在构造函数中初始化静态最终变量(例如static final int d)?

为什么“ array instanceof Iterable”不能在Java中编译?

为什么我不能在psvm Java中创建静态最终变量?

在Java中的构造函数之前初始化最终变量

在Java的子类(子类)中初始化静态最终变量

在抽象类(Java)中初始化最终变量

是否有可能在C ++中,const变量的初始化延迟,像Java的“空白最终”功能?

为什么不能在类中初始化实例变量?

为什么出口不能在initWithCoder中初始化?

为什么Java编译器不理解此变量总是初始化的?

Java-最终变量可以在静态初始化块中初始化吗?

Java中未初始化的类成员不会发出任何编译器错误。但是局部变量可以。为什么?

为什么我不能通过Groovy中的构造函数内部的闭包来初始化最终类变量?

初始化Java中的最终字段

为什么Final变量不需要在Java的main方法中初始化?

为什么for循环可以初始化Java中按值传递的变量

Java:是否曾见过在数组初始化程序中拒绝最终逗号的编译器或工具?

为什么我们不能在构造函数初始化列表中初始化静态变量,但可以在构造函数主体中初始化

在 Kotlin CI 测试期间静态最终变量初始化(在 Java 中)不正确

在Java中初始化最终变量时遇到问题

如何在Java中创建未初始化的静态最终变量

为什么不能使用new关键字在Java中初始化抽象类?

Java泛型可在Eclipse中编译,但不能在javac中编译

具有通配符的Java泛型可在Eclipse中编译,但不能在javac中编译

Java程序可以在Eclipse中编译,但不能在Netbeans中编译吗?

为什么我不能在类中初始化非常量静态成员或静态数组?