Duplicata possible:
Pourquoi est-ce que j'obtiens "une variable non statique qui ne peut pas être référencée à partir d'un contexte statique"?
Voici les codes
public class Stack
{
private class Node{
...
}
...
public static void main(String[] args){
Node node = new Node(); // generates a compiling error
}
}
l'erreur dit:
classe non statique Le nœud ne peut pas être référencé à partir d'un contexte statique
Pourquoi ne devrais-je pas référencer la classe Node dans ma méthode main ()?
Une classe imbriquée non statique dans Java contient une référence implicite à une instance de la classe parente. Ainsi, pour instancier un Node
, vous devez également avoir une instance de Stack
. Dans un contexte statique (la méthode principale), il n'y a pas d'instance de Stack
à laquelle se référer. Ainsi le compilateur indique qu'il ne peut pas construire un Node
.
Si vous faites de Node
une classe statique (ou une classe externe régulière), alors elle n'aura pas besoin d'une référence à Stack
et peut être instanciée directement dans la méthode principale statique.
Voir Java Language Specification, Chapter 8 pour plus de détails, comme l'exemple 8.1.3-2.
Les classes imbriquées non statiques (classes internes) ont accès aux autres membres de la classe englobante, même si elles sont déclarées privées. Les classes imbriquées statiques n'ont pas accès aux autres membres de la classe englobante. En tant que membre de OuterClass, une classe imbriquée peut être déclarée privée, publique, protégée ou package privé.
Pour instancier une classe interne, vous devez d'abord instancier la classe externe. Ensuite, créez l'objet interne au sein de l'objet externe avec cette syntaxe: OuterClass.InnerClass innerObject = outerObject.new InnerClass();
public static void main(String[] args){
Stack stack = new Stack();
Stack.Node node = new Stack().new Node();
}
ou
public class Stack
{
private class Node{
...
}
...
...
...
public static void main(String[] args){
Node node = new Stack().new Node();
}
}
Java a deux types de classes membres imbriquées : statique et non statique (alias interne). La classe Node
est une classe imbriquée non statique. Pour créer une instance d'un Node
, vous devez avoir une instance d'un Stack
:
Stack s = new Stack();
Node n = s.new Node();
Créez votre classe (Node
) static
private static class Node {
Ou vous pouvez déclarer la classe Node outside of public class Stack
Ainsi,
public class Stack
{
public static void main(String[] args){
Node node = new Node();
}
}
class Node{
}
Si vous utilisez l'IDE Eclipse, vous verrez l'explication lorsque vous survolerez l'erreur. Il devrait dire quelque chose comme ceci:
Aucune instance englobante de type pile n'est accessible. Doit qualifier l'allocation avec une instance englobante de type Stack (par exemple x.new A() où x est une instance de Stack).
Voici le code de travail
public static void main(String[] args){
Stack stack = new Stack();
Node node = stack.new Node();
}