2010-05-18 8 views
3

Pourquoi ne pas le retour programme suivant , puisque j'accède p d'un nouveau A(), qui n'a pas eu principal appelé là-dessus?accéder aux variables dans d'autres classes (Java)

public class A { 

     public static int p = 0; 

     public static void main(String[] args) { 

       p = Integer.parseInt(args[0]); 
       new B().go(); 

      } 

     } 


     class B { 
      public void go() { 
       System.out.println(new A().p); 
      } 
     } 
+0

Quelle est la sortie? Des erreurs? –

+0

Cela ne compilera pas, p est une variable membre, principale est une méthode statique – karoberts

+0

S'il vous plaît essayez d'envoyer des questions ici qui semblent valides. Je suppose que vous n'avez même pas essayé de vérifier si le programme compilait ou non. – Thunderhashy

Répondre

2

Cela ne devrait même pas compiler.

Probablement vous avez eu p comme étant statique et que vous l'avez modifié. La façon dont il est écrit maintenant ne compile pas.

$ javac A.java 
A.java:7: non-static variable p cannot be referenced from a static context 
      p = Integer.parseInt(args[0]); 
      ^
1 error 

modifier

Maintenant que vous avez corrigé votre code, la réponse est:

Ce programme n'imprime pas parce que ce que vous voyez est la valeur affecté à la ligne 7. Dans ce cas p est une variable de classe.

p = Integer.parseInt(args[0]); 

Ainsi, lorsque vous exécutez:

System.out.println(new A().p); 

Et vous vous attendez à voir 0 penser la « nouvelle A » aura sa propre copie de p mais n'est pas le cas.

+0

bon appel. Dans le code original, p est statique. Cela résout probablement le problème. – George

+0

Je supprimerais cette question, mais je ne peux pas. – George

+0

@George: Si vous l'exécutez avec '0' comme argument, il imprime' 0';) –

0

Cela ne devrait même pas compiler, puisque vous essayez d'assigner un membre d'instance à partir d'une méthode statique.

0

Ce programme ne compile pas. Le compilateur ne vous laissera pas accéder à 'p' depuis la méthode principale de la classe A. Vous ne pouvez pas accéder aux variables non statiques à partir d'un contexte statique. D'où le problème de compilation

+0

Même si vous définissez la variable 'p' comme étant statique, il y a toujours une exception d'exécution 'Exception dans le thread "principal" java.lang.ArrayIndexOutOfBoundsException: 0' – Thunderhashy

+0

Probablement parce que vous n'appelez pas le code avec un argument? –

0

Cela ne sera pas compilé tel quel, donc je ne sais pas comment cela retournerait quoi que ce soit.

La variable p n'est pas accessible à partir d'un contexte statique, c'est ce qu'elle DEVRAIT dire.

Si vous définissez une instance de p, cela devrait fonctionner correctement.

ps. Pour cette expérience, je vais vous laisser une variable membre non-finale publique, mais plus jamais!

0

EDIT: c'était juste une supposition basée sur la première révision de la question, qui suppose que p est non-statique. Il se trouve que l'intention était qu'elle soit statique, donc cela prend la mauvaise extrémité du bâton.

Malgré l'erreur du compilateur, je suppose que votre intention était d'initialiser p d'une méthode non-statique, ou sur une instance de A.

Le problème est alors que vous créez une nouvelle instance de A dans B et n'utilisant pas l'instance d'origine.

Pour obtenir ce que (je crois) que vous voulez, faire quelque chose comme

public class A { 

     public int p = 0; 

     public static void main(String[] args) { 
       A a = new A(); 
       a.p = Integer.parseInt(args[0]); 
       new B().go(a); 
     } 

    } 


     class B { 
      public void go(A a) { 
       System.out.println(a.p); 
      } 
     } 

Notez que la méthode go() en B prend A comme paramètre. Aucune nouvelle instance de A n'est créée.

Questions connexes