Java 私有静态最终更改的值

Java 私有静态最终更改的值,java,static,Java,Static,在过去的几个小时里,我一直被下面的问题困扰着。我有一个分数类,零分数有一个常数,如下所示: class Fraction{ private static final Fraction ZERO = new Fraction(0,1); public static Fraction zero(){ return ZERO; } [etc] } 随后,我发现零的值在执行过程中发生了变化,即: System.out.println(Fraction.zero

在过去的几个小时里,我一直被下面的问题困扰着。我有一个分数类,零分数有一个常数,如下所示:

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

    public static Fraction zero(){
        return ZERO;
    }
[etc]
}
随后,我发现零的值在执行过程中发生了变化,即:

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

1/1
1/2
显然,产生的价值应该是0/1,更重要的是,是固定的。 问题肯定不在于分数类的实现以及与之相关的GCD计算器,因为我在过去已经成功且广泛地使用了它们


非常感谢您对这种奇怪行为原因的任何想法和想法。

您应该向我们展示类中的其余代码-我猜分子和分母变量已经标记为静态变量,而它们实际上应该是常规实例变量


无论问题是什么,最终字段更改所引用的对象的内容没有问题-最终修改器只确保字段不能引用另一个对象。对象本身未受保护。

请注意,否则它不会发生!代码的其余部分也请参见:。问题的原因是分子和分母变量的静态修饰符放置错误。关于我问题的措辞,即SSCCE正式指出,未来我将尝试从一开始就提供所有相关信息。特别是,显示构造函数-因为调用的代码似乎会改变值-以及它修改的成员声明。谢谢,分子和分母确实是静态的。这就解决了问题,;在静态/最终方面,我现在再次意识到,在最初编写这个类时,我是一个新手。@NominSim:除非它被编辑过,而我看不到你看到的东西,否则这肯定是一个答案。@JonSkeet,assylias,它被编辑过,最初它只是一个显示其余代码的初步建议。如果我可以说点什么,我的问题是让人们指出这种行为的可能原因。这正是@AasmundEldhuset所提供的。顺便说一下,我对静态修饰符和最终修饰符的理解也得到了增强。今后,我会尽量在问题上更具体一些。谢谢大家。