【发布时间】:2025-11-28 00:00:01
【问题描述】:
我必须做一个作业(在 Java 中,使用 BlueJ),并且在这个作业的一部分中,我需要在 PlayerShip 类中有一个“移动”方法。根据赋值说明,我在Gun类中也需要有这个相同的方法,而且PlayerShip类中的方法必须调用Gun类中的方法两次。作为参考,我提供了我的 Gun 类的代码:
public class Gun
{
private int position;
private int power;
private int points;
private boolean justFired;
public Gun(int initialPosition, int initialPower)
{
position = initialPosition;
power = initialPower;
}
public void Move(int distance)
{
position = position + distance;
}
}
这是我的 PlayerShip 类的代码:
public class PlayerShip
{
private int position;
public PlayerShip()
{
position = Global.promptInt("Player position: ");
Gun gun1 = new Gun(position - 1, 5);
Gun gun2 = new Gun(position + 1, 5);
}
public void Move(int distance)
{
position = position + distance;
Gun.Move(distance);
}
}
现在的问题是,我不断收到错误消息:
非静态方法 Move(Int) 不能被静态上下文引用
当我尝试从 PlayerShip 类中的 Move() 方法调用 Gun 类中的 Move() 方法时。我不知道为什么我会收到此错误,因为所有变量或方法都不是静态的,而且我没有想法,因此不胜感激
编辑:标记软件非常死板,如果变量是静态的,则不接受我的代码
【问题讨论】:
-
对不起,如果我的问题看起来含糊不清或令人困惑,如果有人需要任何澄清,请随时提问,我会尽我所能更好地传达我的问题:)
-
“我不知道为什么我会收到这个错误,因为没有一个变量或方法是静态的”这就是 why 你收到错误的原因 -- @987654323 @ 尝试在静态上下文中调用
Move,而不是在Gun的 instance 上调用它 -
嗨乔治,那很快哈哈谢谢你。我应该提到的另一个问题是标记软件非常僵化,变量“位置”不能是静态的(我尝试将其设为静态但软件不接受它)。那么我应该以某种方式尝试使“距离”保持静态吗?
-
@JaffarAli 不,avoid 是静态的,因为它是一个类全局范围。在实例上调用方法。需要将`gun`的方法变量转换为对象的变量。
-
正如 George 已经解释的那样,问题是尝试在
PlayerShip类的Move方法中静态调用Gun的Move方法。您正在构造函数中创建Gun的两个实例。因此,您可以将这些实例分配给PlayerShip类的字段,然后在每个字段上调用 Move方法。