【问题标题】:"Non-static method cannot be referenced from a static context" but no static variable or method“不能从静态上下文引用非静态方法”但没有静态变量或方法
【发布时间】: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,而不是在 Guninstance 上调用它
  • 嗨乔治,那很快哈哈谢谢你。我应该提到的另一个问题是标记软件非常僵化,变量“位置”不能是静态的(我尝试将其设为静态但软件不接受它)。那么我应该以某种方式尝试使“距离”保持静态吗?
  • @JaffarAli 不,avoid 是静态的,因为它是一个类全局范围。在实例上调用方法。需要将`gun`的方法变量转换为对象的变量。
  • 正如 George 已经解释的那样,问题是尝试在 PlayerShip 类的 Move 方法中静态调用 GunMove 方法。您正在构造函数中创建 Gun 的两个实例。因此,您可以将这些实例分配给 PlayerShip 类的字段,然后在每个字段上调用 ​​Move 方法。

标签: java bluej


【解决方案1】:

在您的 Move 方法中,您调用 Gun.Move。

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

实例化 PlayerShip 类时,会创建两个 Gun 实例。如果我假设您希望 PlayerShip 类“拥有”两支枪是正确的。您可以为 PlayerShip 类提供两个私有 gun 变量,以便 move 方法可以访问它们。

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 关键字意味着它对于对象的每个实例都是相同的。

希望这对您有所帮助,从一开始就很难理解对象是如何工作的。

继续练习!

【讨论】:

  • 谢谢你,这帮助很大。我会继续练习!
【解决方案2】:
Gun.Move(distance); 

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

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

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

【讨论】:

    最近更新 更多