Основы: подробно объясните процесс создания объекта JAVA.

Java
Основы: подробно объясните процесс создания объекта JAVA.

1 Процесс создания экземпляра объекта

  • Процесс создания экземпляра объекта делится на две части: загрузка и инициализация класса и инициализация объекта.
  • Чтобы создать экземпляр объекта класса, вам нужно сначала загрузить и инициализировать класс, а класс, в котором находится основной метод, должен быть загружен и инициализирован первым.
  • Инициализация класса заключается в выполнении метода , а создание экземпляра объекта — в выполнении метода .
  • Чтобы инициализировать подкласс, вам нужно сначала инициализировать родительский класс.

Процесс загрузки 2 класса

  • Механизм загрузки класса: если класса соответствующего класса нет, загрузите класс в область методов. Соответствует фазе загрузки->проверки->подготовки->разбора-->инициализации
    • Загрузка: загрузка объекта класса, не обязательно из файла класса, это может быть пакет jar или динамически сгенерированный класс.
    • Проверка: убедитесь, что поток байтов класса соответствует текущей спецификации jvm.
    • Подготовиться кпеременная классаВыделить память и установить начальное значение переменной (По умолчанию). Если это окончательный измененный объект, это значение объявления присваивания.
    • Решение. Замените символические ссылки на пулы констант прямыми ссылками.
    • Инициализация: выполнить конструктор класса (Обратите внимание, что это не конструктор объекта),запеременная классаНазначение, выполняет статический блок кода. JVM гарантирует, что родительского класса будет выполнен до того, как будет выполнен подкласса.
  • Три части проверки, подготовки и синтаксического анализа называются соединением.
  • Метод состоит изКод назначения статической переменной и блоки статического кодаКомпозиция; сначала выполните код присвоения отображения статической переменной класса, а затем код блока статического кода

3 Условия, вызывающие загрузку класса

  • При первом создании нового объекта классаЭто вызовет загрузку инициализации класса и выполнение функции инициализации объекта, Это инициализация экземпляра, а остальные 6 — инициализация класса.
  • Когда JVM запускается, она сначала загружает и инициализирует класс, содержащий основной метод.
  • Вызов статического метода класса (например, выполнение инструкции invokestatic)
  • Выполнять операции чтения и записи над статическими полями класса или интерфейса (т. выражение постоянной величины времени компиляции
    • Уведомление: при работе со статическим полем будет инициализирован только класс, который непосредственно определяет это поле; если вы работаете со статическим полем, определенным в родительском классе, через его подкласс, это вызовет только инициализацию родительского класса вместо подкласс.
  • При вызове метода отражения в JavaAPI (чем при вызове метода в java.lang.Class (Class.forName) или метода других классов в пакете java.lang.reflect)
  • При инициализации класса его родительский класс не инициализируется, сначала нужно запустить инициализацию родительского класса (кроме интерфейса)

4 Процесс создания экземпляра объекта

  • процесс создания экземпляра объектаНа самом деле, это выполнение конструктора класса, соответствующего методу () в файле байт-кода (называемом конструктором экземпляра); метод () определяетсяНестатические переменные, нестатические блоки кода и соответствующие конструкторы
    • Метод () может быть перегружен несколько раз, существует несколько методов (), если класс имеет несколько конструкторов.
    • Заказ выполнения кода в методе (): инициализация переменных родительских классов, блок кода родительского класса, конструктор родительских классов, инициализация переменных классов дочерней класса, блок кода класса дочернего класса.
  • Статические переменные, статические блоки кода, обычные переменные, обычные блоки кода, порядок выполнения конструкторов
  • Порядок создания дочернего класса с родительским классом следующий.

5 Загрузчики классов и правило родительского делегирования, как нарушить правило родительского делегирования

  • загрузчик классов
    • Получить полное имя классадвоичный поток байтов, описывающий этот класс, модуль кода, реализующий это действие, называется загрузчиком классов.
    • Любой класс нуждается в его погрузчике и сам класс, чтобы определить уникальность класса в JVM; каждый класс погрузчика имеет свой собственный класс пространства имен, и тот же класс, загруженный разными погрузками, оценивается как разные с помощью JVM типа
  • Модель родительского делегирования
    • Загрузчик классов запуска реализован в коде C++ и является частью виртуальной машины. Отвечает за загрузку библиотек классов в \lib
    • Другие загрузчики классов реализованы на языке java, не зависят от JVM и наследуют ClassLoader.
    • extension ClassLoader отвечает за загрузку библиотеки классов в каталог \lib\ext
    • приложение ClassLoader отвечает за загрузку кода по пользовательскому пути (ClassPath)
    • Загрузка одного и того же файла класса с помощью разных загрузчиков классов приведет к появлению двух классов. Решение, данное java, состоит в том, чтобы добавить нижний загрузчик и доверить загрузчику верхнего класса загрузку класса.Если родительский класс не может быть загружен (соответствующий класс не может быть найден в каталоге, за который он отвечает), загрузчик нижнего класса загружается вернулся к загрузке. Как показано ниже
  • Разрушьте модель родительского делегирования
    • Модель родительского делегирования не является обязательной моделью ограничений, а является реализацией загрузки классов, рекомендованной дизайнерами Java для разработчиков.
    • Модель родительского делегирования является хорошим решением той же проблемы загрузки базового класса для каждого класса (более базовый класс загружается верхним загрузчиком), но базовый класс всегда используется в качестве API, вызываемого пользовательским кодом, но если его конкретной реализацией является код более низкого уровня.В это время базовому классу необходимо вызвать код более низкого уровня, а модель родительского делегирования должна быть нарушена.
    • Например, служба JNDI, код JNDI имеет загружаемый класс запуска (rt.jar), который должен вызывать код JNDI SPI (интерфейс поставщика услуг), развернутый независимым поставщиком в пути к классам приложения. Чтобы решить проблему загрузки кода SPI, java представляет загрузчик класса контекста потока для загрузки кода SPI. То есть загрузчик родительского класса запрашивает дочерний класс для завершения действия по загрузке класса.
    • Загрузчик класса контекста потока. При создании потока он наследуется от родительского потока. Если глобальная область не задана, параметром по умолчанию является загрузчик классов приложения.

Добро пожаловать на ошибку в тексте

Обратите внимание на публичный номер и общайтесь вместе

Справочная статья