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不同?
构造函数中的变量与最终类成员无关,您获得的编译时错误是由于最终变量不仅仅是初始化.
试试这个它会起作用
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)
编译器需要在初始化对象时初始化最终成员.
i在构造函数中为值赋值时,它将允许第二个代码段:
public class A {
private final int i;
public A(int i){
this.i = i;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是您创建Immutable对象的方式.
final 必须在实例的构造函数完成之前分配成员字段.
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节); 否则会发生编译时错误.
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |