Java 子方法未按预期更新本地实例变量

Java 子方法未按预期更新本地实例变量,java,Java,我最近开始学习Java,所以这是一个初学者的问题。 我有下面的简单代码,我花了一个小时调试,但没有成功。我觉得这涉及到了实例变量的一个非常基本的概念,我还没有完全掌握 我的程序创建了一个在屏幕上移动的GOval对象。实例变量用于指定球的大小和起始速度/方向(定义为随机x/y坐标)。跑步程序中的while循环使球保持移动 我的程序的目标是让移动的球停留在窗口内,只要它碰到图形窗口的四面墙中的任何一面,就让它反向运动。如果在run方法中写入了用于反转球方向的if语句,那么让球从墙上反弹是没有问题的。

我最近开始学习Java,所以这是一个初学者的问题。 我有下面的简单代码,我花了一个小时调试,但没有成功。我觉得这涉及到了实例变量的一个非常基本的概念,我还没有完全掌握

我的程序创建了一个在屏幕上移动的GOval对象。实例变量用于指定球的大小和起始速度/方向(定义为随机x/y坐标)。跑步程序中的while循环使球保持移动

我的程序的目标是让移动的球停留在窗口内,只要它碰到图形窗口的四面墙中的任何一面,就让它反向运动。如果在run方法中写入了用于反转球方向的if语句,那么让球从墙上反弹是没有问题的。但是,如果我在另一个方法CheckWall中使用相同的代码,球不会像预期的那样反弹,只是离开屏幕

有人能帮我理解为什么子方法不能按预期工作吗?我在本例中使用的实例变量正确吗

注意,在我下面的代码中,我使用//注释了run方法中正常工作的if语句。这些相同的方法已复制/粘贴到我的CheckWall方法中

public class S7_DebuggingExample extends GraphicsProgram {
    private RandomGenerator rgen = new RandomGenerator();
    private static final int BALL_RADIUS = 20;
    private static final double MIN_DX = 2.0; 
    private static final double MAX_DX = 3.0; 
    private static final double MIN_DY = 2.0; 
    private static final double MAX_DY = 3.0;
    private static final double PAUSE = 15.0; 
    private GOval ball;
    private double dx;
    private double dy;

    public void run() { 
        double dx = rgen.nextDouble(MIN_DX, MAX_DX); 
        double dy = rgen.nextDouble(MIN_DY, MAX_DY);

        SetupBall();

        while (true) { 
            ball.move(dx, dy); 
//          if (ball.getX() <= 0 || ball.getX() >= getWidth() - (BALL_RADIUS * 2)) dx = -dx;
//          if (ball.getY() <= 0 || ball.getY() >= getHeight() - (BALL_RADIUS * 2)) dy = -dy;
            CheckWall();
            pause(PAUSE);
        }
    }

    private void CheckWall() {
        if (ball.getX() <= 0 || ball.getX() >= getWidth() - (BALL_RADIUS * 2)) dx = -dx;
        if (ball.getY() <= 0 || ball.getY() >= getHeight() - (BALL_RADIUS * 2)) dy = -dy;
    }


private void SetupBall() { 
    ball = new GOval(BALL_RADIUS * 2, BALL_RADIUS * 2); 
    ball.setFilled(true); 
    ball.setColor(Color.RED); 
    double x = rgen.nextDouble(0, getWidth() - (BALL_RADIUS * 2)); 
    double y = rgen.nextDouble(0, getHeight() - (BALL_RADIUS * 2)); 
    ball.setLocation(x, y); 
    add(ball);
}

您有两个名为dx的变量。函数更新类成员变量,但run方法使用方法中定义的局部变量

在类中声明了两个变量dx和dy。 以下是全局变量,所有方法都访问这些变量,除非它们找到具有相同名称和类型的局部变量。选择局部变量而不是类变量

private double dx;
private double dy;

因此,在方法运行外部,在运行内部使用的dx和dy将无效,并使用类级变量。

Checkwall使用类中声明的dx和dy变量,而run方法使用在运行中本地定义的变量。因此问题就来了。只需注释掉本地定义的运行变量,并在SetUpBall方法中初始化类成员dx和dy。

如果在run方法中有代码行,则更改在run方法中定义的变量dx和dy,而如果在CheckWall方法中有它们,您正在更改类中定义的实例变量dx和dy。非常感谢大家的反馈。这是我有史以来第一个关于StackOverflow的问题,社区支持真是太棒了!如果下面的答案对你有帮助,你可以向上投票,并将给出最佳解决方案的答案标记为正确答案。谢谢。
public class S7_DebuggingExample extends GraphicsProgram {
    private RandomGenerator rgen = new RandomGenerator();
    private static final int BALL_RADIUS = 20;
    private static final double MIN_DX = 2.0; 
    private static final double MAX_DX = 3.0; 
    private static final double MIN_DY = 2.0; 
    private static final double MAX_DY = 3.0;
    private static final double PAUSE = 15.0; 
    private GOval ball;
    private double dx;
    private double dy;

    public void run() { 
        double dx = rgen.nextDouble(MIN_DX, MAX_DX); 
        double dy = rgen.nextDouble(MIN_DY, MAX_DY);

        SetupBall();

        while (true) { 
            ball.move(dx, dy); 
//          if (ball.getX() <= 0 || ball.getX() >= getWidth() - (BALL_RADIUS * 2)) dx = -dx;
//          if (ball.getY() <= 0 || ball.getY() >= getHeight() - (BALL_RADIUS * 2)) dy = -dy;
            CheckWall();
            pause(PAUSE);
        }
    }

    private void CheckWall() {
        if (ball.getX() <= 0 || ball.getX() >= getWidth() - (BALL_RADIUS * 2)) dx = -dx;
        if (ball.getY() <= 0 || ball.getY() >= getHeight() - (BALL_RADIUS * 2)) dy = -dy;
    }


private void SetupBall() { 
    ball = new GOval(BALL_RADIUS * 2, BALL_RADIUS * 2); 
    ball.setFilled(true); 
    ball.setColor(Color.RED); 
    double x = rgen.nextDouble(0, getWidth() - (BALL_RADIUS * 2)); 
    double y = rgen.nextDouble(0, getHeight() - (BALL_RADIUS * 2)); 
    ball.setLocation(x, y); 
    add(ball);
}