如果你运行下面的代码片段,你将获得最终变量X和Y的输出。
X = 1 Y = 2
X = 4 Y = 5
从输出中可以明显看出,最终的变量已被重新分配。 我想知道,如果它违反了Java Final变量的合同。有什么想法吗?
public class FinalVariablesTest {
private final int x;
private final int y;
public FinalVariablesTest() {
this.x = 1;
this.y = 2;
}
public FinalVariablesTest(int xValue, int yValue) {
this.x = xValue;
this.y = yValue;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public static void main(String...strings) {
FinalVariablesTest finalVariablesTest = new FinalVariablesTest();
System.out.println(" X = "+finalVariablesTest.getX() + " Y = "+finalVariablesTest.getY());
finalVariablesTest = new FinalVariablesTest(4,5);
System.out.println(" X = "+finalVariablesTest.getX() + " Y = "+finalVariablesTest.getY());
}
}
答案 0 :(得分:5)
不,这是不违规 - 有两个单独的实例,每个实例都有不同的final
值绑定到x
和y
。
您已更改finalVariablesTest
引用的实例。
答案 1 :(得分:0)
FinalVariablesTest
类不是单例,因此您可以根据需要创建任意数量的对象,并且不同的FinalVariablesTest Object
将具有不同的x和y最终可验证集,您无法在创建后更改该值,所以这不是违规行为。
答案 2 :(得分:0)
这些不是变量,而是(最终)实例。根据它们所属的对象,可以为最终实例字段分配一次。您的示例创建了两个对象(您有两个new FinalVariablesTest
表达式),并且对于每个此类对象,实例字段都分配有不同的值。
要了解最终结果的含义,请尝试将此方法添加到您的课程中:
public vod setX(int newValue) {
x = newValue;
}
由于setX
尝试在已经分配(在构造函数中)后分配给最终字段,此更改将产生编译错误。
答案 3 :(得分:0)
您已将变量定义为最终。
private final int x;
private final int y;
并且您在构造函数中为它们赋值,这是完全有效的。此外,您正在创建具有不同值的两个不同的FinalVariablesTest实例,这些实例再次完全合法且正确。
但是,如果你做了类似
的事情private static final int x;
private static final int y;
您甚至无法在构造函数中初始化它.Final字段不会获取默认值,必须显式初始化它们。最终变量只能通过初始化程序或赋值语句初始化一次。如果没有为最终实例变量赋值 - 则会出现编译错误!
你必须在声明
时对其进行初始化private static final int x = 0;
private static final int y = 0;
所以,假设您说private static final int y;
,然后不创建任何对象的实例System.out.println(FinalVariablesTest.x);
那将是错误的。
因此,你所做的是完全有效和合法的,但有轻微的变化(使其静态,因此变量现在属于类而不是个别实例)你不能做你已经实验过的。
答案 4 :(得分:0)
System.out.println(“X =”+ finalVariablesTest.getX()+“Y =”+ finalVariablesTest.getY());打印X = 1 Y = 2& X = 4 Y = 5,因为你创建了一个新对象并分配给已经创建的对象。