ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 01.12.2023

Просмотров: 415

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Статическое и динамическое связывание
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).
В свою очередь, позднее связывание (late binding) – это связывание, проводимое непосредственно во время выполнения программы в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic), или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
SOLID
Принцип единственной ответственности
Класс должен быть ответственен лишь за что-то одно. Если класс отвечает за решение нескольких задач, его подсистемы, реализующие решение этих задач, оказываются связанными друг с другом. Изменения в одной такой подсистеме ведут к изменениям в другой.
Принцип открытости-закрытости
Программные сущности (классы, модули, функции) должны быть открыты для расширения,
но не для модификации.
Принцип подстановки Барбары Лисков
Необходимо, чтобы подклассы могли бы служить заменой для своих суперклассов.
Цель этого принципа заключаются в том, чтобы классы-наследники могли бы использоваться вместо родительских классов, от которых они образованы, не нарушая работу программы.
Если оказывается, что в коде проверяется тип класса, значит принцип подстановки нарушается.
Принцип разделения интерфейса
Создание узкоспециализированных интерфейсов, предназначенных для конкретного клиента. Клиенты не должны зависеть от интерфейсов, которые они не используют.
Этот принцип направлен на устранение недостатков, связанных с реализацией больших интерфейсов.
Принцип инверсии зависимостей
Объектом зависимости должна быть абстракция, а не что-то конкретное.
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.


В процессе разработки программного обеспечения существует момент, когда функционал приложения перестает помещаться в рамках одного модуля. Когда это происходит,
приходится решать проблему зависимостей модулей. В результате, например, может оказаться так, что высокоуровневые компоненты зависят от низкоуровневых компонентов.
https://ota-solid.now.sh/lsp
Какая основная идея языка?
«Написано однажды – работает везде» (WORA).
Идея основывается в написании одного кода, который будет работать на любой платформе.
За счет чего обеспечивается кроссплатформенность?
Кроссплатформенность была достигнута за счет создания виртуальной машины Java.
Java Virtual Machine или JVM – это программа, являющаяся прослойкой между
операционной системой и Java-программой. В среде виртуальной машины выполняются коды Java-программ. Сама JVM реализована для разных ОС.
Какие преимущества у Java?
Объектно-ориентированное программирование – структура данных становится объектом,
которым можно управлять для создания отношений между различными объектами.
Язык высокого уровня с простым синтаксисом и плавной кривой обучения
синтаксис Java основан на C ++, поэтому Java похожа на C. Тем не менее, синтаксис Java проще, что позволяет новичкам быстрее учиться и эффективнее использовать код для достижения конкретных результатов.
Стандарт для корпоративных вычислительных систем – корпоративные приложения –
главное преимущество Java с 90-х годов, когда организации начали искать надежные инструменты программирования не на C.
Безопасность – благодаря отсутствию указателей и Security Manager (политика безопасности, в которой можно указать правила доступа, позволяет запускать приложения
Java в «песочнице»).
Независимость от платформы – можно создать Java-приложение на Windows,
скомпилировать его в байт-код и запустить его на любой другой платформе,
поддерживающей виртуальную машину Java (JVM). Таким образом, JVM служит уровнем абстракции между кодом и оборудованием.
GC – garbage collector (сборщик мусора).
Язык для распределенного программирования и комфортной удаленной совместной
работы – специфическая для Java методология распределенных вычислений называется
Remote Method Invocation (RMI). RMI позволяет использовать все преимущества Java:
безопасность, независимость от платформы и объектно-ориентированное программирование для распределенных вычислений. Кроме того, Java также поддерживает программирование сокетов и методологию распределения CORBA для обмена объектами между программами, написанными на разных языках.
Автоматическое управление памятью – разработчикам Java не нужно вручную писать код для управления памятью благодаря автоматическому управлению памятью (AMM).


Многопоточность – поток – наименьшая единица обработки в программировании. Чтобы максимально эффективно использовать время процессора, Java позволяет запускать потоки одновременно, что называется многопоточностью.
Стабильность и сообщество – сообщество разработчиков Java не имеет себе равных.
Около 45% респондентов опроса StackOverflow (2018) используют Java.
Какие недостатки у java?

платное коммерческое использование (с 2019);

низкая производительность из-за компиляции и абстракции с помощью виртуальной машины, а также приложения очистки памяти (из-за кроссплатформенности, GC, обратной совместимости, скорости развертывания);

не развитые инструменты по созданию GUI-приложений на чистой java.

