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

标签 java

我正在将变量从 main 传递到另一个类中的方法。我认为可以在方法内部更改变量,而无需在 main 中更改。使用大量打印语句,我发现我的“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 是一个对象(从类到 vector ),我不知道它是否可以声明为公共(public)、静态、私有(private)等,或者这些东西是否真的有用。

最佳答案

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

关于Java 停止方法更改传递给它的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33943606/

相关文章:

java - 重播实时收集的数据以模拟真实的流量延迟和消息排序

java - 此驱动程序未配置集成身份验证

java - 一种方法中的双重递归

java - 什么时候在 Java 中实现 comparable 以及什么时候实现 equals

java - Libgdx Y轴,如何反转?

java - Android ACTION_MOVE图像设置图像滚动范围超出其父级

JavaFX 标签扩展无法强制

java - 尝试使用 javapns 向 Apple 推送通知服务发送通知

java - MYSQL 查询查找值

java - 在 Java 中将输入流重用到进程