en System.out.println ()

En primer lugar, lamento si esta es una pregunta muy básica y promuevo que sigo siendo un código mono. Me pidieron en una entrevista para elucidar System.out.println (); Expliqué de la siguiente manera

//this class belongs to java.lang package class System{ public static PrintStream out; } //this class belongs to java.io package class PrintStream{ public void println.. } 

He explicado que System.out es válido ya que esta es la forma en que accedemos a las variables estáticas en java, y out es un objeto de PrintStream y, por lo tanto, podemos acceder a sus métodos, en sum,

 System.out.pritnln(); 

me pidió que simulara un tipo similar de progtwig, rastreé y no funcionó, ya que System.out está volviendo nulo

mi pregunta es: ¿dónde está el objeto instanciado en java? ¿Es un objeto predefinido si no estoy equivocado? cuál debería ser la explicación meticulosa para esto.

Técnicamente, ¿qué deberíamos llamar? ¿Aparece una variable del tipo PrintStream o debería decirse como un objeto de tipo PrintStream?

System.out se inicializa a null cuando se crea una instancia de la clase. Esto se establece mediante el método nullPrintStream() en System.java , que simplemente devuelve null .

Cuando la JVM se ha inicializado, llama al método initializeSystemClass() . Este método llama al método native setOut0() que establece la variable de out en el valor apropiado.

Esto puede parecer extraño, pero es una operación necesaria por las siguientes razones:

  • out no puede establecerse estáticamente en el valor porque System necesita ser una de las primeras clases cargadas (antes de PrintStream ).
  • out debe ser final para que su valor no pueda ser directamente anulado por un usuario.
  • Dado que out no puede establecerse estáticamente y es final, debemos anular la semántica del lenguaje utilizando un método native , setOut0() .

Espero que eso ayude a tu comprensión.

System.out es un atributo estático normal, fue establecido por la JVM a través del método initializeSystemClass() durante la inicialización de JVM. Incluso puede cambiarlo (aunque no se recomienda) simplemente llamando a System.setOut(printOutStream); , donde printOutStream es la transmisión que desea usar como salida estándar.

Aquí hay un buen artículo que detalla cómo funciona System.out.println ().

System.out.println () –

Con eso en mente, analicemos esto, comenzando con el operador de punto. En Java, el operador de punto solo se puede usar para llamar a métodos y variables, por lo que sabemos que ‘out’ debe ser un método o una variable. Ahora, ¿cómo categorizamos ‘fuera’? Bueno, ‘salir’ no podría ser un método debido al hecho de que no hay paréntesis: el ‘()’ – después de ‘salir’, lo que significa que claramente no se está recurriendo a un método. Y ‘fuera’ no acepta ningún argumento porque solo los métodos aceptan argumentos: nunca verá algo como “System.out (2,3) .println”. Esto significa que ‘fuera’ debe ser una variable.

‘out’ se llama con el nombre de clase ‘System’ en sí, y no es una instancia de una clase (un objeto), entonces sabemos que ‘out’ debe ser una variable estática, ya que solo se pueden invocar variables estáticas solo con el nombre de la clase en sí. Entonces ahora sabemos que ‘out’ es una variable miembro estática que pertenece a la clase System.

Al notar el hecho de que ‘println ()’ es claramente un método, podemos clasificar aún más la ‘salida’ en System.out.println (). Ya hemos razonado que ‘fuera’ es una variable estática que pertenece al sistema de clase. Pero ahora podemos ver que ‘out’ debe ser una instancia de una clase, porque está invocando el método ‘println ()’.

El proceso de pensamiento que uno debería usar para llegar a una respuesta se ilustra intencionalmente arriba. Sin saber la respuesta exacta de antemano, puede llegar a una aproximada aplicando algunos conocimientos básicos de Java. La mayoría de los entrevistadores no esperarían que supiera cómo funciona System.out.println (), sino que preferiría que utilice su conocimiento básico de Java para llegar a una respuesta cercana a la exacta.

La respuesta más exacta a la pregunta original es esta: dentro de la clase System está la statement de ‘out’ que se ve así: ‘printStream out final público estático’, y dentro de la clase de Prinstream hay una statement de ‘println ()’ que tiene una firma de método que se ve así: ‘public void println ()’.

Aquí se muestra cómo son las diferentes piezas de System.out.println ():

 //the System class belongs to java.lang package class System { public static final PrintStream out; //... } //the Prinstream class belongs to java.io package class PrintStream{ public void println(); //... } 

System.out es proporcionado por la JVM. Cuando se llama a su método principal, System.out está abierto y listo para usar.

Ver http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#out

En las bibliotecas de tiempo de ejecución de Oracle Java, se crea una instancia de forma nativa utilizando el método nativo registerNatives() que se llama (a través de un inicializador static ) al cargar la clase System . Sin embargo, este es un detalle de implementación.

También puede establecer System.out directamente usando System.setOut() .

Out in System.out.pritln es un campo estático (objeto) de PrintWriter en la clase System e println es un método de PrintWriter.

Referencia: Sistema: http://docs.oracle.com/javase/6/docs/api/java/lang/System.html PrintWriter: http://docs.oracle.com/javase/6/docs/api/java /io/PrintWriter.html

No hay necesidad de ir por la red y la documentación, incluso. Simplemente podemos decir javap java.lang.System esto le da una lista de todos los campos estáticos, prototipos de métodos que pertenecen a la clase del sistema. Podemos obtener detalles de cualquier clase java utilizando javap, siempre que sepa que su paquete y classname out es un objeto público estático de PrintStream definido en la clase System.

Cuando la clase del sistema se inicializa, llama a su método initializeSystemClass() , aquí está el código:

 FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); 

En este código setOut0() es una función nativa implementada en System.c:

 JNIEXPORT void JNICALL Java_java_lang_System_setOut0(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); } 

Este es un código JNI estándar que establece System.out para el argumento que se le pasa, este método llama al método nativo setOut0 () que establece la variable de salida en el valor apropiado.

System.out es final, significa que no se puede establecer en otra cosa en initializeSystemClass () pero al usar código nativo es posible modificar una variable final.

out es una clase PrintStream de objeto definida en la clase System. out se declara como público, estático y final.

  • println () es un método de la clase PrintStream.
  • El método println () se llama sin objeto.
  • El objeto out se llama con clase de sistema.

System.out.println ();

aquí println es un objeto de la clase printstream. No podemos crear objetos directamente para la clase printstream. Out es un objeto de clase del sistema. out se llama campo en clase de sistema. al llamar a system.out, crea indirectamente un objeto para la clase printstream. por lo tanto, podemos llamar al método println () usando System.out.prontln ().