Out в System.out.println() - программирование
Подтвердить что ты не робот

Out в System.out.println()

Во-первых, жалею, что это очень простой вопрос, и я рекламирую, что я все еще обезьяна кода. Меня попросили в интервью выяснить 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 возвращает null

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

System.out.println() -

Имея это в виду, давайте сломаем это, начиная с оператора точки. В Java оператор точки может использоваться только для вызова методов и переменных, поэтому мы знаем, что 'out должен быть либо методом, либо переменной. Теперь, как мы классифицируем 'out? Ну, 'out не может быть методом из-за того, что нет скобок -'() - after 'out, что означает, что вне явно не метод, который вызывается. И "out не принимает никаких аргументов, потому что только методы принимают аргументы, вы никогда не увидите что-то вроде" System.out(2,3).println ". Это означает, что" выход должен быть переменной.

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

Заметив тот факт, что 'println() явно является методом, мы можем дополнительно классифицировать' out в System.out.println(). Мы уже рассуждали, что "out" - статическая переменная, принадлежащая классу System. Но теперь мы можем видеть, что 'out должен быть экземпляром класса, потому что он вызывает метод' println().

Мыслительный процесс, который следует использовать для получения ответа, преднамеренно проиллюстрирован выше. Не зная точного ответа заранее, вы можете приблизиться к нему, применив некоторые базовые знания Java. Большинство интервьюеров не ожидали, что вы узнаете, как System.out.println() работает с верхней части головы, но скорее увидит, что вы используете свои базовые знания Java, чтобы получить ответ, близкий к точному.

Более точный ответ на исходный вопрос таков: внутри класса System есть объявление "out, которое выглядит так:" public static final PrintStream out, а внутри класса Prinstream - это объявление "println(), которое имеет подпись метода, которая выглядит так: 'public void println().

Вот как выглядят разные части 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();
//...
}

Ответ 5

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

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

Ответ 7

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

Ответ 8

Когда инициализируется системный класс, он вызывает свой метод 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() нельзя установить что-то еще, но с использованием собственного кода можно изменить конечную переменную.

Ответ 9

out - объект класса PrintStream, определенный в классе System. out объявляется открытым, статическим и окончательным.

  • println() - метод класса PrintStream.
  • Вызывается метод println() с внешним объектом.
  • Объект out вызывается с классом System.

Ответ 10

System.out.println();

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