Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2017, 14:34   #1
Lexoid2
 
Регистрация: 10.07.2017
Сообщений: 4
По умолчанию Класс System

Рад приветствовать всех завсегдатаев этого замечательно форума!

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

Это всё вроде бы понятно, но, как выяснилось, переменная ссылочного типа out, которая описана в классе System, является статичной, а также, кроме всего прочего, имеет спецификатор final, то бишь, требует обязательной инициализации на этапе декларирования. Вот тут и возникают вопросы! В описании класса System я попытался найти строчку, которая бы указывала на явную инициализацию переменной оut. Кстати, по логике вещей, нам нужно не только связать ссылочную переменную с каким-то конкретным объектом, но и проинициализировать все основные поля, которыми обладает сам объект.
Короче говоря, наткнулся на такую вот строчку:
Код:
public final static PrintStream out = nullPrintStream();
Изначально возникла мысль, что именно метод nullPrintStream() отвечает за инициализацию объекта оut, но, как дальше выяснилось, этот метод всего лишь возвращает состояние null, либо исключение NullPointerException. На одном ресурсе вычитал, что конкретно за инициализацию отвечает метод initializeSystemClass(), который описан в классе System. В свою очередь этот метод использует для непосредственной инициализации переменной out set-метод, который описан в этом же классе и называется setOut().

А теперь основной вопрос топика, ради которого он, собственно говоря, и создавался: как JVM понимает, что ей нужно вызвать эти методы для инициализации переменной out? Где мы обращаемся к методу initializeSystemClass()? Я привык думать, что инициализацию статических полей мы должны проводить явно, а не через вызов методов (хотя могу и ошибаться из-за недостатка знаний). А любой метод мы запрашиваем внутри главного метода main(), который указывает программе на место входа. Что же класс System? В моём понимании, это обычный класс, который содержит набор полей и операций над ними (методы). Ну и где же идёт обращение к какому бы то ни было методу внутри класса? Или же обращение происходит на каком-то другом этапе? Или же я чего-то недопонимаю? %) В любом случае, огромное всем спасибо за то, что уделили мне своё внимание!

Последний раз редактировалось Lexoid2; 10.07.2017 в 14:36.
Lexoid2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необработанное исключение типа "System.FormatException" произошло в System.Data.dll - Visual C++ БД zendau Общие вопросы .NET 3 30.06.2017 21:54
* Зачем наследовать класс System.Security.Cryptography.Symmet ricAlgorithm КсюхаПлюха C# (си шарп) 8 18.10.2014 10:31
класс system.text.stringbuilder Vlad1987 C# (си шарп) 4 29.09.2013 17:58
Ошибка Ambiguity between '_fastcall System::operator +(int,const System::Variant &)' and '_fastcall System::opera Jawner C++ Builder 1 12.04.2012 09:58
класс ввода\вывода System::IO::File Selebro Общие вопросы C/C++ 1 18.10.2008 22:48