Was ist die Art von System.in Java?
Ich bin nur ein Neuling in Java. Ich Frage mich, die Art und Weise System.out.println()
verwendet wird. Out ist ein statisches Feld im inneren System
Klasse. Die Art der out
ist PrintStream
. Aber als ich sah, dass der Konstruktor von PrintStream
Klasse, Sie nimmt einen parameter vom Typ OutputStream
und soweit ich weiß, wir können nicht erstellen Sie das Objekt einer abstrakten Klasse. In diesem Fall müssen wir an einigen Unterklasse-Objekt an den Konstruktor von PrintStream
. Was ist die Klasse? Gleiche ist der System.in
. Es ist auch InputStream
's Hinweis, aber was ist der Typ von Objekt es sich Punkte zu, wie die InputStream
ist Abstrakt?
- Sie können die Nutzung der java-reflection-check alle wichtigen Objekt-Informationen zur Laufzeit.
- Versuchen
System.out.println(System.out.getClass());
oder in deinem debugger. 😉 - dies wird drucken
class java.io.PrintStream
nichts anderes 🙂 Die Idee mit dem debugger ist effizienter 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
PrintStream
wrapsBufferedOutputStream
, die wrapsFileOutputStream
, das schreibt in die Konsole, die hat Ihre eigeneFileDescriptor
.FileDescriptor
. DieFile
- Klasse wird nicht verwendet.Einen einfachen Weg, um die Struktur einer Klasse zu untersuchen, ist es in einem debugger.
Wie Sie sehen können @Andremonify die Beschreibung ist im Grunde, was Sie haben.
Filedescriptors
FileInputStream
fürstdin
,FileOutputStream
fürstdout
. Wasstderr
Ja
out
istPrintStream
geben. Und der Konstruktor vonPrintStream
nimmtOutputStream
geben.OutputStream
ist die abstrakte Klasse. Aber keine Oberklasse refrence beziehen können-Unterklasse-Objekt ohne casting, so PrintStream-Konstruktor hatOutputStream
refrence, aber das refrence muss sich einOutputStream
's Unterklasse wieFileOutputStream
Gibt es ein paar mehr Dinge zu sagen, über die Umsetzung der
System.out
.Die tatsächliche Umsetzung Klasse
System.out
ist nicht angegeben. Die javadocs nicht sagen, was es ist. Wir beobachten (in verschiedener Weise), das Oracle-Java und OpenJDK-Java-Implementierung der "stack" in einer bestimmten Art und Weise (siehe andere Antworten), aber diese könnte in der Zukunft ändern.Den
System::setOut(PrintStream)
Methode kann verwendet werden, zu ändern, wasSystem.out
gebunden ist. Wenn das passiert, werden keine Annahmen über die Implementierung Klassen können falsch sein.Es stellt sich heraus, dass Sie dies tun können:
so
System.out
könnte werdennull
. Jedoch, mit aktuellen ImplementierungenSystem.out
nichtnull
sofern dunull
.Alle, die tatsächlich garantiert durch die Vorgabe ist, dass der Wert
System.out
haben einen Typ, der zuweisungskompatibel mitPrintStream
.null
nicht über eine Implementierung der Klasse. Das ist der Grund, warum "zuweisungskompatibel" technisch genauer als das, was Sie gesagt haben.)