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?
7 Réponses :
Ceci est parce que l'instruction system.out.println code> dans le constructeur est exécutée d'abord, puis seulement l'appelant system.out.println code> exécuté. N'oubliez pas que le system.out.pritnln code> dans constructeur exécuté complètement avant l'appelant system.out.println code>
La commande est p>
System.out.println () Code> Pour être appelé d'étendue "C" LI>
system.out.println () code> s'appelle donc impression "C" LI>
system.out.println code> imprime un nouveau nombre. LI>
ul>
Dans cette ligne: Les instances de Le L'ordre des opérations est: p> w code> sont instanciées avant l'évaluation du reste de la déclaration. P>
L'ordre réel des choses exécutées par la JVM est la suivante: p>
1st Ici le premier 2e Ici, le second L'argument de chaîne pour L'argument de la chaîne est envoyé à la sortie. P>
li>
ol>
Ainsi, la sortie résulte de w code> est instancié et son compte code> propriété lecture. P>
C code> est envoyé à la sortie. P>
li>
w code> est instancié et son compte code> Propriété Lecture. P>
C code> est envoyé à la sortie. P>
li>
system.out.println () code> est construit. (== "1 2" code>) p>
li>
C C 1 2 code>. p>
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 () code>) 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 code> sans le mot clé code> neuf code>, 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é.
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 P>
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.
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.
System.out.println(1 +""+2);
Les deux ws doivent être créés avant i> println s'appelle ...