繁体   English   中英

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

[英]Why does Java think my object is a variable?

好的,所以我试图做一个简单的乒乓球游戏。 我有一个跟随鼠标的桨和一个反弹的球。 我在Sprite类中编写了一个collidesWith(Sprite s)方法,该方法检查球是否与桨碰撞(这是可行的,而不是问题)。 我有两个扩展我的Sprite类的对象,一个球和一个球拍对象。 因此,在我的球类课程中,我试图检查它是否与桨碰撞。 所以我尝试了

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类的子类。 有人知道为什么他们不一样吗?

class Paddle {}

Paddle是一类。

Paddle paddle;

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

Paddle paddle = new Paddle();

paddle是一个变量,它引用Paddle的实例。

ball.collidesWith(paddle)

是一个表达式,该表达式在名为ball的变量所引用的对象上调用名为collidesWith的方法,并将由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都必须是一个在可见位置声明的变量。

我的猜测(与您所提供的有限信息一样,我只能做些猜测):您没有在球类知道的范围内声明paddle 或者也许您确实声明了它,但是在此代码运行时尚未定义它。

通常,您将编写一个管理类,该类知道并维护桨实例,同时也知道球实例。 与其让球检查是否有碰撞,不如让管理班级来做。 考虑到管理类也将负责构建您的球拍和球,因此已经将它们放在正确的范围内。 您的管理类将对两个桨中的每一个都有一个ball.collidesWith(paddle)检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM