Java静态常量类变量赋值

Java静态常量类变量赋值,java,variable-assignment,static-members,Java,Variable Assignment,Static Members,我正在用Java创建Vector2类,但遇到了一个问题: public class Vector2 { public static final Vector2 ZERO = new Vector2(0,0); ... } 在另一个类中,我想这样称呼零: Vector2 myVector = Vector2.ZERO; //initialize to zero myVector.add(myOtherVector); //myVector is now the sum of Ve

我正在用Java创建Vector2类,但遇到了一个问题:

public class Vector2 {
    public static final Vector2 ZERO = new Vector2(0,0);
    ...
}
在另一个类中,我想这样称呼零:

Vector2 myVector = Vector2.ZERO; //initialize to zero
myVector.add(myOtherVector); //myVector is now the sum of Vector2.ZERO and myOtherVector
然而,这是不受欢迎的:myVector只是变成Vector2.ZERO——因此不可更改——而不是初始化为零值,然后按照我的意愿自由使用。要获得我想要的行为,我需要:

Vector2 myVector = new Vector2(Vector2.Zero); //initialize to zero with copy constructor
我对Java的语义有点困惑(例如,someVector本质上似乎是一个指针,而不是一个实际的对象,所以我必须创建一个新的对象并显式地复制这些值。)读了这篇文章后,我了解到在这个主题上有很多困惑。有没有一种简单的方法来实现我想要的语法,或者我应该坚持使用选项2?如果没有,是否有办法阻止选项1中的赋值?如果我不在编译时停止它,它会给我一些以后很难捕捉到的错误

编辑:Vector2不是不可变的。我想让Vector2.ZERO成为一个常量值,我可以用它来赋值,但是可以正常操作这些新变量。现在如果我在多个地方进行赋值,那么所有这些都只是指向同一个对象的指针(因为它是静态的,所以只会累积更改)

例如,在Unity中,当使用向量时,我会说:

Vector2 myFirstVector = Vector2.ZERO; //first vector, initialized to zero
...//do some stuff to change the value of myFirstVector, Vector2.ZERO unchanged


Vector2 mySecondVector = Vector2.ZERO; //second vector, also initialized to zero
...//do some stuff to mySecondVector

这就是OOP和对象引用的全部要点

Vector2 myVector = Vector2.ZERO;
意味着您的
myVector
变量将引用与静态字段
Vector2.ZERO相同的对象(内存中)。基本上,它是在内存中引用相同的对象

你写道:

someVector本质上似乎是一个指针


好吧,就这样吧。引用可以理解为指向对象的指针,就像指向C中定义的内存地址的指针一样。

您可能需要创建一个静态工厂方法来返回一个归零的新向量

public class Vector2 {
    public static Vector2 Zero() {
         return new Vector2(0,0);
    }
}
然后使用它:

Vector2 myVector = Vector2.Zero();
当然,如果您的默认构造函数将向量初始化为0,0,那么您可能不需要它,只需执行以下操作:
Vector2 myVector=new Vector2()


你最初的想法是:“然而,这是不可取的:myVector只是变成Vector2.ZERO——因此不可更改——”是不正确的,除非Vector2是不可变的。您将无法将任何其他内容重新分配给Vector2.ZERO,但您肯定可以修改对象的内容。

如果您希望向量是可变的,那么使用一个包含零向量的静态字段不是一个好选择(因为它以后可能会变为其他内容)

您可以采取两种方法:
可变向量

public class Vector2 {
    public static Vector2 Zero() {
         return new Vector2(0,0);
    }
}
不可变向量

public class Vector2 {

  public static final Vector2 ZERO = new Vector2(0, 0);

  private final int x;
  private final int y;

  public Vector2(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public Vector2 add(Vector2 v) {
    return new Vector2(this.x + v.x, this.y +v.y);
  }
}
创建类,这样
add()
将返回一个新实例,而不是修改实例,然后:

myInstance = myInstance.add(myOtherVector);

从java中看到一个类,它是这样工作的。< /p>什么是向量C++?java是不可变的吗?它是“Java”而不是“java”,与C++不同,在Java中只有对象引用。这适用于所有非原始类型。不是一成不变的,但成员向量2应该是常量。我将更新问题以使其更清晰。如果有任何关于为未来读者澄清问题的建议,请让我知道。我不是100%赞成编辑问题。回答得好。这与在BigInteger、BigDecimal和BigDecimal中所做的相同类似的。被接受是因为现在我看到了它,我可能会更好地按照多个答案和评论的建议使它不可变。谢谢你的帮助!太好了,谢谢!我应该想到这一点。是的,我对不可变性的看法是错误的。我在使用向量数学绘制对象时看到了不受欢迎的行为,并认为这是错误的当他们实际积累所有作业的变化时,他们被困在(0,0)处。