2013-07-23 25 views
-4

如果您运行下面的代码片段中,你会得到这样的输出为最后的变量X和Y与Java最终变量播放 - 需要说明 - 代码提供

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

在Java中,在类的构造函数中设置了'final'实例变量并在此之后**不能**修改这个值。所以,你不会重新分配任何东西。 –

+0

@格雷格,你显然不明白OOP。 – mre

+0

你不重新分配。您正在创建FinalVariablesTest的两个实例。 X和Y是实例变量。 – km1

回答

5

不,这不是一个违反 - 有两个独立的实例,每个已绑定xy不同final值。

您已更改由finalVariablesTest引用的实例。

0

FinalVariablesTest类不是单例,所以你可以根据需要创建尽可能多的对象和不同的FinalVariablesTest Object会有不同的组x和y最终veriable中,你不能换一次创造的价值,所以这是不是违反

0

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

要查看终结手段,试图将这种方法类:

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

这种变化将产生一个编译错误,由于setX想它已经被分配之后,分配给最终场(在构造函数中)。

0

您已将您的变量定义为Final。

private final int x; 
private final int y; 

并且您在构造函数中为它们赋值是完全有效的。另外,您还创建了两个具有不同值的FinalVariablesTest实例,这些实例又完全合法且正确。

不过,如果你会做类似

private static final int x; 
private static final int y; 

你甚至不能初始化它在constructor.Final领域没有得到默认值,他们必须明确初始化。最终变量只能通过初始化程序或赋值语句初始化一次。如果最终的实例变量没有赋值 - 会出现编译错误!

你必须初始化它同时宣布

private static final int x = 0; 
private static final int y = 0; 

因此,可以说你说private static final int y;然后,而无需创建你System.out.println(FinalVariablesTest.x);那将是错误的对象的任何实例。

因此,你做了什么是完全有效的,但是法律有轻微变化(使其静态的,所以现在的变量属于类,而不是单个实例),你不能这样做,你已经尝试了什么。

0

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