-4

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

5 回答 5

5

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

您已更改 引用的实例finalVariablesTest

于 2013-07-23T04:20:13.610 回答
0

FinalVariablesTest 类不是单例的,因此您可以根据需要创建任意数量的对象,并且不同 的对象FinalVariablesTest Object将具有不同的 x 和 y 最终验证集,一旦创建就无法更改值,因此这不是违规

于 2013-07-23T04:22:49.260 回答
0

这些不完全是变量,而是(最终)实例归档。根据它们所属的对象,最终实例字段可以只分配一次。您的示例创建了两个对象(您有两个new FinalVariablesTest表达式),并且对于每个这样的对象,实例字段都分配有不同的值。

要了解最终性意味着什么,请尝试将此方法添加到您的类中:

public vod setX(int newValue) {
  x = newValue;
}

setX由于在已分配(在构造函数中)之后尝试分配给最终字段,此更改将产生编译错误。

于 2013-07-23T04:23:49.930 回答
0

您已将变量定义为 Final。

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);是错误的。

因此,您所做的事情是完全有效和合法的,但是有轻微的变化(使其静态,因此变量现在属于类而不是单个实例),您不能做您已经尝试过的事情。

于 2013-07-23T04:32:17.060 回答
0

System.out.println(" X = "+finalVariablesTest.getX() + " Y = "+finalVariablesTest.getY()); 也打印 X=1 Y=2 & X=4 Y=5 因为你创建了一个新对象并分配给已经创建的对象。

于 2013-07-23T04:38:45.060 回答