«На нестатический метод нельзя ссылаться из статического контекста», но нет статической переменной или метода - PullRequest
0 голосов
/ 12 мая 2018

Мне нужно выполнить задание (на Java, используя BlueJ), и в одной части этого задания мне нужен метод Move в классе PlayerShip.В соответствии с инструкциями по назначению мне также необходимо иметь этот же метод в классе 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;
    }
}

И вот код для моего класса 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) не может быть ссылкой из статического контекста

, когда я пытаюсь вызвать метод Move () в классе Gun,из метода Move () в классе PlayerShip.Я не знаю, почему я получаю эту ошибку, потому что ни одна из переменных или методов не является статической, и у меня нет идей, поэтому любая помощь приветствуется

Редактировать: Программное обеспечение для маркировки очень жесткое и не принимаетмой код, если переменные являются статическими

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

В вашем методе Move вы вызываете Gun.Move.

Gun - это класс, а не объект.Поэтому вы пытаетесь вызвать Move на «чертеже» оружия, а не на самом объекте оружия.

Когда вы создаете экземпляр класса PlayerShip, вы создаете два экземпляра оружия.Если я прав, предполагая, что вы хотите, чтобы класс 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 означает, что оно одинаково для каждого экземпляра объекта.

Надеюсь, это было полезно, трудно начать понимать, как объекты работают наНачните.

Продолжайте практиковать!

0 голосов
/ 12 мая 2018
Gun.Move(distance); 

- это способ вызова статических методов, а Move() - нет.

вы хотите, чтобы экземпляр Gun вызывал метод Move().

например

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