362 Stimmen

Was verursacht den Fehler "No enclosing instance of type Foo is accessible" und wie kann ich ihn beheben?

Ich habe den folgenden Code:

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

Ich weiß Thing bewirkt nichts, aber mein Hello, World-Programm lässt sich auch ohne diese Option kompilieren. Es ist nur meine definierten Klassen, die auf mich scheitern.

Und es weigert sich, zu kompilieren. Ich bekomme No enclosing instance of type Hello is accessible." in der Zeile, die ein neues Thing erstellt. Ich vermute, entweder:

  1. Ich habe Probleme auf Systemebene (entweder in DrJava oder meiner Java-Installation) oder
  2. Ich habe einige grundlegende Missverständnisse darüber, wie man ein funktionierendes Programm in Java konstruiert.

Irgendwelche Ideen?

555voto

jacobm Punkte 13370

static class Thing wird Ihr Programm zum Laufen bringen.

So wie es aussieht, haben Sie Thing als eine innere Klasse, die (per Definition) mit einer bestimmten Instanz von Hello (auch wenn er es nie benutzt oder darauf verweist), was bedeutet, dass es ein Fehler ist, zu sagen new Thing(); ohne eine bestimmte Hello Instanz im Geltungsbereich.

Wenn Sie sie stattdessen als statische Klasse deklarieren, handelt es sich um eine "verschachtelte" Klasse, die keine besondere Hello Instanz.

107voto

helloworld922 Punkte 10543

Sie haben die Klasse Thing als eine nicht-statische innere Klasse. Das heißt, sie muss mit einer Instanz der Klasse Hello Klasse.

In Ihrem Code versuchen Sie, eine Instanz von Thing aus einem statischen Kontext. Das ist es, worüber sich der Compiler beschwert.

Es gibt einige mögliche Lösungen. Welche Lösung Sie wählen, hängt davon ab, was Sie erreichen wollen.

  • Verschieben Thing aus dem Hello Klasse.

  • Ändern Sie Thing zu sein static verschachtelte Klasse.

    static class Thing
  • erstellen. eine Instanz de Hello bevor Sie eine Instanz von 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
    }

Die letzte Lösung (a nicht statisch verschachtelte Klasse) wäre obligatorisch, wenn eine Instanz von Thing hing von einer Instanz von Hello sinnvoll zu sein. Zum Beispiel, wenn wir hatten:

public class Hello {
    public int enormous;

    public Hello(int n) {
        enormous = n;
    }

    public class Thing {
        public int size;

        public Thing(int m) {
            if (m > enormous)
                size = enormous;
            else
                size = m;
        }
    }
    ...
}

jeder rohe Versuch, ein Objekt der Klasse Thing , wie in:

Thing t = new Thing(31);

wäre problematisch, denn es gäbe keine offensichtliche enormous Wert, um 31 gegen ihn zu testen. Eine Instanz h der Hello äußere Klasse ist notwendig, um dies zu ermöglichen h.enormous Wert:

...
Hello h = new Hello(30);
...
Thing t = h.new Thing(31);
...

Denn es bedeutet nicht, dass ein Thing wenn es keine Hello .

Für weitere Informationen über verschachtelte/interne Klassen: Verschachtelte Klassen (Die Java-Tutorials)

27voto

Rupesh Yadav Punkte 14956

Nun... so viele gute Antworten, aber ich möchte noch mehr dazu sagen. Ein kurzer Blick auf Innere Klasse in Java- Java erlaubt uns, eine Klasse innerhalb einer anderen Klasse zu definieren und Die Möglichkeit, Klassen auf diese Weise zu verschachteln, hat gewisse Vorteile:

  1. Sie kann ausblenden(Es erhöht die Kapselung) die Klasse von anderen Klassen abzugrenzen - besonders wichtig, wenn die Klasse nur von der Klasse verwendet wird, in der sie enthalten ist. In diesem Fall besteht keine Notwendigkeit, dass die Außenwelt davon erfährt.

  2. Es kann machen Code besser wartbar da die Klassen logisch dort gruppiert sind, wo sie gebraucht werden.

  3. Die innere Klasse hat Zugang auf die Instanzvariablen und Methoden der sie enthaltenden Klasse.

Wir haben hauptsächlich drei Arten von Inner Classes

  1. Lokale innere
  2. Statische innere Klasse
  3. Anonyme innere Klasse

Einige wichtige Punkte sind zu beachten

  • Wir brauchen ein Klassenobjekt, um auf die lokale innere Klasse zuzugreifen, in der es existiert.
  • Auf statische innere Klassen kann direkt zugegriffen werden, wie auf jede andere statische Methode derselben Klasse, in der sie vorhanden ist.
  • Anonyme innere Klassen sind für die Außenwelt sowie für die anderen Methoden oder Klassen derselben Klasse (in der sie existieren) nicht sichtbar und werden an dem Punkt verwendet, an dem sie deklariert wurden.

Versuchen wir, die oben genannten Konzepte praktisch zu sehen_

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

}

Ich hoffe, dass dies für alle hilfreich sein wird. Bitte für mehr

12voto

David Harkness Punkte 34750

Thing ist ein innere Klasse mit einer automatischen Verbindung zu einer Instanz von Hello . Sie erhalten einen Kompilierfehler, weil es keine Instanz von Hello an dem er befestigt werden kann. Sie können das Problem am einfachsten beheben, indem Sie es durch eine statische verschachtelte Klasse die keine Verbindung hat:

static class Thing

9voto

AZ_ Punkte 36741

Lassen Sie uns dies anhand des folgenden einfachen Beispiels nachvollziehen. Dies geschieht, weil es sich um eine NICHT-STATISCHE INNERE KLASSE handelt. Sie sollten die Instanz der äußeren Klasse benötigen.

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

        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X