System.out.println () является методом для поля? - PullRequest
3 голосов
/ 09 января 2010

, если out - это поле класса System. Как получается, что вы можете использовать метод println () в поле? и откуда этот метод println (), я не могу найти его в классе System.

Ответы [ 9 ]

8 голосов
/ 09 января 2010

System.out является публичным экземпляром класса PrintStream:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/PrintStream.html

4 голосов
/ 09 января 2010

, поскольку System.out - это (ссылка на экземпляр) PrintStream,
мы можем написать System.out.println() как:

    PrintStream output = System.out;
    output.println();
4 голосов
/ 09 января 2010

in, out и err являются открытыми статическими полями java.lang.System. Ничто не мешает вам пометить поле как public, хотя обычно оно считается плохим (используйте вместо этого методы получения и установки).

System.out имеет тип PrintStream, который обеспечивает метод println.

См. В качестве отправной точки: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#out

1 голос
/ 03 декабря 2012

System - это, как вы знаете, класс, а out - статическая переменная класса System типа PrintStream т.е. внутри класса System, out объявлено как:

public static final PrintStream out;

Это также означает, что out является экземпляром класса PrintStream, поэтому он может обращаться к методам, определенным в классе PrintStream.

Итак, когда мы обращаемся к статической переменной out вне класса System, мы пишем

System.out  

и для доступа к таким методам, как print или println класса PrintStream, мы пишем

System.out.print()

как System.out (или out) - не что иное, как переменная, указывающая на объект класса PrintStream, как сказано выше.

Мы могли бы также написать

Printstream john;  
john = new Printstream();
john = system.out;  //now both variable point to same object
john.println();     //instead of system.out.println()
1 голос
/ 09 января 2010

Если поле является открытым и имеет значение Object, нет ничего удивительного в том, что он может вызывать метод для него. С чего бы это?

В частном случае класса System поле out является открытым статическим полем типа PrintStream (оно содержит экземпляр статического PrintStream, который имеет метод println()), и это то, что Javadoc говорит об этом:

«Стандартный» выходной поток. это поток уже открыт и готов к принять выходные данные. Как правило это поток соответствует выводу на дисплей или другой выходной пункт назначения определяется средой хоста или пользователь.

Для простой автономной Java приложения, типичный способ написать строка выходных данных:

     System.out.println(data)

См. println методы в классе PrintStream.

1 голос
/ 09 января 2010

System.out является членом System, хорошо, но также является ссылкой на экземпляр PrintStream. Из источника:

public final static PrintStream out = nullPrintStream();

PrintStream является классом в java.io и имеет метод println(). См. JavaDocs для java.io.PrintStream.println() для получения дополнительной информации.

1 голос
/ 09 января 2010

System.out имеет тип PrintStream, который имеет метод println().

Вы можете увидеть все методы PrintStream в http://java.sun.com/j2se/1.4.2/docs/api/java/io/PrintStream.html.

А вот поля и методы Системы: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html

В более общем смысле, полеявляется просто членом Object, поэтому он может быть любого типа.Если это открытое поле, то оно доступно клиентскому коду, хотя обычно рекомендуется сделать поля доступными через методы получения, а не напрямую (но в этом случае представьте, что вам приходилось писать System.getOut().println() каждый раз, когда вы хотелизаписать на стандартный вывод!).

0 голосов
/ 09 января 2010

В общем случае, когда у вас есть поле некоторого не примитивного типа данных, вы должны проверить класс поля, а не класс, которому принадлежит поле, чтобы проверить наличие доступных методов.

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

0 голосов
/ 09 января 2010

System.out - статический экземпляр объекта PrintStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...