2016-02-26 349 views
-1

我有两个final在类级别声明的变量,但它们没有被初始化。
因此,现在当我尝试为该类创建默认构造函数时,它给出了一个错误,说
The blank final field may not have been initialized最终变量初始化

为什么会发生此错误?为什么需要在构造函数中初始化最终变量?

我还有另一个查询,也就是说,不可能创建一个没有默认构造函数的实例吗?即使我们有参数化的构造函数?

+3

参考http://stackoverflow.com/questions/26935453/the-blank-final-field-initial-may-not-have-been-initialized – sasikumar

+0

您必须始终用构造函数初始化最终字段。最终字段必须在对象实时期间分配。无论构造函数 - 每个最终字段都必须赋值。 – mlewandowski

+0

@mlewandowski你不必使用构造函数来完成它 - 你可以直接为字段赋值或使用初始化块(基本上是相同的)。 –

回答

0

Final variable是那些变量which can not be changed once object is initialized.所以任何你将不得不初始化最终变量。如果您提供默认构造函数以及参数化consructor,则必须初始化这些变量,因为您以后不能更改该值。

1

为什么需要在构造函数中初始化最终变量?

A final字段必须在构造函数中初始化,因为这是final已定义的意思。

如果你调用一个构造函数,你不必在默认的构造函数中设置final域。

class A { 
    final int a; 

    public A() { 
     this(0); 
    } 

    public A(int a) { 
     this.a = a; 
    } 
} 

是不可能没有默认构造函数创建一个实例?

是的。有很多方法可以做到这一点,通常是通过调用一个带参数的构造函数。

即使我们有参数化构造函数?

在这种情况下,您将只有一个构造函数,如果您定义一个构造函数,它将不带任何参数。