9
votes

Comportement étrange de la méthode println () en Java

class W {
    static int count=0;

    W() {
        count++;
        System.out.print("c ");
    }

    public static void main(String[] args) {
        System.out.println(new W().count+" "+new W().count);
    }
}
Expected output
  c 1 c 2
Actual output
  c c 1 2
Why?

1 commentaires

Les deux ws doivent être créés avant println s'appelle ...


7 Réponses :


0
votes

Ceci est parce que l'instruction system.out.println dans le constructeur est exécutée d'abord, puis seulement l'appelant system.out.println exécuté. N'oubliez pas que le system.out.pritnln dans constructeur exécuté complètement avant l'appelant system.out.println La commande est

  • NOUVEAU W () Causes System.out.println () Pour être appelé d'étendue "C"
  • à nouveau neuf w () causes system.out.println () s'appelle donc impression "C"
  • Après cela est terminé, externe system.out.println imprime un nouveau nombre.

0 commentaires

7
votes

Dans cette ligne: xxx

Les instances de w sont instanciées avant l'évaluation du reste de la déclaration.

Le L'ordre des opérations est:

  1. instanciez d'abord le nouveau W (), provoquant l'imprimé C
  2. évaluer le premier nouveau w (). Compte
  3. instanciez le second nouveau w (), provoquant une impression C
  4. évaluer le second nouveau w (). Compte
  5. concaténer le résultat et l'impression.

0 commentaires

7
votes

L'ordre réel des choses exécutées par la JVM est la suivante:

  1. 1st w est instancié et son compte propriété lecture.

    Ici le premier C est envoyé à la sortie.

  2. 2e w est instancié et son compte Propriété Lecture.

    Ici, le second C est envoyé à la sortie.

  3. L'argument de chaîne pour system.out.println () est construit. (== "1 2" )

  4. L'argument de la chaîne est envoyé à la sortie.

    Ainsi, la sortie résulte de C C 1 2 .


6 commentaires

La chaîne est donc évaluée comme "1 2", tandis que le constructeur appelle la méthode d'impression, donc "C C" est imprimé ..... thnx beaucoup !!!! :)


Tout dépendance du nouvel opérateur sur l'opérateur de concaténate. N'est-ce pas @ sirko


@krishnachandra oui. Vous ne pouvez pas lire la propriété d'un objet avant de créer. De même, vous avez besoin de tous les composants du paramètre, avant la méthode correspondante ( println () ) peut être appelé.


@sirko: Mais ici comptage est une variable statique, je pense ici que le comte ne devrait pas être dans la miséricorde de l'objet parce que c'est une variable statique ... ce n'est pas ça. il n'est pas question d'accéder à la variable statique avec la référence d'objet.Comment voudriez-vous justifier votre réponse?


@krishnachandra C'est une variable statique, mais est utilisée de manière non statique. Si OP avait utilisé w.count sans le mot clé neuf , le constructeur n'aurait pas été appelé et la sortie diffère. La question est, par exemple, discutée ici: Stackoverflow.com/q/4510739/1169798


@sirko: obtenu: justifié.



0
votes

La méthode PrintLN dans les principaux a besoin de savoir quels sont les paramètres de ses systèmes, de sorte que la JVM construit d'abord les objets, puis envoyez-les à la méthode PrintLN


0 commentaires

0
votes
class W {
static int count=0;

W() {
    count++;
    System.out.print("c ");
}

public static void main(String[] args) {
    System.out.println(new W().count+" "+new W().count);
}
Because new W() will call the constructor W() then it will print "C" out, after that the count become 1 then you call new W() again, so another "C" is here. Finally, you call system.out.println(1 + " " + 2). then the 1 2 is in the output buffer.

0 commentaires

0
votes
class W {
    static int count=0;

    W() {
        count++;
        System.out.print("c ");
    }

    public static void main(String[] args) {
        //modify System.out.println(new W().count+" "+new W().count);
        System.out.print(new W().count + " ");
        System.out.print(new W().count);
    }
}

OUTPUT

c 1 c 2
The actual order of things executed by the JVM is as follows:1st W object is instantiated and its count property read.Here the first c is send to output.2nd W object is instantiated and its count property read.Here the second c is send to output.The string argument for System.out.println() is built. ("1 2")The string argument is sent to the output.Thus the output results to c c 1 2.

0 commentaires

0
votes
 System.out.println(1 +""+2);

0 commentaires