[英]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
的变量,则该表达式无效。 如果您已创建变量ball
和paddle
但尚未将它们设置为引用某个实例,则该表达式将编译但无法正确执行。 您应该具有以下内容:
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.