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." в строке, которая создает нечто новое. Я тоже предполагаю:

  1. у меня проблемы системного уровня (либо в DrJava, либо в моей установке Java), либо
  2. у меня есть некоторые основные непонимание того, как построить рабочая программа на Java.

какие идеи?

5 265

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 позволяет нам определить класс внутри другого класса и Возможность вложить классы таким образом имеет определенные преимущества:

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

  2. можно сделать код более легким в обслуживании поскольку классы логически сгруппированы вместе вокруг того, где они необходимы.

  3. внутренний класс открыть к переменным экземпляра и методам его содержащего класса.

у нас есть в основном три типа Inner Classes

  1. Local inner
  2. Статический Внутренний Класс
  3. Анонимный Внутренний Класс

некоторые из важных моментов, чтобы помнить

  • нам нужен объект класса для доступа к локальному внутреннему классу, в котором он существует.
  • статический внутренний класс получает прямой доступ так же, как и любой другой статический метод того же класса, в котором он существует.
  • анонимный внутренний класс не виден внешнему миру, а также другим методам или классам того же класса(в котором он 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