У меня есть следующий фрагмент кода:
public class MyClass {
class Inner {
int s, e, p;
}
public static void main(String args[]) {
Inner in;
}
}
До этой части код в порядке, но я не могу создать экземпляр «in» в основном методе, in = new Inner()
как показано на рисунке non static field cannot be referenced in static context
.
Как я могу это сделать? Я не хочу делать свой Inner
класс статичным .
java
static
inner-classes
Виктор Мукерджи
источник
источник
Ответы:
У вас также должна быть ссылка на другой внешний класс.
Если бы Inner был статическим, то это было бы
источник
OuterClass.StaticNestedClass nestedObj = new OuterClass.StaticNestedClass()
. Вложенные классы«Обычный» внутренний класс имеет скрытый (неявный) указатель на экземпляр внешнего класса. Это позволяет компилятору сгенерировать код для отслеживания указателя без необходимости его ввода. Например, если есть переменная «a» во внешнем классе, тогда код во внутреннем классе может просто выполнять «a = 0», но компилятор сгенерирует код для «outerPointer.a = 0», сохраняя скрытый указатель под обложки.
Это означает, что когда вы создаете экземпляр внутреннего класса, у вас должен быть экземпляр внешнего класса, чтобы связать его. Если вы делаете это создание внутри метода внешнего класса, компилятор знает, что нужно использовать this в качестве неявного указателя. Если вы хотите установить ссылку на какой-либо другой внешний экземпляр, используйте специальный «новый» синтаксис (см. Фрагмент кода ниже).
Если вы сделаете свой внутренний класс «статическим», тогда не будет скрытого указателя, и ваш внутренний класс не сможет ссылаться на члены внешнего класса. Статический внутренний класс идентичен обычному классу, но его имя находится внутри родительского класса.
Вот фрагмент кода, демонстрирующий синтаксис для создания статических и нестатических внутренних классов:
источник
Если вы хотите создать
new Inner()
из метода, сделайте это из метода экземпляра классаMyClass
:источник
Алексей Кайгородов - правильный ответ. Его решение позволяет создавать экземпляры внутренних классов из статического метода, такого как main () того же класса. В противном случае вы не сможете создать экземпляр внутреннего класса в статическом методе. Не компилируется. Решение Алексея компилируется и позволяет создавать экземпляры внутренних классов из статического метода. Другие ответы представляют собой интересные примечания, но я не считаю их ответами на конкретный вопрос.
источник