Java - никакой заключительный экземпляр типа Foo не доступен
у меня есть следующий код:
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
ничего не делает, но мой Привет, Мир программа компилируется нормально без него. Это только мои определенные классы, которые терпят неудачу на мне.
и он отказывается компилироваться. Я получаю No enclosing instance of type Hello is accessible."
в строке, которая создает нечто новое. Я тоже предполагаю:
- у меня проблемы системного уровня (либо в DrJava, либо в моей установке Java), либо
- у меня есть некоторые основные непонимание того, как построить рабочая программа на Java.
какие идеи?
5 ответов:
static class Thing
заставит вашу программу работать.как это, у вас есть
Thing
как внутренний класс, который (по определению) связан с конкретным экземпляромHello
(даже если он никогда не использует или ссылается на него), что означает, что это ошибка, чтобы сказатьnew Thing();
не имея конкретногоHello
экземпляр в области.если вы объявите его как статический класс вместо этого, то это "вложенный" класс, который не нуждается в конкретном
Hello
экземпляра.
вы объявили вещь класса как нестатический внутренний класс. Это означает, что он должен быть связан с экземпляром класса Здравствуйте.
в коде вы пытаетесь создать экземпляр вещи из статического контекста. Вот на что жалуется компилятор.
есть несколько возможных решений. Какое решение использовать, зависит от того, чего вы хотите достичь.
изменить вещь, чтобы быть статическим вложенным класс.
static class Thing
создать экземпляр Hello, а затем создать экземпляр Thing.
public static void main(String[] args) { Hello h = new Hello(); Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P }
переместить вещь из класса Hello.
для получения дополнительной информации о вложенных / внутренних классах: Вложенные Классы (Учебники Java)
хорошо... так много хороших ответов, но я хочу добавить больше об этом. Краткий обзор внутреннего класса в Java-Java позволяет нам определить класс внутри другого класса и Возможность вложить классы таким образом имеет определенные преимущества:
Он может скрыть(это увеличивает инкапсуляцию) класс из других классов, особенно важно, если класс используется только классом, в которой он содержится. В этом случае нет необходимости, чтобы внешний мир знал об этом.
можно сделать код более легким в обслуживании поскольку классы логически сгруппированы вместе вокруг того, где они необходимы.
внутренний класс открыть к переменным экземпляра и методам его содержащего класса.
у нас есть в основном три типа
Inner Classes
- Local inner
- Статический Внутренний Класс
- Анонимный Внутренний Класс
некоторые из важных моментов, чтобы помнить
- нам нужен объект класса для доступа к локальному внутреннему классу, в котором он существует.
- статический внутренний класс получает прямой доступ так же, как и любой другой статический метод того же класса, в котором он существует.
- анонимный внутренний класс не виден внешнему миру, а также другим методам или классам того же класса(в котором он is exist) и используется в том месте, где он объявлен.
давайте попробуем увидеть приведенные выше понятия практически_
public class MyInnerClass { public static void main(String args[]) throws InterruptedException { // direct access to inner class method new MyInnerClass.StaticInnerClass().staticInnerClassMethod(); // static inner class reference object StaticInnerClass staticInnerclass = new StaticInnerClass(); staticInnerclass.staticInnerClassMethod(); // access local inner class LocalInnerClass localInnerClass = new MyInnerClass().new LocalInnerClass(); localInnerClass.localInnerClassMethod(); /* * Pay attention to the opening curly braces and the fact that there's a * semicolon at the very end, once the anonymous class is created: */ /* AnonymousClass anonymousClass = new AnonymousClass() { // your code goes here... };*/ } // static inner class static class StaticInnerClass { public void staticInnerClassMethod() { System.out.println("Hay... from Static Inner class!"); } } // local inner class class LocalInnerClass { public void localInnerClassMethod() { System.out.println("Hay... from local Inner class!"); } } }
Я надеюсь, что это поможет всем. Пожалуйста смотрите больше
давайте разберемся в этом на следующем простом примере. Это происходит потому, что это нестатический внутренний класс. Вам должен понадобиться экземпляр внешнего класса.
public class PQ { public static void main(String[] args) { // create dog object here Dog dog = new PQ().new Dog(); //OR PQ pq = new PQ(); Dog dog1 = pq.new Dog(); } abstract class Animal { abstract void checkup(); } class Dog extends Animal { @Override void checkup() { System.out.println("Dog checkup"); } } class Cat extends Animal { @Override void checkup() { System.out.println("Cat Checkup"); } } }
Thing
это внутренний класс С автоматическим подключением к экземпляруHello
. Вы получаете ошибку компиляции, потому что нет экземпляраHello
для его прикрепления. Вы можете исправить это наиболее легко, изменив его на статический вложенный класс который не имеет никакой связи:static class Thing