У меня есть следующий код:
class Hello {
class Thing {
public int size;
Thing() {
size = 0;
}
}
public static void main(String[] args) {
Thing thing1 = new Thing();
System.out.println("Hello, World!");
}
}
Я знаю Thing
, ничего не делает, но моя программа Hello, World прекрасно компилируется без нее. Это только мои определенные классы, которые терпят неудачу на мне.
И он отказывается компилировать. Я добираюсь No enclosing instance of type Hello is accessible."
до линии, которая создает новую вещь. Я предполагаю либо:
- У меня проблемы системного уровня (либо в DrJava, либо в моей установке Java), либо
- У меня есть некоторые базовые недоразумения о том, как создать рабочую программу в Java.
Любые идеи?
java
inner-classes
coolpapa
источник
источник
Ответы:
static class Thing
заставит вашу программу работать.Как есть, у вас есть
Thing
внутренний класс, который (по определению) связан с конкретным экземпляромHello
(даже если он никогда не использует его или не ссылается на него), что означает, что говорить об ошибке,new Thing();
не имея конкретногоHello
экземпляра в объем.Если вы объявите его как статический класс, то это «вложенный» класс, который не нуждается в конкретном
Hello
экземпляре.источник
outer class
,non-static inner class
будет создан объект, даже если я его нигде не использую?Вы объявили класс
Thing
как нестатический внутренний класс. Это означает, что он должен быть связан с экземпляромHello
класса.В вашем коде вы пытаетесь создать экземпляр
Thing
из статического контекста. Это то, на что жалуется компилятор.Есть несколько возможных решений. Какое решение использовать, зависит от того, чего вы хотите достичь.
Перемещение
Thing
изHello
класса.Изменить,
Thing
чтобы бытьstatic
вложенным классом.Создайте экземпляра из
Hello
до создания экземпляраThing
.Последнее решение ( нестатический вложенный класс) будет обязательным, если какой-либо экземпляр
Thing
зависит от экземпляра,Hello
чтобы иметь смысл. Например, если бы мы имели:любая грубая попытка создать объект класса
Thing
, как в:было бы проблематично, так как не было бы очевидного
enormous
значения для проверки 31 против него. Экземплярh
изHello
внешнего класса необходимо , чтобы обеспечить этуh.enormous
величину:Потому что это не означает, что
Thing
если у него нетHello
.Для получения дополнительной информации о вложенных / внутренних классах: Вложенные Классы (Учебные руководства Java)
источник
Thing thing1 <<HelloInstantiation>>.new Thing()
является ключевым. Я провел несколько минут в замешательстве, используя синтаксисThing thing1 new <<HelloInstantiation>>.Thing()
. = PНу ... так много хороших ответов, но я хочу добавить еще. Краткий обзор Inner class в Java-Java позволяет нам определить класс в другом классе, и возможность вложения классов таким образом имеет определенные преимущества:
Он может скрывать (увеличивает инкапсуляцию) класс от других классов - особенно актуально, если этот класс используется только тем классом, в котором он содержится. В этом случае внешний мир не должен знать об этом.
Это может сделать код более понятным, так как классы логически сгруппированы вокруг того места, где они необходимы.
Внутренний класс имеет доступ к переменным экземпляра и методам содержащего его класса.
У нас есть в основном три типа
Inner Classes
Некоторые важные моменты, которые следует помнить
Давайте попробуем увидеть вышеизложенные концепции практически.
Я надеюсь, что это поможет всем. Пожалуйста, обратитесь к более
источник
Thing
является внутренним классом с автоматическим подключением к экземпляруHello
. Вы получаете ошибку компиляции, потому что нет экземпляраHello
для присоединения. Это проще всего исправить, изменив статический вложенный класс, который не имеет связи:источник
Давайте разберемся со следующим простым примером. Это происходит потому, что это НЕСТАТИЧЕСКИЙ ВНУТРЕННИЙ КЛАСС. Вам нужен экземпляр внешнего класса.
источник