Почему в Java команда для печати чего-то в консоль выглядит так сложно? Ведь в других языках она выглядит гораздо проще и естественнее. Класс System – он какие объекты содержит? out – это метод? Или что-то другое?
Давайте с этим разберемся!
1. Что такое System?
System — это класс в пакете java.lang. Это утилитарный класс, который предоставляет доступ к системным ресурсам и возможностям. Он содержит:
• Полезные статические методы, например:
• System.currentTimeMillis() — возвращает текущее время в миллисекундах.
• System.gc() — запускает сборщик мусора.
• Статические поля, например:
• System.out — стандартный поток вывода.
• System.err — стандартный поток ошибок.
• System.in — стандартный поток ввода.
2. Что такое out?
out — это статическое поле класса System, которое содержит объект типа PrintStream. Этот объект отвечает за вывод текстовой информации в консоль. По умолчанию он связан с консолью, но может быть перенаправлен на другой поток вывода.
Если упрощенно, то System.out — это поток, в который программа пишет вывод.
3. А println() — это метод?
Да, println() — это метод класса PrintStream. Он отвечает за вывод строки с переводом строки в конце. В PrintStream есть несколько вариантов этого метода, которые позволяют выводить:
• Текстовые строки (String),
• Числа (int, double и т.д.),
• Логические значения (boolean),
• Другие объекты (вызывается метод toString() объекта).
Когда мы пишем:
System.out.println(“Привет, мир!”);
это означает:
1. Обратиться к классу System.
2. Взять его статическое поле out (а в этом поле содержится объект типа PrintStream).
3. Вызвать метод println() для этого объекта, чтобы вывести строку в консоль.
4. Почему это выглядит сложно?
Это не сложно, а гибко:
• Мы используем статический класс и поле (System.out), что делает их доступными в любом месте программы без необходимости создавать объект.
• System.out — это поток вывода, который вы можете перенаправить (например, в файл), не меняя сам код программы.
• Методы println(), print() и другие позволяют работать с разными типами данных.
Пример с переопределением System.out для вывода в файл, а не в консоль:
import java.io.PrintStream;
import java.io.FileOutputStream;
public class RedirectOutput {
public static void main(String[] args) throws Exception {
// Перенаправляем System.out в файл
PrintStream fileOut = new PrintStream(new FileOutputStream("output.txt"));
System.setOut(fileOut);
System.out.println("Эта строка попадет в файл, а не в консоль!");
fileOut.close();
}
}
Выводы:
• System — класс, предоставляющий доступ к системным ресурсам.
• out — статическое поле класса System, которое является объектом типа PrintStream.
• println() — метод этого объекта, который отвечает за вывод данных.
И да, этот код чуть длиннее, но зато намного гибче.