многословный код – Java – это более легкая версия неприступного C++, которая вынуждает программистов прописывать свои действия словами из английского языка, это делает язык более понятным для неспециалистов, но менее компактным.
Что такое JDK? Что в него входит?
JDK, Java Development Kit (комплект разработки на Java) – JRE и набор инструментов разработчика приложений на языке Java, включающий в себя компилятор Java, стандартные библиотеки классов Java, примеры, документацию, различные утилиты.
Коротко: JDK – среда для разработки программ на Java, включающая в себя JRE-среду для обеспечения запуска Java-программ, которая в свою очередь содержит JVM-интерпретатор кода Java-программ.
Что такое JRE? Что в него входит?
JRE, Java Runtime Environment (среда времени выполнения Java) – минимально необходимая реализация виртуальной машины для исполнения Java-приложений. Состоит из JVM и стандартного набора библиотек классов Java.
Что такое JVM?
JVM, Java Virtual Machine (виртуальная машина Java) – основная часть среды времени исполнения Java (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java. JVM может также использоваться для выполнения программ, написанных на других языках программирования.
Что такое byte code?
Байт-код Java – набор инструкций, скомпилированный компилятором, исполняемый JVM, имеется уже около 200 инструкций, 56 в запасе. 1 инструкция = 1 байту.
Что такое загрузчик классов (classloader)?
Основа работы с классами в Java – классы-загрузчики, обычные Java-объекты,
предоставляющие интерфейс для поиска и создания объекта класса по его имени во время работы приложения.


В начале работы программы создается 3 основных загрузчика классов:

базовый загрузчик (bootstrap/primordial). Загружает основные системные и внутренние классы JDK (Core API – пакеты java.* (rt.jar и i18n.jar). Важно заметить,
что базовый загрузчик является «изначальным», или «корневым» и частью JVM,
вследствие чего его нельзя создать внутри кода программы.

загрузчик расширений (extention). Загружает различные пакеты расширений,
которые располагаются в директории /lib/ext или другой директории, описанной в системном параметре java.ext.dirs. Это позволяет обновлять и добавлять новые расширения без необходимости модифицировать настройки используемых приложений. Загрузчик расширений реализован классом sun.misc.Launcher$ExtClassLoader.

системный загрузчик (system/application). Загружает классы, пути к которым указаны в переменной окружения CLASSPATH или пути, которые указаны в командной строке запуска JVM после ключей -classpath или -cp. Системный загрузчик реализован классом sun.misc.Launcher$AppClassLoader.
Загрузчики классов являются иерархическими: каждый из них (кроме базового) имеет родительский загрузчик и в большинстве случаев перед тем как попробовать загрузить класс самостоятельно, посылает вначале запрос родительскому загрузчику загрузить указанный класс. Такое делегирование позволяет загружать классы тем загрузчиком, который находится ближе всего к базовому в иерархии делегирования. Как следствие поиск классов будет происходить в источниках в порядке их доверия: сначала в библиотеке Core API, потом в папке расширений, потом в локальных файлах CLASSPATH.
1   2   3   4   5   6   7   8   9   ...   25

Процесс загрузки класса состоит из трех частей:

Loading – на этой фазе происходит поиск и физическая загрузка файла класса в определенном источнике (в зависимости от загрузчика). Этот процесс определяет базовое представление класса в памяти. На этом этапе такие понятия как
«методы», «поля» и т. д. пока неизвестны.

Linking – процесс, который может быть разбит на 3 части:
Bytecode verification – проверка байт-кода на соответствие требованиям,
определенным в спецификации JVM;
Class preparation – создание и инициализация необходимых структур,
используемых для представления полей, методов, реализованных интерфейсов и т.п., определенных в загружаемом классе;
Resolving – загрузка набора классов, на которые ссылается загружаемый класс.

Initialization – вызов статических блоков инициализации и присваивание полям класса значений по умолчанию.
Динамическая загрузка классов в Java имеет ряд особенностей:

отложенная (lazy) загрузка и связывание классов. Загрузка классов производится только при необходимости, что позволяет экономить ресурсы и распределять нагрузку.

проверка корректности загружаемого кода (type safeness). Все действия,
связанные с контролем использования типов, производятся только во время
загрузки класса, позволяя избежать дополнительной нагрузки во время выполнения кода.

программируемая загрузка. Пользовательский загрузчик полностью контролирует процесс получения запрошенного класса – самому ли искать байт-код и создавать класс или делегировать создание другому загрузчику. Дополнительно существует возможность выставлять различные атрибуты безопасности для загружаемых классов, позволяя таким образом работать с кодом из ненадежных источников.

множественные пространства имен. Каждый загрузчик имеет свое пространство имен для создаваемых классов. Соответственно, классы, загруженные двумя различными загрузчиками на основе общего байт-кода, в системе будут различаться.
Существует несколько способов инициировать загрузку требуемого класса:

явный: вызов ClassLoader.loadClass() или Class.forName() (по умолчанию используется загрузчик, создавший текущий класс, но есть возможность и явного указания загрузчика);

неявный: когда для дальнейшей работы приложения требуется ранее не использованный класс, JVM инициирует его загрузку.
Что такое JIT?
JIT-компиляция (англ. Just-in-time compilation, компиляция «на лету»), динамическая компиляция (англ. dynamic translation) – технология увеличения производительности программных систем, использующих байт-код, путем компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы.
Виды ссылок в Java
В Java существует 4 типа ссылок. Особенности каждого типа ссылок связаны с работой
Garbage Collector.
 сильные (strong reference);
 мягкие (SoftReference);
 слабые (WeakReference);
 фантомные (PhantomReference).
Отличия между слабыми, мягкими, фантомными и обычными ссылками в
Java
«Слабые» ссылки и «мягкие» ссылки (WeakReference, SoftReference) были добавлены в
Java API давно. Ссылочные классы особенно важны в контексте сборки мусора. Сборщик мусора сам освобождает память, занимаемую объектами, но решение об освобождении памяти он принимает, исходя из типа имеющихся на объект ссылок.
Главное отличие SoftReference от WeakReference в том, как сборщик с ними будет работать.
Он может удалить объект в любой момент, если на него указывают только weak-ссылки, с другой стороны объекты с soft-ссылкой будут собраны только когда JVM очень нужна память.
Благодаря таким особенностям ссылочных классов каждый из них имеет свое применение.
SoftReference можно использовать для реализации кэшей, и когда JVM понадобится память,
она освободит ее за счет удаления таких объектов. А WeakReference отлично подойдут для