350 votes

Java - aucune instance englobante de type Foo n’est accessible

J'ai le code suivant:

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

Je connais Thing ne fait rien, mais mon Bonjour, Monde programme compile très bien sans elle. C'est seulement mon défini les classes qui échouent sur moi.

Et il refuse de compiler. Je reçois No enclosing instance of type Hello is accessible." à la ligne qui crée une Chose nouvelle. Je devine que ce soit:

  1. J'ai des problèmes au niveau du système (que ce soit dans DrJava ou mon Java installer) ou
  2. J'ai quelques base de l'incompréhension de la façon de construire un programme de travail en java.

Des idées?

542voto

jacobm Points 5703

static class Thing feront de votre programme de travail.

Comme il est, vous avez Thing intérieur de la classe, ce qui (par définition) est associée à une instance particulière d' Hello (même si elle n'utilise jamais ou se réfère à elle), ce qui signifie que c'est une erreur de dire new Thing(); sans avoir un particulier Hello exemple dans le champ d'application.

Si vous déclarez une classe statique au lieu de cela, alors que c'est une "niche" de la classe, qui n'a pas besoin d'un particulier Hello de l'instance.

104voto

helloworld922 Points 4195

Vous avez déclaré la classe Chose comme un non-statique à l'intérieur de la classe. Cela signifie qu'il doit être associé à une instance de la Bonjour la classe.

Dans votre code, vous essayez de créer une instance de Chose à partir d'un contexte statique. Qu'est ce que le compilateur se plaint.

Il y a quelques solutions possibles. La solution à utiliser dépend de la situation.

Changement de Chose pour être un statique de la classe imbriquée.

static class Thing

Créer une instance de Bonjour, puis créer une instance de la Chose.

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
}

Déplacer la Chose de la Bonjour la classe.

Pour plus d'informations sur imbriquée/classes internes: Classes Imbriquées (La Java Des Tutoriels)

27voto

Rupesh Yadav Points 2721

Bien... donc beaucoup de bonnes réponses, mais je veux ajouter plus sur elle. Un bref coup d'oeil sur l'Intérieur de la classe en Java - Java nous permet de définir une classe dans une autre classe et d' La possibilité de placer les classes de cette manière a certains avantages:

  1. Il peut cacher(Il augmente l'encapsulation) la classe des autres classes - particulièrement pertinent si la classe est uniquement utilisé par la classe à laquelle il est contenu à l'intérieur. Dans ce cas, il n'est pas nécessaire pour le monde extérieur pour le savoir.

  2. Il peut rendre le code plus facile à maintenir que les classes sont logiquement regroupés autour de l'endroit où ils sont nécessaires.

  3. L'intérieur de la classe a accès aux variables d'instance et les méthodes de sa classe conteneur.

Nous avons principalement trois types d' Inner Classes

  1. Local intérieure
  2. Statique À L'Intérieur De La Classe
  3. Anonyme Intérieur De La Classe

Certains des points importants à se rappeler

  • Nous avons besoin de la classe de l'objet pour accéder au Local Interne à la Classe dans laquelle il existe.
  • Statique à l'Intérieur de la Classe, directement accessible même que, comme toute autre méthode statique de la même classe dans laquelle il existe.
  • Anonyme Intérieur de la Classe ne sont pas visibles à côté du monde ainsi que pour les autres méthodes ou d'autres classes de la même classe(dans lequel il est existe) et il est utilisé sur le point où elle est déclarée.

Essayons de voir les concepts ci-dessus practically_

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

}

J'espère que ce sera aide à tout le monde. Veuillez vous référer pour de plus

12voto

David Harkness Points 16674

Thing est un intérieur de classe avec une connexion automatique à une instance d' Hello. Vous obtiendrez une erreur de compilation car il n'existe aucune instance de l' Hello pour attacher. Vous pouvez le fixer plus facilement en modifiant à un statique de la classe imbriquée qui n'a pas de connexion:

static class Thing

9voto

AZ_ Points 7127

Permet de le comprendre avec l’exemple simple suivant. Cela arrive parce qu’il s’agit de la classe interne NON statiques. Vous avez besoin de l’instance de classe externe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X