java中的类初始化
为什么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赋值时
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.2final
字段
一个字段可以声明为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。