Maison Java javaDidacticiel Analyse du principe HelloWorld en Java

Analyse du principe HelloWorld en Java

May 21, 2017 am 10:28 AM

Le premier programme que nous utilisons pour apprendre Java est "hello world". Ce qui suit est une analyse des principes de Java HelloWorld à travers un exemple de code. Les amis intéressés peuvent apprendre ensemble

Le premier programme pour nous permettre d'apprendre Java est "hello world"

 public class HelloWorld {
   public static void main(String[] args) {
     System.out.println("hello world");
   }
}
Copier après la connexion

À quoi ressemble le programme ci-dessus ? Comment afficher « hello world » à l'écran ? C'est ce qui devait initialement être expliqué, c'est-à-dire le principe de System.out.println("hello world").

Jetons d'abord un coup d'œil au processus de System.out.println. Examinons d'abord la définition de out dans System.java. Le code source est le suivant :

public final class System {
   ... 
   public final static PrintStream out = null; 
   ...
 }
Copier après la connexion

À partir de là, nous constatons que

(01) out est < de System.java. 🎜>statique Variable.

(02) Et out est un objet PrintStream

Il existe de nombreuses méthodes surchargées println() dans PrintStream.java.

OK, nous savons que out est un objet PrintStream. Ensuite, voyez comment il est initialisé et comment il est lié à la sortie à l'écran ?

Analysons-le étape par étape. Tout d'abord, examinons la méthode initializeSystemClass() de System.java.

1. Le code source de initializeSystemClass() est le suivant : Marquez la partie out en rouge

 private static void initializeSystemClass() {
   props = new Properties();
   initProperties(props); // initialized by the VM
   sun.misc.VM.saveAndRemoveProperties(props);
   lineSeparator = props.getProperty("line.separator");
   sun.misc.Version.init();
   FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
   FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
   FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
   setIn(new BufferedInputStream(fdIn));
   setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
   setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
   loadLibrary("zip");
   Terminator.setup();
   sun.misc.VM.initializeOSEnvironment();
   Thread current = Thread.currentThread();
   current.getThreadGroup().add(current);
   setJavaLangAccess();
   sun.misc.VM.booted();
 }
Copier après la connexion
Il suffit de prêter attention à la partie du code rouge ci-dessus : c'est-à-dire,

FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
Copier après la connexion
Ces deux phrases peuvent être décomposées selon les étapes suivantes :

Étape 1 FileDescriptor fd = FileDescriptor.out;

Étape 2 FileOutputStream fdOut = new FileOutputStream( fd);

Étape 3 BufferedOutputStream bufOut = new BufferedOutputStream(fdOut, 128);

Étape 4 PrintStream ps = new PrintStream(bufout, true);

Étape 5 setOut0 ( ps);

Explication :

(01) Étape 1, extraire le membre statique dans FileDescriptor.java est un objet FileDescriptor, qui est en fait une "sortie standard (écran)". identifiant.


Le code lié à FileDescriptor.out dans FileDescriptor.java est le suivant :

 public final class FileDescriptor {
    private int fd;
   public static final FileDescriptor out = new FileDescriptor(1);
   private FileDescriptor(int fd) {
     this.fd = fd;
     useCount = new AtomicInteger();
   }
   ...
 }
Copier après la connexion
(02) Créer un "File Output Stream" correspondant à "Standard Output (Screen )".

(03) Créer un "flux de sortie tamponné" correspondant au "flux de sortie du fichier". Le but est d'ajouter une fonctionnalité de « mise en mémoire tampon » au « File Output Stream ».

(04) Créer un "flux de sortie d'impression" correspondant au "flux de sortie tamponné". Le but est de fournir une

interface d'impression pratique pour le "flux de sortie tamponné", telle que print(), println(), printf(); et rapidement.

(05) Exécutez setOut0(ps);

Ensuite, analysez setOut0(ps) à l'étape 5. Vérifiez la déclaration de setOut0() dans System.java, comme suit :

private static native void setOut0(PrintStream out);
Copier après la connexion
À partir de là, nous constatons que setOut0() est une méthode native. Grâce à openjdk, nous pouvons trouver son code source correspondant, comme suit :

 JNIEXPORT void JNICALL
 Java_java_lang_System_setOut(JNIEnv *env, jclass cla, jobject stream)
 {
   jfieldID fid =
     (*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;");
   if (fid == 0)
     return;
   (*env)->SetStaticObjectField(env,cla,fid,stream);
 }
Copier après la connexion
Explication :

Il s'agit d'une fonction JNI

, faisons-en une simple analyse .

(01) Nom de la fonction

JNIEXPORT void JNICALL Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream)
Copier après la connexion
Il s'agit de la méthode d'enregistrement statique de JNI Java_java_lang_System_setOut0(JNIEnv *env, jclass cla, jobject stream) sera la même que setOut0(PrintStream). dans System.java out); de plus, le paramètre stream correspond au paramètre out. Pour faire simple, lorsque nous appelons setOut0(), nous appelons en fait Java_java_lang_System_setOut0().

(02) jfieldID fid = (*env)->GetStaticFieldID(env,cla,"out","Ljava/io/PrintStream;");

Que fait cette phrase consiste à obtenir le jfieldID du membre statique à partir de System.java. "Ljava/io/PrintStream;" signifie que out est un objet java.io.PrintStream.

Le but de récupérer le jfieldID de out est que nous devons changer la valeur de out en exécutant "out's jfieldID".

(03) (*env)->SetStaticObjectField(env,cla,fid,stream);

La fonction de cette phrase est de définir le fid correspondant (fid est le jfieldID de out) La valeur du membre statique est stream.

stream est le paramètre que nous passons à Java_java_lang_System_setOut0(), qui est le paramètre passé à setOut0.

Résumé de ce qui précède. Nous savons que la fonction de setOut0(PrintStream ps) est de définir ps sur la variable statique out de System.java.


Comme mentionné précédemment, FileDescriptor.out est l'identifiant de fichier de la "sortie standard (écran)" de la machine. Nous pouvons généralement comprendre l'identifiant de fichier comme une « sortie standard » représentée par FileDescriptor.out.

Par conséquent, dans initializeSystemClass(), les 5 étapes ci-dessus consistent à encapsuler "FileDescriptor.out". Le System.in encapsulé possède à la fois une fonction de mise en mémoire tampon et des interfaces de fonctionnement pratiques, telles que print(), println() et printf().


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

See all articles