繁体   English   中英

Java和最终初始化

[英]Java and final initialization

我正在从.NET“转换”为Java。 我想知道为什么下面的代码不起作用

class MyClass{
  private final int intVar;  //ok
  private final Paint paint; //error "Variable paint might not have been initialized"

  public MyClass(){
       intVar = 12; 
       initializePaint(); 
  }

  private void initializePaint(){
       paint = new Paint();  //error  "cannot assign a variable to final variable"
  }

}

您应该在类或构造函数中声明的地方初始化final字段。

构造函数中允许对最终字段进行初始化,因为在创建对象时,构造函数仅被调用一次。

当您在方法initializePaint()对其进行initializePaint() ,您会得到编译器错误,因为此方法可以多次调用,并且最终变量/字段是常量,不能更改。 正如您将多次调用initializePaint()方法一样,对final字段进行多次初始化是错误的。 因此,编译器将为此提供错误。

class MyClass{
  private final int intVar;  //ok
  private final Paint paint;// paint = new Paint(); to avoid //error "Variable paint might not have been initialized"

  public MyClass(){
       intVar = 12; 
       //initializePaint(); 
       paint = new Paint(); // here initialized And allowed.
  }

  private void initializePaint(){
       paint = new Paint();  //error  "cannot assign a variable to final variable"
  }
}

因为initializePaint()方法可以在任何地方调用,而不仅仅是构造函数。 Java编译器希望确保最终变量在构造函数中仅分配一次。 因此,您必须将分配移至构造函数。

类的最终实例变量必须在构造函数的范围内实例化。 Paint对象的初始化移至构造函数,并在初始化方法中使用getter getPainter

BTW +1用于使用最终变量。 这是一个很好的编码实践。 IMO Java应该对变量使用'mutable'关键字,并将final作为默认值。

final变量仅在减速时才初始化,也可以通过构造函数对其进行初始化。

例如:

class MyClass{
 private final int intVar;  
  private final Paint paint; 

  public MyClass(){
   intVar = 12; 
   paint= new Paint(); 
 }
}

在您的代码中,您没有初始化最终变量。 此变量称为BLANK FINAL变量。 现在,您必须在构造函数中对其进行初始化。 否则,您会收到错误消息,因为变量的值将为null。

编译器看到您在构造函数上调用了initializePaint()方法,但是看不到此方法将设置paint变量。 您需要在构造函数中明确设置paint字段,例如:

class MyClass{
  private final int intVar;  //ok
  private final Paint paint; //error

  public MyClass(){
       intVar = 12; 
       paint= new Paint(); 
  }
}

所有最终变量的初始化必须在构造函数中进行,而不是在构造函数的方法调用的调用层次结构中的任何地方进行(例如您的情况下的initializePaint() )。

final方法一旦分配,就无法重新分配,而需要在构造函数中进行分配。 所以你没有办法重新分配paint

编辑:一些阅读: http : //en.wikipedia.org/wiki/Final_(Java)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM