в System.out.println () - PullRequest
       5

в System.out.println ()

18 голосов
/ 26 февраля 2012

Во-первых, сожалею, если это очень простой вопрос, и я утверждаю, что я все еще обезьяна кода.Меня спросили в интервью, чтобы выяснить System.out.println ();Я объяснил следующий способ

//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..
}

Я объяснил, что System.out действителен, так как это способ доступа к статическим переменным в Java, а out - это объект PrintStream, и, следовательно, мы можем получить доступ к его методам., В сумме как

System.out.pritnln(); 

он попросил меня смоделировать подобную программу, я проследил, и она не работала, так как System.out возвращает ноль

мой вопрос, где этообъект, созданный в Java?Это предопределенный объект, если я не ошибаюсь.каково должно быть дотошное объяснение этому.

Технически, что мы должны назвать?Является ли переменная типа PrintStream типа или нужно сказать это как объект типа PrintStream?

Ответы [ 8 ]

21 голосов
/ 26 февраля 2012

System.out инициализируется до null, когда создается экземпляр класса.Это устанавливается методом nullPrintStream() в System.java, который просто возвращает null.

Когда JVM инициализируется, он вызывает метод initializeSystemClass().Этот метод вызывает метод native setOut0(), который устанавливает переменную out в соответствующее значение.

Это может показаться странным, но это необходимая операция по следующим причинам:

  • out нельзя установить статически на значение, поскольку System должен быть одним из первых загруженных классов (до PrintStream).
  • out должно быть final, чтобы пользователь не мог напрямую изменить его значение.
  • Поскольку out не может быть установлен статически и является окончательным, мы должны переопределить семантикуязыка native, setOut0().

Надеюсь, это поможет вам понять.

6 голосов
/ 26 февраля 2012

System.out - это обычный статический атрибут, он был установлен JVM с помощью метода initializeSystemClass() во время инициализации JVM. Вы даже можете изменить (хотя это и не рекомендуется), просто вызвав System.setOut(printOutStream);, где printOutStream - поток, который вы хотите использовать в качестве стандартного вывода.

Вот хорошая статья , подробно описывающая, как работает System.out.println ().

0 голосов
/ 27 августа 2017

Когда класс System инициализируется, он вызывает свой метод initializeSystemClass(), вот код:

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

В этом коде setOut0() - встроенная функция, реализованная в 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);
}

Это стандартный код JNI, который устанавливает System.out в качестве передаваемого ему аргумента, этот метод вызывает собственный метод setOut0 (), который устанавливает переменную out в соответствующее значение.

System.out является окончательным, это означает, что он не может быть установлен на что-то другое в initializeSystemClass (), но с помощью собственного кода можно изменить конечную переменную.

0 голосов
/ 10 января 2015

Нет необходимости обращаться к сети и даже к документации.Мы можем просто сказать javap java.lang.System, это дает вам список всех статических полей, прототипов методов, которые принадлежат классу System.Мы можем получить детали любого java-класса, используя javap, при условии, что вы знаете, что его пакет и имя класса являются публичными статическими объектами PrintStream, определенными в классе System.

0 голосов
/ 06 июля 2013

Out в System.out.pritln - это статическое поле (объект) PrintWriter в классе System, а println - это метод PrintWriter.

Ссылка: Система: 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

0 голосов
/ 26 февраля 2012

В библиотеках времени выполнения Oracle Oracle он создается с использованием нативного метода registerNatives(), который вызывается (через инициализатор static) при загрузке класса System.Однако это деталь реализации.

Вы также можете установить System.out напрямую, используя System.setOut().

0 голосов
/ 26 февраля 2012

System.out.println ();

здесь println - это объект класса printstream. Мы не можем напрямую создать объект для класса printstream. Out является объектом системного класса. out называется полем в системном классе. при вызове system.out он косвенно создает объект для класса printstream. следовательно, мы можем вызвать метод println (), используя System.out.prontln ().

0 голосов
/ 26 февраля 2012

System.out предоставляется JVM.К тому времени, когда ваш основной метод вызывается, System.out уже открыт и готов к использованию.

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

...