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 sais que Thing
cela ne fait rien, mais mon programme Hello, World se compile très bien sans cela. Ce ne sont que mes classes définies qui échouent sur moi.
Et il refuse de compiler. J'arrive No enclosing instance of type Hello is accessible."
à la ligne qui crée une nouvelle chose. Je suppose que non plus:
- J'ai des problèmes au niveau du système (soit dans DrJava ou mon installation Java) ou
- J'ai une mauvaise compréhension de base de la façon de construire un programme de travail en Java.
Des idées?
java
inner-classes
coolpapa
la source
la source
Réponses:
static class Thing
fera fonctionner votre programme.En l'état, vous avez
Thing
une classe interne, qui (par définition) est associée à une instance particulière deHello
(même si elle ne l'utilise jamais ou n'y fait jamais référence), ce qui signifie que c'est une erreur à direnew Thing();
sans avoir uneHello
instance particulière dans portée.Si vous la déclarez plutôt comme une classe statique, alors c'est une classe "imbriquée", qui n'a pas besoin d'une
Hello
instance particulière .la source
outer class
, lenon-static inner class
serait également créé même si je ne l'utilise nulle part?Vous avez déclaré la classe
Thing
comme classe interne non statique. Cela signifie qu'il doit être associé à une instance de laHello
classe.Dans votre code, vous essayez de créer une instance de à
Thing
partir d'un contexte statique. C'est de cela que se plaint le compilateur.Il existe quelques solutions possibles. La solution à utiliser dépend de ce que vous souhaitez réaliser.
Déplacer
Thing
de laHello
classe.Changez
Thing
pour être unestatic
classe imbriquée.Créez une instance de
Hello
avant de créer une instance deThing
.La dernière solution (une classe imbriquée non statique ) serait obligatoire si une instance de
Thing
dépendait d'une instance deHello
pour être significative. Par exemple, si nous avions:toute tentative brute de créer un objet de classe
Thing
, comme dans:serait problématique, car il n'y aurait pas de
enormous
valeur évidente à comparer avec 31. Une instanceh
de laHello
classe externe est nécessaire pour fournir cetteh.enormous
valeur:Parce que cela ne signifie pas un
Thing
s'il n'a pasHello
.Pour plus d'informations sur les classes imbriquées / internes: classes imbriquées (didacticiels Java)
la source
Thing thing1 <<HelloInstantiation>>.new Thing()
est la clé. J'ai passé quelques minutes confus en utilisant la syntaxeThing thing1 new <<HelloInstantiation>>.Thing()
. = PEh bien ... tant de bonnes réponses, mais je veux en ajouter plus. Un bref aperçu de la classe interne en Java - Java nous permet de définir une classe dans une autre classe et pouvoir imbriquer des classes de cette manière présente certains avantages:
Il peut cacher (il augmente l'encapsulation) la classe des autres classes - particulièrement pertinent si la classe n'est utilisée que par la classe dans laquelle elle est contenue. Dans ce cas, le monde extérieur n'a pas besoin de le savoir.
Cela peut rendre le code plus facile à maintenir car les classes sont logiquement regroupées autour de l'endroit où elles sont nécessaires.
La classe interne a accès aux variables d'instance et aux méthodes de sa classe conteneur .
Nous avons principalement trois types de
Inner Classes
Quelques points importants à retenir
Essayons de voir les concepts ci-dessus pratiquement_
J'espère que cela aidera tout le monde. Veuillez vous référer pour plus
la source
Thing
est une classe interne avec une connexion automatique à une instance deHello
. Vous obtenez une erreur de compilation car il n'y a pas d'instanceHello
à laquelle attacher. Vous pouvez le corriger plus facilement en le changeant en une classe imbriquée statique qui n'a pas de connexion:la source
Permet de le comprendre avec l'exemple simple suivant. Cela se produit car il s'agit d'une CLASSE INTERNE NON STATIQUE. Vous devez avoir besoin de l'instance de classe externe.
la source