web-dev-qa-db-fra.com

la classe non statique ne peut pas être référencée à partir d'un contexte statique

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 ()?

41
Bin

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.

59
Emil Sit

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(); 
    }
}  
11

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();
3
Andrey

Créez votre classe (Node) static

private static class Node {
2
Bhesh Gurung

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{

    }
2
Austin

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(); 
}
1
vandershraaf