Il existe un code très courant : System.out.println. Il s'agit d'une instruction de sortie très courante, mais après l'avoir étudiée pendant un moment, j'ai soudainement pensé à regarder le code source :
public final static PrintStream out = null;
out est défini sous la classe System et n'a pas été instancié. Out est juste une variable nulle. Il ne peut même pas être appelé un objet statique, mais il peut appeler la méthode println() sous la classe PrintStream. Déjà? Puis-je demander pourquoi?
Explication détaillée : version chinoise http://www.cnblogs.com/skywan...
La version anglaise est basée sur jdk7 https://luckytoilet.wordpress...
Cher, tout d'abord, lorsque vous démarrez votre classe de test, c'est-à-dire lorsque vous instanciez votre classe de test, toutes les classes statiques que vous appelez seront instanciées en premier, donc en fait, lorsque vous exécutez l'instruction System.out.println , les méthodes et propriétés de la classe System ont été initialisées !
statique {
}
;L'annotation de la méthode statique ci-dessus indique que la méthode initializeSystemClass sera appelée pour l'initialisation. Le setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding"))); cette méthode devrait être disponible pour l'affectation,
private static native void setOut0(PrintStream out) est une méthode locale
Quand j'ai vu la statique finale, ma première réaction devrait être qu'il s'agit d'une constante. Les constantes doivent être initialisées, puis je l'ai cherché à nouveau,
#. 🎜🎜 # Il appelle la méthode locale pour initialiser
;
Eh bien, le travail d'initialisation effectué dans la fonction initializeSystemClass() est appelé après l'initialisation du thread système. En d'autres termes, toutes les variables membres statiques (err out in) sont initialisées dans cette fonction
Par exemple, dites ceci :
. FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
La fonction setOut0() est dans la couche native, établissez une connexion entre le objet initialisé et ceci dans la couche native