java中的类初始化

java中的类初始化,java,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不同?当您在构造函数中为i赋值时

为什么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不同?

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

public class A {

    private final int i;

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

}

请注意,这是您创建的方式。

构造函数中的变量与最终类成员无关。您得到的编译时错误是由于最终变量未初始化所致

试试这个,会有用的

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

编译器需要在初始化对象时初始化最终成员。
final
成员字段必须在实例的构造函数完成之前分配

8.3.1.2
final
字段

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

必须在声明的类的每个构造函数(§8.8)的末尾明确指定一个空白的
最终
实例变量(§16.9);否则会发生编译时错误。


我知道这一点,但我对java如何将项推送到堆栈感到困惑,因为调用method@hilal未收到您的评论,与堆栈和方法调用无关here@hilal,你是什么意思?编译错误源于您的
final
成员字段
i
在构造实例之前没有被赋值。@hilal check我是指int i;f(int i){}。但是我忘了初始化final而init。