"Нестатическая переменная, на которую нельзя ссылаться из статического контекста" при создании объекта
Я написал код ниже, чтобы проверить концепцию классов и объектов в 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);
^
Ответы
Ответ 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