下面是我初始化两次最终变量的代码。但我已经读过最终变量只能初始化一次。任何人都可以解释为什么我可以为一个最终变量初始化两个不同的值。
class outer
{
private final int x;
public outer(){
x = 8;
}
public outer(int value){
x = 9;
}
public static void main(String args[]){
outer ot = new outer();
System.out.println(ot.x);
}
}
答案 0 :(得分:1)
实际上在Java中,final关键字有两个含义,如果你在类和方法中使用那么它是关于继承的,如果它是关于变量的,那么可以从匿名内部子类访问最终局部变量,而非最终局部变量可能不是
因此,在您的情况下,您不会再次初始化它,而是在main
方法中访问x的值,这是正常的。
检查Important points on final in Java
- Final关键字可以应用于Java中的成员变量,局部变量,方法或类。
最终成员变量必须在声明或内部构造函数时初始化,否则将导致 编译错误。
您无法在Java中将值重新分配给最终变量。
本地最终变量必须在声明期间初始化。
在Java中的匿名类中只能访问最终变量。
无法在Java中覆盖最终方法。
最终的课程不能在Java中继承。
Final与在Java中的异常处理中使用的finally关键字不同。
Final不应该与在对象类中声明的finalize()方法混淆,并在对象是垃圾之前调用 由JVM收集。
- 醇>
在java接口中声明的所有变量都是隐式最终的。
答案 1 :(得分:0)
我稍稍改变了你的代码 和输出是
8
9
public class Main {
private final int x ;
public Main(){
x = 8;
}
public Main(int value){
x = 9;
}
public static void main(String args[]){
Main ot = new Main();
System.out.println(ot.x);
Main ot2 = new Main(11);
System.out.println(ot2.x);
}
}
如果我错了,任何人都会纠正我,但我认为每个对象都会得到一个新的类
编辑:如果您尝试在ot对象后设置 ot.x = 15 ,则会出现以下错误
无法分配最终字段Main.x
答案 2 :(得分:-1)
您只需初始化一次,具体取决于调用的构造函数。
程序的控制流只能为每个对象初始化传递一个构造函数。这意味着每次执行程序时,该值仅分配给final
变量。
" Final
只能分配到一次"意味着每次执行程序时变量只能分配,而不是只能在代码中设置一次。