2012-07-17 33 views
-1

过去几个小时,我一直对以下内容感到困惑。我有一个Fraction类具有恒定的零级分,例如:私人静态最终变更的价值

class Fraction{ 
    private static final Fraction ZERO = new Fraction(0,1); 

    public static Fraction zero(){ 
     return ZERO; 
    } 
[etc] 
} 

随后,我发现的ZERO变化执行的过程中,在该值:

System.out.println(Fraction.zero()); 
Fraction half = new Fraction(1, 2); 
System.out.println(Fraction.zero()); 

输出:

1/1 
1/2 

虽然显然产生的值应该是0/1,并且更重要的是固定的。 这个问题绝对不是与Fraction类和与之相关的GCD计算器的实现,因为我已经在过去成功和广泛地使用了它们。

任何关于这种奇怪行为的想法和想法都非常感谢。

+1

[最小测试用例](http://sscce.org),或者它没有发生! – 2012-07-17 18:34:39

+1

其余代码plz – DaTroop 2012-07-17 18:35:16

+1

另请参阅:http://ideone.com/vyK81。 – 2012-07-17 18:36:57

回答

3

您应该向我们展示该类中的其余代码 - 我猜测分子和分母变量已被标记为static,而它们确实应该是常规实例变量。

无论问题是什么,final字段引用的对象的内容都不会改变 - final修饰符只能确保该字段不能引用另一个对象。对象本身不受保护。

+1

特别是,显示构造函数 - 因为这是被调用的代码似乎改变了值 - 以及它修改的成员的声明。 – 2012-07-17 18:35:00

+1

谢谢,分子和分母确实是静态的。这解决了它;在静态/最终方面,我(正如我现在再次意识到的那样)在初次写这个类时是个新手。 – 2012-07-17 18:38:00

+2

@NominSim:除非它被编辑,我没有看到你所看到的,这绝对是一个答案。 – 2012-07-17 18:40:30