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(Ssortingng[] args) { Thing thing1 = new Thing(); System.out.println("Hello, World!"); } } 

Je sais que Thing ne fait rien, mais mon programme Hello, World comstack très bien sans elle. Ce ne sont que mes classes définies qui échouent sur moi.

Et il refuse de comstackr. J’obtiens No enclosing instance of type Hello is accessible." À la ligne qui crée un nouveau Thing. Je suppose:

  1. J’ai des problèmes au niveau du système (dans DrJava ou dans mon installation Java) ou
  2. J’ai un peu de mal à comprendre comment construire un programme de travail en Java.

Des idées?

static class Thing fera fonctionner votre programme.

En tant que tel, vous avez Thing tant que classe interne, qui (par définition) est associée à une instance particulière de Hello (même si elle ne l’utilise jamais ou y fait référence), ce qui signifie que c’est une erreur de dire un new Thing(); sans avoir une instance particulière de Hello dans la scope.

Si vous le déclarez en tant que classe statique, alors c’est une classe “nestede”, qui ne nécessite pas d’instance Hello particulière.

Vous avez déclaré la classe Thing comme une classe interne non statique. Cela signifie qu’il doit être associé à une instance de la classe Hello.

Dans votre code, vous essayez de créer une instance de Thing à partir d’un contexte statique. C’est ce dont se plaint le compilateur.

Il existe quelques solutions possibles. Quelle solution utiliser dépend de ce que vous voulez réaliser.

  • Modifier Thing pour qu’il soit une classe nestede statique.

     static class Thing 
  • Créez une instance de Hello, puis créez une instance de Thing.

     public static void main(Ssortingng[] args) { Hello h = new Hello(); Thing thing1 = h.new Thing(); // hope this syntax is right, typing on the fly :P } 
  • Déplacer Thing de la classe Hello.

Pour plus d’informations sur les classes nestedes / internes: Classes nestedes (didacticiels Java)

Eh bien … tant de bonnes réponses mais je veux en append plus. Un bref aperçu de la classe Inner en Java-Java nous permet de définir une classe dans une autre classe et de pouvoir imbriquer des classes de cette manière présente certains avantages:

  1. Il peut masquer (augmente l’encapsulation) la classe des autres classes – particulièrement utile si la classe n’est utilisée que par la classe qui la contient. Dans ce cas, le monde extérieur n’a pas besoin de le savoir.

  2. Cela peut rendre le code plus facile à gérer, car les classes sont regroupées logiquement autour de leur besoin.

  3. La classe interne a access aux variables d’instance et aux méthodes de sa classe contenant.

Nous avons principalement trois types de Inner Classes

  1. Intérieur local
  2. Classe intérieure statique
  3. Classe interne anonyme

Quelques points importants à retenir

  • Nous avons besoin d’un object de classe pour accéder à la classe interne interne dans laquelle il existe.
  • Static Inner Class est directement accessible de la même manière que toute autre méthode statique de la même classe dans laquelle il existe.
  • Les classes internes anonymes ne sont pas visibles pour le monde extérieur ainsi que pour les autres méthodes ou classes de la même classe (dans lesquelles il existe) et sont utilisées à l’endroit où elles sont déclarées.

Essayons de voir les concepts ci-dessus pratiquement_

 public class MyInnerClass { public static void main(Ssortingng 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 cela aidera tout le monde. S’il vous plaît se référer pour plus

Permet de le comprendre avec l’exemple simple suivant. Cela se produit parce que c’est une CLASSE INTÉRIEURE NON STATIQUE. Vous devriez avoir besoin de l’instance de classe externe.

  public class PQ { public static void main(Ssortingng[] 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 est une classe interne avec une connexion automatique à une instance de Hello . Vous obtenez une erreur de compilation car il n’y a pas d’instance de Hello à laquelle elle doit être associée. Vous pouvez le résoudre le plus facilement en le transformant en une classe nestede statique qui n’a pas de connexion:

 static class Thing