"非静态方法不能从静态上下文引用"但没有静态变量或方法

时间:2018-05-12 14:01:45

标签: java bluej

我必须做一个作业(在Java中,使用BlueJ),在这个作业的一部分中,我需要有一个' Move' 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()方法时。我不知道为什么我收到此错误,因为没有任何变量或方法是静态的,我没有想法所以任何帮助表示赞赏

编辑:标记软件非常严格,如果变量是静态的,则不接受我的代码

2 个答案:

答案 0 :(得分:0)

Gun.Move(distance); 

是您调用静态方法的方式,Move()不是。

您希望Gun的实例调用Move()方法。

,例如

Gun gun = new Gun();
gun.Move()

答案 1 :(得分:0)

在你的Move方法中,你可以调用Gun.Move。

枪是一个阶级而不是一个对象。因此,您试图在Gun的“蓝图”上调用Move而不是实际的Gun对象。

当您实例化您的PlayerShip类时,您将创建两个Gun实例。如果我认为你希望PlayerShip课程“拥有”两支枪是正确的。您可以为PlayerShip类提供两个私有枪变量,以便移动方法可以访问它们。

public class PlayerShip
{
private int position;
private Gun gun1;
private Gun gun2;

// rest of code 

}

然后,您可以访问由您的PlayerShip对象拥有的枪对象。

创建构造函数并移动方法:

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 关键字表示对象的每个实例都是相同的。

希望这很有用,很难从一开始就了解对象的工作原理。

继续练习!