java中的类初始化

时间:2010-12-19 20:06:46

标签: java

为什么java允许这个

public class A {

    private int i;

    public A(int i){

    }

}

但不是这个

public class A {

    private final int i;

    public A(int i){ // compile - time error

    }

}

当项目最终时,将项目推送到堆栈有什么区别?为什么它不理解A(i)与final int i不同?

3 个答案:

答案 0 :(得分:7)

构造函数中的变量与最终类成员无关,您获得的编译时错误是由于最终变量不仅仅是初始化。

试试这个会起作用

private final int i=0;  

class A {

    private final int i;
       public A(int i){
       this.i = i;
    }

}  

class A {
    private final int i;
    public A(int i) {
    }//constructor over
    {//initilizer block
        i = 10;
    }
}

编译器需要在初始化对象时初始化最终成员。

答案 1 :(得分:6)

在构造函数中为i指定值时,它将允许第二个代码段:

public class A {

    private final int i;

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

}

请注意,这是您创建Immutable objects

的方法

答案 2 :(得分:6)

必须在实例的构造函数完成之前分配

final个成员字段。

来自Java Language Specification, 3rd Edition

  

8.3.1.2 final字段

     

可以声明一个字段final(§4.12.4)。类和实例变量(static和非 - static字段)都可以声明为final。   如果空类final(§4.12.4)类变量未被类的static初始值设定项(第8.7节)明确赋值(第16.8节),则为编译时错误声明。

     

必须在声明它的类的每个构造函数(第8.8节)的末尾明确赋值(第16.9节)空白final实例变量;否则会发生编译时错误。