为什么Java认为我的对象是变量?

时间:2013-10-19 03:29:20

标签: java variables object

好的,所以我想尝试做一个简单的乒乓球比赛。我有一个跟随鼠标的球拍和一个反弹的球。我在我的Sprite类中写了一个方法collidesWith(Sprite s)来检查球是否与桨碰撞(这是有效的,不是问题)。我有两个对象扩展我的精灵类,一个球和一个桨对象。所以在我的球类里面,我试图检查它是否与桨一起碰撞。所以我试过了

if(this.collidesWith(paddle) == true){
    System.out.println("They touched");
}

我也尝试了ball.collidesWith(paddle)和其他组合,但它总是说桨(和我使用ball.collidesWith时的球)"Cannot find symbol. Symbol: variable paddle(or ball). Location: class Ball"

因此,如果我正确地阅读,它会认为桨(和球)是变量而且它正在抱怨,因为它无法找到它们。我怎样才能理解我传递的是对象,而不是变量?

有关额外信息,之前的作业让我制作了两个盒子,让它们在碰撞时改变颜色。在那个作业中,我使用与

相似的代码
if(boxOne.collidesWith(boxTwo) == true){
      System.out.println("yes");
}

在这段代码中它工作得很好。该程序知道boxOne和boxTwo是我的Sprite类的子类。任何人都知道为什么他们不会这样做?

2 个答案:

答案 0 :(得分:3)

class Paddle {}

Paddle是一个班级。

Paddle paddle;

paddle是一个尚未引用Paddle类(又称对象)实例的变量。

Paddle paddle = new Paddle();

paddle是一个变量,指的是Paddle的实例。

ball.collidesWith(paddle)

是一个表达式,它在名为collidesWith的变量引用的对象上调用名为ball的方法,并将名为paddle的变量引用的对象传递给它。如果尚未在此表达式的相同或封闭词法范围中定义名为ball的变量和名为paddle的变量,则表达式无效。如果您已创建变量ballpaddle但尚未将它们设置为引用某个实例,则表达式将编译但不会正确执行。你应该有这样的东西:

Ball ball = new Ball();
Paddle paddle = new Paddle();
if (ball.collidesWith(paddle)) { ... }

或者,正如您所指出的,如果您在Ball课程中,您可能会有以下内容:

class Ball {
    boolean collidesWith(Paddle paddle) {
        ...
    }

    void somethingElseWithAPaddle(Paddle paddle) {
        if (this.collidesWith(paddle)) { ... }
    }
}

在这种情况下,this是一个变量,您不必定义它并引用调用该方法的对象。无论你在何处编写表达式,paddle都必须是一个声明在某处可见的变量。

答案 1 :(得分:0)

我的猜测(正如您提供的有限信息,我做的不仅仅是猜测):您没有在球类知道的范围内声明paddle。或许你确实声明了它,但是在这段代码运行时没有定义它。

通常,您将编写一个管理类,它知道并维护paddle实例,同时知道ball实例。不要让球检查碰撞,而是让你的管理班做这件事。考虑到管理级别也将负责建造你的桨和球,它已经在正确的范围内。您的管理类将对两个拨片中的每一个进行ball.collidesWith(paddle)检查。