Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;无法从静态上下文引用非静态方法;但没有静态变量或方法_Java_Bluej - Fatal编程技术网

Java &引用;无法从静态上下文引用非静态方法;但没有静态变量或方法

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

我必须做一个作业(在Java中,使用BlueJ),在这个作业的一部分中,我需要在PlayerShip类中有一个“Move”方法。根据作业说明,我还需要在Gun类中使用相同的方法,PlayerShip类中的方法必须调用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;
    }
}
这是我的球员级别的代码:

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
方法。谢谢,这很有帮助。我会继续练习!