java中的类初始化

0 java

为什么java允许这样做

public class A {

    private int i;

    public A(int i){

    }

}
Run Code Online (Sandbox Code Playgroud)

但不是这个

public class A {

    private final int i;

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

    }

}
Run Code Online (Sandbox Code Playgroud)

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

Jig*_*shi 7

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

试试这个它会起作用

private final int i=0;  
Run Code Online (Sandbox Code Playgroud)

要么

class A {

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

}  
Run Code Online (Sandbox Code Playgroud)

要么

class A {
    private final int i;
    public A(int i) {
    }//constructor over
    {//initilizer block
        i = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

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


che*_*vim 6

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

public class A {

    private final int i;

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

}
Run Code Online (Sandbox Code Playgroud)

请注意,这是您创建Immutable对象的方式.


wkl*_*wkl 6

final 必须在实例的构造函数完成之前分配成员字段.

来自Java语言规范,第3版

8.3.1.2 final字段

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

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