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 ничего не делает, но моя программа Hello, World компилируется без штрафа. Это только мои определенные классы, которые терпят неудачу на мне.

И он отказывается компилировать. Я получаю No enclosing instance of type Hello is accessible." в строке, которая создает новую вещь. Я также предполагаю:

  • У меня проблемы с системным уровнем (либо в DrJava, либо в моей Java-установке), либо
  • У меня есть некоторые основные недоразумения о том, как создать рабочую программу в java.

Любые идеи?

Ответ 1

static class Thing сделает вашу программу работать.

Как бы то ни было, у вас есть Thing как внутренний класс, который (по определению) связан с конкретным экземпляром Hello (даже если он никогда не использует или не ссылается на него), что означает, что он чтобы сказать new Thing();, не имея конкретного экземпляра Hello в области видимости.

Если вместо этого вы объявите его как статический класс, тогда это "вложенный" класс, который не нуждается в конкретном экземпляре Hello.

Ответ 2

Вы объявили класс Thing нестационарным внутренним классом. Это означает, что он должен быть связан с экземпляром класса Hello.

В вашем коде вы пытаетесь создать экземпляр Thing из статического контекста. Это то, о чем компилятор жалуется.

Существует несколько возможных решений. Какое решение использовать зависит от того, чего вы хотите достичь.

  • Измените Thing как статический вложенный класс.

    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
    }
    
  • Переместить Thing из класса Hello.

Для получения дополнительной информации о вложенных/внутренних классах: Вложенные классы (Учебники Java)

Ответ 3

Ну... так много хороших ответов, но я хочу добавить к нему больше. Краткий взгляд на класс Inner в Java-Java позволяет нам определить класс внутри другого класса и Способность гнездовать классы таким образом имеет определенные преимущества:

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

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

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

В основном мы имеем три типа Inner Classes

  • Локальный внутренний
  • Статический внутренний класс
  • Анонимный внутренний класс

Некоторые важные моменты, которые нужно запомнить

  • Нам нужен объект класса для доступа к локальному внутреннему классу, в котором он существует.
  • Статический внутренний класс получает доступ напрямую, как и любой другой статический метод того же класса, в котором он существует.
  • Анонимный внутренний класс не отображается вне стороннего мира, а также другим методам или классам того же класса (в котором он существует), и он используется в точке, где он объявлен.

Попробуем увидеть приведенные выше понятия практически _

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 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!");
    }
 }

}

Надеюсь, это поможет всем. Пожалуйста, обратитесь к более

Ответ 4

Давайте рассмотрим следующий простой пример. Это происходит потому, что это НЕСТАТИЧЕСКИЙ ИНТЕРНЕТ-КЛАСС. Вам понадобится экземпляр внешнего класса.

 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");

        }
    }
}

Ответ 5

Thing является внутренним классом с автоматическим подключением к экземпляру Hello. Вы получаете ошибку компиляции, потому что для нее нет экземпляра Hello. Вы можете исправить это наиболее легко, изменив его на статический вложенный класс, который не имеет связи:

static class Thing

Ответ 6

помогите мне, если я хочу избавиться от этого без использования статического слова.