Java &引用;无法从静态上下文引用非静态方法;但没有静态变量或方法
我必须做一个作业(在Java中,使用BlueJ),在这个作业的一部分中,我需要在PlayerShip类中有一个“Move”方法。根据作业说明,我还需要在Gun类中使用相同的方法,PlayerShip类中的方法必须调用Gun类中的方法两次。为了便于参考,我提供了我的枪类代码:Java &引用;无法从静态上下文引用非静态方法;但没有静态变量或方法,java,bluej,Java,Bluej,我必须做一个作业(在Java中,使用BlueJ),在这个作业的一部分中,我需要在PlayerShip类中有一个“Move”方法。根据作业说明,我还需要在Gun类中使用相同的方法,PlayerShip类中的方法必须调用Gun类中的方法两次。为了便于参考,我提供了我的枪类代码: public class Gun { private int position; private int power; private int points; private bool
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;
}
}
这是我的球员级别的代码:
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);
}
}
现在的问题是,我不断得到一个错误:
非静态方法移动(Int)不能从静态上下文引用
当我试图调用Gun类中的Move()方法时,从PlayerShip类中的Move()方法。我不知道为什么会出现这个错误,因为没有一个变量或方法是静态的,而且我也没有主意,所以非常感谢您的帮助 编辑:标记软件非常严格,如果变量是静态的,则不接受我的代码
Gun.Move(distance);
是调用静态方法的方式,而Move()
不是
您需要一个Gun
的实例来调用Move()
方法
比如
Gun gun = new Gun();
gun.Move()
在你的移动方法中,你叫Gun.Move 枪是一个类而不是一个对象。因此,您试图在枪的“蓝图”上调用移动,而不是实际的枪对象 当您实例化PlayerShip类时,您将创建两个Gun实例。如果我的假设是正确的,你想让剧组拥有两把枪。您可以给PlayerShip类两个私有gun变量,以便move方法可以访问它们
public class PlayerShip
{
private int position;
private Gun gun1;
private Gun gun2;
// rest of code
}
从这里,您可以访问您的玩家对象拥有的枪对象
按如下方式创建构造函数和移动方法:
public PlayerShip()
{
position = Global.promptInt("Player position: ");
gun1 = new Gun(position - 1, 5);
gun2 = new Gun(position + 1, 5);
}
public void Move(int distance)
{
position = position + distance;
gun1.Move(distance);
gun1.Move(distance);
}
当您试图对Gun类而不是单个实例调用方法时,收到了一个静态引用错误
static关键字表示对象的每个实例都是相同的
希望这是有帮助的,一开始就很难理解对象是如何工作的
继续练习 很抱歉,如果我的问题看起来模糊或令人困惑,如果有人需要任何澄清,请随时提问,我将尽最大努力更好地表达我的问题:)“我不知道为什么我会出现此错误,因为没有任何变量或方法是静态的”这就是您出现错误的原因--
Gun.Move(距离)
是在静态上下文中调用Move
的一种尝试,而不是在Gun
的实例上调用它。嗨,乔治,这很快,哈哈,谢谢。我应该提到的另一个问题是,标记软件非常严格,变量“位置”不能是静态的(我尝试将其设置为静态,但软件不接受)。那么,我是否应该设法使“距离”保持静态?@JaffarAli不,避免静态,因为它是一个类全局范围。在实例上调用该方法。您需要将'gun'的方法变量转换为对象的变量。正如George已经解释的,问题是试图在您的玩家
类的Move
方法中静态调用gun
的Move
方法。您正在构造函数中创建两个Gun
实例。因此,您可以将这些实例分配给类PlayerShip
的字段,然后在每个字段上调用Move
方法。谢谢,这很有帮助。我会继续练习!