Подтвердить что ты не робот

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

Я написал код ниже, чтобы проверить концепцию классов и объектов в Java.

public class ShowBike {
    private class Bicycle {
        public int gear = 0;
        public Bicycle(int v) {
            gear = v;
        }
    }

    public static void main() {
        Bicycle bike = new Bicycle(5);
        System.out.println(bike.gear);
    }
}

Почему это дает мне ошибку ниже в процессе компиляции?

ShowBike.java:12: non-static variable this cannot be referenced from a static context
        Bicycle bike = new Bicycle(5);
                       ^
4b9b3361

Ответ 1

Сделайте ShowBike.Bicycle static.

public class ShowBike {

    private static class Bicycle {
        public int gear = 0;
        public Bicycle(int v) {
            gear = v;
        }

    }

    public static void main() {
        Bicycle bike = new Bicycle(5);
        System.out.println(bike.gear);
    }
}

В Java есть два типа вложенных классов: "Статический вложенный класс" и "Внутренний класс" . Без ключевого слова static это внутренний класс, и вам понадобится экземпляр ShowBike для доступа к ShowBike.Bicycle:

ShowBike showBike = new ShowBike();
Bicycle bike = showBike.new Bicycle(5);

Статические вложенные классы и обычные (не вложенные) классы почти одинаковы по функциональности, это просто разные способы группировки вещей. Однако при использовании статических вложенных классов вы не можете указывать их в разделенных файлах, что приведет к созданию одного файла, содержащего множество определений классов.

Ответ 2

Велосипед - это внутренний класс, поэтому вам нужен экземпляр внешнего класса для создания внутреннего экземпляра класса, например:

ShowBike sBike = new ShowBike();
Bicycle bike = sBike.new Bicycle(5);

Или вы можете просто объявить класс Bicycle как static, чтобы ваш текущий способ работал.

Ответ 3

Основной метод не может получить доступ к нестационарному члену своего класса.

Кстати, классы должны быть названы после существительных, а не глаголов. Поэтому лучший способ сделать это:

private class Bicycle {
    public int gear = 0;

    public Bicycle(int v) {
        gear = v;
    }

    public void showGear() {
        System.out.println(gear);
    }

    public static void main(String[] args) {
        Bicycle bike = new Bicycle(6);
        bike.showGear(); // Notice that the method is named after a verb
    }
}

Ответ 4

Вам нужно создать внешний объект класса внешнего внутреннего класса. или вам нужно сделать внутренний класс статичным. поэтому для внутреннего класса объект не требуется.

Ответ 5

Ваш класс Bicycle не является статичным и поэтому не может использоваться в нестационарном методе. Если вы хотите использовать его в основном методе, измените его на

private static class Bicycle