Java 最终数据成员给出不同的值(非静态数据成员)

Java 最终数据成员给出不同的值(非静态数据成员),java,final,Java,Final,最后一个概念说,如果它没有首先被赋值,那么它给出了调用它的函数中的错误,最后一个数据成员也可以从构造函数中被赋值,这就是所谓的空白最终概念 但是,一旦分配了最终数据成员,就不能在此处进行更改 public class Demo { final int w; public Demo() { fun(); w=10; } public void fun() { System.out.println(w);

最后一个概念说,如果它没有首先被赋值,那么它给出了调用它的函数中的错误,最后一个数据成员也可以从构造函数中被赋值,这就是所谓的空白最终概念

但是,一旦分配了最终数据成员,就不能在此处进行更改

  public class Demo
  {
    final int w;

    public Demo()
    {

     fun();
     w=10;

    }

    public void fun()
    {

     System.out.println(w);

    }

    public static void main(String ... args)
    {

     Demo d=new Demo();
     System.out.println(d.w);

    }
  }
这里,在fun()中,w的值是0。,然后我将w赋值为10,这样在主println中,它现在是10

所以我的问题是在fun()中,w的值显示为0意味着它在堆中有一个空间作为对象,它的值为0,我已经用final关键字锁定了它,所以它不应该进一步更改,那么为什么在构造函数中w=10,如果w的值已经与fun()中可以看到的值一致,那么就不会给出任何错误呢…如果w的值在构造函数中可以变化,那么为什么在构造函数中w=10之后,当我假设w=20时会显示错误

如果最终变量可以有默认值,那么为什么需要明确地分配它们呢

final int w; 
你还没有初始化它

如果你有

final int w=5;
然后它将显示此编译错误

The final field Demo.w cannot be assigned
一旦定义了最终值,就不能再次分配该值

你还没有初始化它

如果你有

final int w=5;
然后它将显示此编译错误

The final field Demo.w cannot be assigned
一旦定义了最终值,就不能再次分配该值

  • 所有字段都初始化为默认值。在您的情况下,最初
    w
    设置为
    0
    。这就是为什么
    System.out.println()
    打印
    0

  • 所有最终字段必须在构造函数末尾由您指定一个值。只有从这一刻起,它的价值才不会进一步改变

  • 所有字段都初始化为默认值。在您的情况下,最初
    w
    设置为
    0
    。这就是为什么
    System.out.println()
    打印
    0

  • 所有最终字段必须在构造函数末尾由您指定一个值。只有从这一刻起,它的价值才不会进一步改变

  • 好的,从

    编译器实际做的是在内部生成一个类初始化例程,该例程将所有静态变量初始值设定项和所有静态初始值设定项代码块按它们在类声明中出现的顺序组合在一起。此单一初始化过程仅在类首次加载时自动运行一次。”

    来自

    “现在我们已经演示了静态final字段确实会获得默认值,您可能想知道为什么默认值不够。除了一个显而易见的问题外,这个问题没有好的答案:“规范这么说”。摘自8.3.1.2:

    如果一个空的final(§4.12.4)类变量没有被声明它的类的静态初始值设定项(§8.7)明确赋值(§16.8),则这是一个编译时错误

    我们只能猜测这种限制背后的动机,但我认为这是为了让程序更容易理解。如果要将变量设置为0,则更清晰的做法是显式设置。”

    确定自

    编译器实际做的是在内部生成一个类初始化例程,该例程将所有静态变量初始值设定项和所有静态初始值设定项代码块按它们在类声明中出现的顺序组合在一起。此单一初始化过程仅在类首次加载时自动运行一次。”

    来自

    “现在我们已经演示了静态final字段确实会获得默认值,您可能想知道为什么默认值不够。除了一个显而易见的问题外,这个问题没有好的答案:“规范这么说”。摘自8.3.1.2:

    如果一个空的final(§4.12.4)类变量没有被声明它的类的静态初始值设定项(§8.7)明确赋值(§16.8),则这是一个编译时错误


    我们只能猜测这种限制背后的动机,但我认为这是为了让程序更容易理解。如果要将变量设置为0,则显式设置更为清晰。“

    最后一个非静态变量在堆中只能获得一次赋值,如果值在堆中默认为零,则不应在下一行中再次赋值。
    w
    在初始化过程中默认初始化为0。无论您想对字段执行什么操作,字段都会发生这种情况。您只为
    w
    赋值一次,因此没有错误。是,但如果w是最终值,则w不会被初始化为0。您必须解释必须将其赋值为是,但程序没有给出任何错误,因此,为什么它在运行时w的值为0,如果w是最终值,则w的值为10。如果在然后不应在下一行中再次分配堆。
    w
    作为初始化过程的一部分,默认情况下初始化为0。无论您想对字段执行什么操作,字段都会发生这种情况。您只为
    w
    赋值一次,因此没有错误。是,但如果w是最终值,则w不会初始化为0。您必须解释必须将其赋值为是,但程序没有给出任何错误,因此,如果w是最终值,为什么它同时以w值0和10运行。。?