0

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

}
4

8 回答 8

4

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

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

当你在方法中初始化它时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"
  }
}
于 2012-10-06T10:14:23.743 回答
3

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

于 2012-10-06T10:13:08.853 回答
1

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

BTW +1 用于使用最终变量。这是一个很好的编码习惯。IMO Java 应该有一个变量的“可变”关键字,并且默认为 final。

于 2012-10-06T10:09:46.217 回答
1

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

前任:

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

  public MyClass(){
   intVar = 12; 
   paint= new Paint(); 
 }
}
于 2012-10-06T10:13:38.520 回答
1

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

于 2012-10-06T19:09:47.103 回答
0

编译器看到您initializePaint()在构造函数上调用了该方法,但没有看到该方法会设置paint变量。您需要paint在构造函数中显式设置字段,例如:

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

  public MyClass(){
       intVar = 12; 
       paint= new Paint(); 
  }
}
于 2012-10-06T10:08:32.927 回答
0

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

于 2012-10-06T10:09:55.437 回答
0

final意味着一旦分配,您不能重新分配它,您需要在构造函数中分配它。所以你不能有一个方法重新分配paint

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

于 2012-10-06T10:09:55.607 回答