Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java停止更改传递给它的变量的方法_Java - Fatal编程技术网

Java停止更改传递给它的变量的方法

Java停止更改传递给它的变量的方法,java,Java,我正在将一个变量从main传递到另一个类中的方法。我认为变量可以在方法内部更改,而不必在main中更改。通过使用大量的print语句,我发现我的'updatePosition'方法实际上修改了变量'newVelocity',并且修改以某种方式返回到了主类。我怎样才能阻止这一切?? 下面是调用方法的主类中的循环: //do{ projectile.updatePosition(newPosition, newVelocity, timeStep, g); S

我正在将一个变量从main传递到另一个类中的方法。我认为变量可以在方法内部更改,而不必在main中更改。通过使用大量的print语句,我发现我的'updatePosition'方法实际上修改了变量'newVelocity',并且修改以某种方式返回到了主类。我怎样才能阻止这一切?? 下面是调用方法的主类中的循环:

//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对象的参数吗?