Java和最终初始化

时间:2012-10-06 10:05:04

标签: java

我正在从.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"
  }

}

8 个答案:

答案 0 :(得分:4)

您应该在类或构造函数中声明的位置初始化最终字段。

构造函数允许初始化final字段,因为构造函数在创建对象时只调用一次。

当您在方法initializePaint()中初始化它时,您将收到编译器错误,因为此方法可以多次调用,并且最终变量/字段是常量且无法更改。正如您将多次调用initializePaint()方法一样,多次初始化最终字段是错误的。因此编译器会给出错误。

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"
  }
}

答案 1 :(得分:3)

因为可以从任何地方调用initializePaint()方法,而不仅仅是构造函数。 Java编译器希望确保在构造函数中仅为最终变量赋值一次。所以你必须将赋值移动到构造函数。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

final变量仅在该变量减速时初始化,或者您也可以通过构造函数初始化它。

前:

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

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

答案 4 :(得分:1)

在您的代码中,您没有初始化最终变量。这个变量叫做BLANK FINAL变量。现在你必须在构造函数中初始化它。否则你会得到错误,因为变量的值将为null。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

所有final变量的初始化必须在构造函数中进行,而不是在构造函数的方法调用的调用层次结构中的某个位置(例如,在您的情况下为initializePaint())。

答案 7 :(得分:0)

final表示一旦分配,就无法重新分配它,您需要在构造函数中分配它。 因此,您无法重新分配paint

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