Java停止更改传递给它的变量的方法
我正在将一个变量从main传递到另一个类中的方法。我认为变量可以在方法内部更改,而不必在main中更改。通过使用大量的print语句,我发现我的'updatePosition'方法实际上修改了变量'newVelocity',并且修改以某种方式返回到了主类。我怎样才能阻止这一切?? 下面是调用方法的主类中的循环:Java停止更改传递给它的变量的方法,java,Java,我正在将一个变量从main传递到另一个类中的方法。我认为变量可以在方法内部更改,而不必在main中更改。通过使用大量的print语句,我发现我的'updatePosition'方法实际上修改了变量'newVelocity',并且修改以某种方式返回到了主类。我怎样才能阻止这一切?? 下面是调用方法的主类中的循环: //do{ projectile.updatePosition(newPosition, newVelocity, timeStep, g); S
//do{
projectile.updatePosition(newPosition, newVelocity, timeStep, g);
System.out.println("This is newVelocity");
newVelocity.print(); //This variable has been modified!!! Doesn't print what it should
projectile.getNewPosition();
System.out.println("This is new position");
newPosition.print();
newPositionForNewtonsLaw = newPositionForNewtonsLaw.add(distance,newPosition);
newG = earth.aDueToGravity(earthMass, earthRadius, newPositionForNewtonsLaw);
projectile.updateVelocity(newVelocity, timeStep, g, newG);
newV = projectile.getNewVelocity();
System.out.println("new velocity");
newV.print();
g=earth.aDueToGravity(earthMass, earthRadius, newPositionForNewtonsLaw);
System.out.println("This is newG");
newG.print();
g.print();
newVelocity = projectile.getNewVelocity();
positionX=newPosition.getX();
positionY=newPosition.getY();
System.out.println(positionX);
System.out.println(positionY+"y");
//}while (positionY>0);
这里是修改变量的方法,尽管我确信它不应该
public PhysicsVector updatePosition(PhysicsVector initialPosition, PhysicsVector initialVelocity, double timeStep, PhysicsVector a){
PhysicsVector v = new PhysicsVector();
v=initialVelocity;
a.scale(0.5*timeStep);
v.increaseBy(a);
v.scale(timeStep);
System.out.println("This is initialVelocity");
initialVelocity.print();
initialPosition.increaseBy(v);
return initialPosition;
}
newVelocity是一个对象(从类到向量),我不知道它是否可以声明为public、static、private等,或者这些东西是否真的有用。如果您希望该方法不能更改其参数的值:
public PhysicsVector updatePosition(final PhysicsVector initialPosition,
final PhysicsVector initialVelocity, final double timeStep, final PhysicsVector a){....}
这将防止该方法更改其参数的值Java是按值传递的。如果将PhysicsVector
对象传递给updatePosition
方法,则传递的是实际指向堆上相同对象的引用副本
您应该将对象的副本传递给updatePosition
,或者在该方法中创建副本
要创建副本,可以在PhysicsVector
类中引入副本构造函数
public PhysicsVector(PhysicsVector originalVector){
// Setup the values with those contained in originalVector
}
然后在updatePosition()
方法中实例化一个新的PhysicsVector
PhysicsVector v = new PhysicsVector(initialVelocity);
或者,您可以创建一个复制方法来执行相同的操作,并返回一个
PhysicsVector
,这是使用可变对象的真正问题。当您使用可变概念时,您应该真正意识到它
解决方案之一是创建一个新对象,并用旧对象的内部结构填充它,然后传递它
另一种可能是不修改方法内部的对象
第三个是停止使用可变对象,并将类声明为不可变的。任何进行更改的方法都会返回具有新状态的新对象
PhysicsVector increaseBy(PhysicsVector another) {
PhysicsVector newOne = new PhysicsVector(another.X + this.X);
return newOne;
}
而不是
void increaseBy(PhysicsVector another) {
this.X += another.X;
}
这就是对象的工作方式。传一份给它。另外,将其标记为
final
Java是传递值。这意味着,如果您传递一个值为object O的变量x,那么在调用之后,x仍将作为值object O。但是,O的字段可能会被更改。使用调试器一步一步地检查代码要容易得多,而不是将程序与打印语句混在一起,然后必须返回并删除这些语句remove@RoyalBg我如何传递副本?抱歉,对java来说真的很陌生。创建一个新对象并用旧对象的值填充它。然后把新的传过去。此外,还可以使对象不可变。不要提供更改其状态的方法,相反,这些方法应该返回新对象。例如,字符串
类就是这样工作的。因此,方法更改传递给它的值是否正常??您可能知道,java是新手!是的,它可以改变值,我以为你不想改变值,但似乎你想改变它,对吗?不,你是对的,我不想改变它!只是想知道为什么它不会自动改变。我认为java是“按值传递”,我理解这意味着方法不能改变它们的参数。它不会改变变量的值,而是改变它的内部结构。@RoyalBg我只是在谷歌上搜索了“内部结构java”,没有发现任何有意义的东西。内部结构是什么?它们是我用来创建PhysicsVector对象的参数吗?