使用Java最终变量 - 需要说明 - 提供代码

时间:2013-07-23 04:17:59

标签: java

如果你运行下面的代码片段,你将获得最终变量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());
}
}

5 个答案:

答案 0 :(得分:5)

不,这是违规 - 有两个单独的实例,每个实例都有不同的final值绑定到xy

您已更改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,因为你创建了一个新对象并分配给已经创建的对象。