Un objet statique non instancié peut-il également appeler des méthodes non statiques dans une classe ?
为情所困
为情所困 2017-05-17 10:07:52
0
5
664

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?

为情所困
为情所困

répondre à tous(5)
我想大声告诉你

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 {

    registerNatives();

}
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

 ;
Peter_Zhu

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal