Core-1 Flashcards
Что такое ООП?
Представление программы в виде совокупности
обменивающихся сообщениями объектов, каждый из которых
является экземпляром определенного класса, а классы образуют иерархию наследования.
Объекты могут обладать состоянием, единственный способ изменить состояние объекта – послать ему сообщение, в ответ на которое объект может изменить собственное состояние.
3 требования для ООП Программы
- объектно-ориентированное программирование использует в качестве основных
логических конструктивных элементов объекты, а не алгоритмы; - каждый объект является экземпляром определенного класса;
- классы образуют иерархии.
Какие преимущества у ООП?
Легко читается – не нужно выискивать в коде функции и выяснять, за что они отвечают.
Быстро пишется – можно быстро создать сущности, с которыми должна работать программа.
Простота реализации большого функционала – т. к. на написание кода уходит меньше времени, можно гораздо быстрее создать приложение с множеством возможностей.
Какие недостатки у ООП?
Потребление памяти – объекты потребляют больше оперативной памяти, чем примитивные
типы данных.
Снижается производительность – многие вещи технически реализованы иначе, поэтому
они используют больше ресурсов.
Сложно начать – парадигма ООП сложнее функционального программирования, поэтому на
старт уходит больше времени.
Инкапсуляция
СОКРЫТИЕ РЕАЛИЗАЦИИ:
Объединение данных и работающих с ними методов
в классе с целью скрыть детали реализации от пользователя, открыв только то, что необходимо при использовании этого класса.
=> Всё то, что не входит в интерфейс, инкапсулируется в классе.
Полезна для:
- контроль доступа
- контроль целостности/валидности данных
- возможность изменения реализации
Наследование
Создание нового класса на основе уже существующего с частично или полностью заимствующейся функциональностью.
Полиморфизм
ВОЗМОЖНОСТЬ ИМЕТЬ РАЗНЫЕ ФОРМЫ ДЛЯ ОДНОЙ И ТОЙ ЖЕ СУЩНСТИ:
это свойство системы использовать объекты с одинаковым интерфейсом
без информации о типе и внутренней структуре объекта.
ключевая особенность
полиморфизма
использование объекта производного класса вместо объекта базового:
потомки могут переопределять родительское поведение, даже если обращение к ним будет
производиться по ссылке родительского типа.
Преимущество полиморфизма
он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования.
2 Типа Полиморфизма
- Динамический: переопределение
- Статический: перегрузка
Полиморфная переменная
Может принимать значение разных типов
Полиморфная функция
хотя бы 1 ее аргумент - полиморфная переменная.
2 типа полиморфных функций
- Ad hoc - Ф. ведет себя по разному для разных типов ( draw() )
- Параметрический: Ф. ведёт себя одинаково для аргументов разных типов (Collections.sort )
Абстракция
Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, абстракция – это набор всех таких
характеристик.
Что такое обмен сообщениями?
Сообщение - запрос на выполнения действия, отправка сообщения = вызов метода.
Класс
Класс описывает состояние и зависящее от него поведение сущности, а также правила для взаимодействия с данной сущностью (контракт).
Объект
Объект (экземпляр) – это представитель класса, имеющий конкретное состояние
и поведение, полностью определяемое классом.
Что такое Интерфейс и как он связан с классом?
И. - набор всех публичных методов класса в совокупности с набором
публичных атрибутов.
И. специфицирует класс, четко определяя все
возможные действия над ним.
Ассоциация
означает, что объекты двух классов могут ссылаться один на другой. Композиция и агрегация – частные случаи ассоциации «часть-целое».
«is a» - наследование
«has a» - ассоциаия
Агрегация
Агрегация предполагает, что объекты связаны взаимоотношением «part-of». Student - Course
Композиция
более жесткое отношение , чем агрегация: когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Engine - Car.
Связывание метода (binding)
Присоединение вызова метода к телу метода
early binding
статическое или раннее связывание: связывание
проводится компилятором (компоновщиком) перед запуском программы
late binding
позднее связывание (dynamic или runtime binding) - связывание, проводимое непосредственно во время выполнения программы в зависимости от типа объекта.
Виртуальный метод
Метод, который может быть переопределен в классах наследниках так, что конкретная реализация будет определяться во время исполнения.
Различия между ранним и поздним связыванием в Java (3)
1) в языке Java Статическое связывание используется для перегруженных методов, динамическое для переопределенных.
2) Следовательно, приватные, статические и терминальные (final) методы разрешаются при помощи статического связывания, поскольку их нельзя переопределять, а все виртуальные методы разрешаются при помощи динамического связывания.
3) В статическом связывании для выбора метода используется тип ссылочной переменной, при динамическом связывании для нахождения нужного метода в Java используется конкретный объект.
Перечислите SOLID принципы
https://javarush.com/groups/posts/osnovnye-principy-dizajna-klassov-solid-v-java
https://habr.com/ru/company/ruvds/blog/426413/
S - Single Responsibility - Каждый класс должен иметь только одну зону ответственности.
O - Open-Closed - описываемый класс должен быть открыт для расширения, но закрыт для изменений.
L - Liskov Substitution - Методы, использующие ссылки на базовые классы, должны иметь возможность использовать объекты классов-наследников, не зная об этом.
I - Interface Segregation - клиенты не должны быть вынуждены реализовывать методы, которые они не будут использовать..
D - Dependency Inversion - Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
SOLID: Single Responsibility
Принцип единственной ответственности: На каждый объект возлагается единственная обязанность, полностью инкапсулированная в класс. Такие классы всегда будет просто изменять и не бояться последствий — влияния на другие объекты.
SOLID: Open-Closed
https://habr.com/ru/company/tinkoff/blog/472186/
программные сущности (классы, модули, функции и т.п.) должны быть открыты для расширения, но закрыты для изменения:
классы разрабатываются так, чтобы для подстройки класса к конкретным условиям применения было достаточно расширить его и переопределить некоторые функции.
Это можно решить с помощью интерфейса: он закрыт для изменения, но его можно расширить, добавив новую имплементацию.
=> В хорошо спроектированных программах новая функциональность вводится путем добавления нового кода, а не изменением старого, уже работающего.
SOLID: Liskov Substitution
https://habr.com/ru/company/tinkoff/blog/490738/
Объекты в программе можно заменить их наследниками без изменения свойств программы.
Правильная иерархия наследования в ООП — это иерархия, построенная согласно LSP, чтобы отвечать принципу открытости-закрытости.
SOLID: Interface Segregation
Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более мелкие и специфические, чтобы клиенты мелких интерфейсов знали только о методах, необходимых в работе. В итоге, при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют.
SOLID: Dependency Inversion
Зависимости внутри системы строятся на основе абстракций:
программное обеспечение нужно проектировать так, чтобы модули высокого и низкого уровней были автономными и соединялись друг с другом с помощью абстракции.
Какая основная идея языка?
«Написано однажды – работает везде» (WORA).
Идея основывается в написании одного кода, который будет работать на любой платформе.
За счет чего обеспечивается кроссплатформенность?
за счет JRE –
это программа, являющаяся прослойкой между
операционной системой и Java-программой. В среде виртуальной машины выполняются
коды Java-программ. Сама JVM реализована для разных ОС.
Какие преимущества у Java?
- ООП
- Безопасность
- Кроссплатформенность
- garbage collector
- Многопоточность
Какие недостатки у java?
- низкая производительность
- не развитые инструменты по созданию GUI-приложений на чистой java.
- многословный код
кратко определить JDK, JRE, JVM
- JDK позволяет создавать программы запускаемые посредством JRE & JVM
- JRE создает и запускает JVM
- JVM отвечает за исполнение программ.
JDK может включать в себя JRE, которая включает в себя JVM.
Что такое JDK? Что в него входит (4)?
Основной компонент среды Java, он предоставляет все инструменты, исполняемые и бинарные файлы, которые нужны для компиляции, отладки и выполнения программы. Включает:
- JRE
- Компилятор
- Отладчик
- Базовые Классы
https://topjava.ru/blog/what-is-the-jdk
Что такое Cреда Выполнения?
Cреда выполнения (окружение) — это часть программного обеспечения, предназначенная для запуска другого программного обеспечения.
Что такое JRE? Что в него входит (4)?
Runtime Environment.
JRE - это уровень ПО, работающий поверх ОС и предоставляющий дополнительные службы, специфичные для Java.
Она берет Java-код, объединяет его с необходимыми библиотеками и запускает JVM для его выполнения.
Включает:
- Class Loader
- Byte Code Verification
-JVM
- стандартного набора библиотек классов Java.
JRE не содержит инструменты для разработки (компилятор, отладчик и т.д).
https://topjava.ru/blog/what-is-the-jre
Что такое JVM? 2 основные функции?
JVM — это спецификация программного обеспечения, которое выполняет код и предоставляет среду выполнения для этого кода:
- считывает команды, представленные в class-файлах и транслирует их в виде инструкций процессору.
- Управляет и оптимизирует память, используемую приложением.
JVM является виртуальной машиной, потому что обеспечивает интерфейс, который не зависит от операционной системы и аппаратных средств.
Что такое byte code?
набор инструкций, скомпилированный компилятором, исполняемый JVM
Что такое rt.jar
Файл, содержащий классы, входящие в JRE.
Что такое загрузчик классов (classloader)?
POJO, отвечающий за динамическую загрузку классов в JVM и, соответственно в память.
Какие загрузчики классов создаются в начале работы программы?
- базовый (bootstrap) является native «корневым» и частью JVM. Загружает основные системные и внутренние классы JDK из rt.jar и порождает остальные сущности ClassLoader
- загрузчик расширений (extention).Загружает различные пакеты расширений, которые располагаются в директории <JAVA_HOME>/lib/ext или другой директории, описанной в системном параметре java.ext.dirs.</JAVA_HOME>
- системный загрузчик (system/application). Загружает классы, пути к которым
указаны в переменной окружения CLASSPATH или пути, которые указаны в
командной строке запуска JVM после ключей -classpath или -cp.
Иерархия загрузчиков классов
Bootstrap -> Extension -> System.
Каждыж загрузчик содержит ссылку на родителя, чтобы делегировать ему загрузку, если сам будет не в состоянии загрузить класс.
Как работае Модель Делегирования в Загрузчиках Классов?
- Поиск класса в кэше от потомка к родителю, затем попытки загрузки класса в обратном порядке
- В случае неудачи генерится ClassNotFoundException
Этапы загрузки класса? (3)
- Loading – поиск и физическая загрузка файла класса из
определенного источника (в зависимости от загрузчика) . Этот процесс определяет
базовое представление класса в памяти. На этом этапе такие понятия как
«методы», «поля» и т. д. пока неизвестны. - Linking – приведение класса в run-time state (готов к исполнению).
Он может быть разбит на 3 части:
* Bytecode verification – проверка корректности полученного байт-кода.
* Class preparation – выделение оперативной памяти под статические поля и инициализация их значениями по умолчанию согласно их типу.
* Resolution (optional) – загрузка и линковка прочих классов, с которыми связан данный. - Initialization – вызов init метода класса:
- инициализация статических переменных их значениями
- инициализация супер классов, если еще не.
Как получить экземпляр системного загрузчика?
Как получить экземпляр загрузчика класса А?
1. ClassLoader.getSystemClassLoader() 2. A.class.getClassLoader()
Что такое LAZY загрузка?
Первоначально загружается только один класс. Как только код этого класса обращается к какому-то другому классу (любым способом: вызовом конструктора, обращением к статическому методу или полю), загружается другой класс.
Что такое текущий загрузчик?
экземпляр некоторого наследника ClassLoader, который загрузил класс, код которого исполняется в данный момент.
Как инициировать загрузку требуемого класса?
- явно: вызов ClassLoader.loadClass() или Class.forName() (по умолчанию
используется загрузчик, создавший текущий класс, но есть возможность и явного
указания загрузчика); - неявно: когда для дальнейшей работы приложения требуется ранее не использованный класс, JVM инициирует его загрузку.
Что такое JIT?
Подразумевает компиляцию кода, когда это нужно, а не до выполнения программы.
Главный принцип JIT — это не компилировать всю программу, а лишь те ее участки, которые наиболее часто используются пользователем.
Они хранятся в памяти устройства.
В результате быстродействие программ при JIT-компиляции достигается за счет увеличенного потребления памяти устройства.
Что такое ссылка? Виды ссылок в Java (4)
ссылка - переменная, содержащая адрес ячейки памяти, где хранится объект.
сильные (strong reference) - запрещено удалять объект
мягкие (SoftReference) - удалять только при острой нехватке памяти. Подходят для кэша
слабые (WeakReference) - можно удалять в любой момент. Подходят для метаданных
фантомные (PhantomReference)- можно удалять в любой момент
Особенности каждого типа ссылок связаны с работой
Garbage Collector.
ReferenceQueue
сюда попадают ссылки на удаленные объекты
Что такое сборщик мусора?
Это отдельный поток. Он ведет каждый существующий в HEAP объект и помечает их, и удаляет в зависимости от своих настроек и типа ссылки на конкретный объект.
Описать жизненный цикл объекта (4.4)
) Все новые объекты, за исключением очень больших, попадают в Young Generation. Очень большие - могут сразу попасть в Old.
2) В первую очередь сборщик собирает Young Generation. Объекты, которые пережили несколько сборок, могут быть “повышены” до Old Generation.
3) Объекты в Old Generation собираются тогда, когда памяти, очищенной в Young Generation, уже недостаточно.
4) Процесс сборки примерно таков:
— 4.1) Пометить все “живые” объекты.
— 4.2) Удалить из памяти все “мертвые” объекты.
— 4.3) (Желательно) Переставить оставшиеся объекты так, чтобы они компактно занимали одну область.
— 4.4) Получилась большая свободная область памяти для новых объектов.
Какие принципиальные варианты дизайна сборщика мусора вы знаете? (3.3)
1) Последовательный (serial) VS параллельный (parallel) - использовать ли одно ядро процессора или несколько.
2) Действующий параллельно с приложением (concurrent) или “остановись, мгновенье” (stop-the-world”).
3) Уплотняющий (compacting), не уплотняющий (non-compacting) или копирующий (copying).
— 3.1) Уплотняющий сдвигает после очистки оставшиеся живые объекты, чтобы создать за ними большой блок свободной памяти
— 3.2) Не сдвигающий - так и оставляет кусками. Это быстрее, но возникает проблема “влезет ли туда объект”.
— 3.3) Копирующий - копирует (“эвакуирует”) живые объекты в другую область памяти.
Как устроена коллекция Young Generation в HotSpot JVM? (5)
1) Большая область “Рай” (Eden). В нее помещаются все вновь созданные объекты (кроме очень больших, которые идут сразу в Old).
2) Также есть две области From и To. Область From хранит объекты, выжившие при прошлой сборке мусора. Область To - пустая.
3) При сборке мусора сборщик смотрит области Eden и From. Выжившие объекты в Eden копирует в блок To. Выжившие объекты из блока From могут копироваться в To (если они еще “молодые”) или в блок Old (если уже “старые”).
4) После сборки мусора теперь уже блок From стал пустым, а блок To - заполнен. Они меняются местами.
5) Если Old не может принять все young объекты, ставшие old, GC запускает очистку Old.
Какие типы сборщиков мусора в HotSpot JVM вы знаете?
1) Последовательный (Serial Collector).
2) Параллельный (Parallel)
3) Параллельный уплотняющий (Parallel Compacting, Parallel Old)
4) Параллельный приложению “метка-удаление” (Concurrent Mark-Sweep, CMS). С Java 9 считается устаревшим.
5) Коллектор G1 (Garbage-First). Модифицированная версия CMS Collector. С Java 9 является коллектором по-умолчанию.
Что за алгоритм сборки мусора mark-sweep-compact?
1) Сначала размечаем живые и мертвые объекты.
2) Затем очищаем “мертвые” объекты.
3) Затем “уплотняем” живые объекты, смещая их в одно место. Тем самым, свободное место превращается в один большой свободный блок.
Опишите сборщик мусора - Serial Collector. (3)
1) Serial Collector - однопоточный, копирующий, stop-the-world сборщик.
2) Собирает Young Generation, копируя объекты из блоков Eden и From в To.
3) Собирает Old Generation с помощью mark-sweep-compact.
Опишите сборщик мусора - Parallel.
Многопоточен при работе с Young, в остальном - как Serial.
1) Parallel Collector - копирующий, stop-the world. Уменьшает pause time по сравнению с Serial за счет многопоточности при сборке Young Generation.
2) Собирает Young Generation, копируя объекты из блоков Eden и From в To. Применяет для этого несколько потоков, тем самым сильно уменьшая pause time.
3) Собирает Old Generation с помощью mark-sweep-compact.
Опишите сборщик мусора - Parallel Compacting (Parallel Old).
1) Parallel Compacting Collector - копирующий, stop-the world. То же, что Parallel Collector, но применяет многопоточность не только при сборке Young Generation, но и при сборке Old Generation:
Собирает Old Generation с помощью mark-sweep-compact. Делит Old Generation на области для потоков, затем потоки очищают место, затем делает compact свободного места (уже в один поток).
Опишите сборщик мусора - Concurrent Mark-Sweep (CMS). (x+5)
Young Generation собирается ровно так же, как в Parallel Collector.
Сбор Old Generation разбивается на фазы:
— 1) Начальная метка (Initial mark) - короткая stop-the-world, помечаются “живые” объекты, на которые напрямую ссылается приложение.
— 2) Параллельная приложению Marking Phase - проход по ссылкам помеченных объектов и пометка “живыми” объектов, на которые ссылаются помеченные объекты.
— 3) Короткая stop-the world фаза Remark. Еще раз пройтись по всем помеченным объектам и проверить, что они не умерли, пока шла предыдущая фаза.
— 4) Наконец, идет параллельная приложению Sweep Phase, во время которой помеченные объекты очищаются, освобождая место.
—- 5) Фазы Compact у этого коллектора нет - и в этом его большой минус.
Опишите сборщик мусора - G1 (Garbage First). Его основные отличия от CMS? (2)
Коллектор G1 является заменой Concurent Mark-Sweep (CMS) коллектора и коллектором по-умолчанию с Java 9.
Два главных отличия от CMS:
(1) Коллектор G1 группирует живые объекты (compacting), не допуская большой фрагментации памяти.
(2) Коллектор стремится минимизировать stop-the-world паузы и делает их меньше, чем CMS, за счет разбивания Old Generation на регионы.
1) Каждый регион может быть частью Young или Old generation - по мере надобности.
2) В первую очередь G1 старается освобождать память в регионах с малым количеством живых объектов - отсюда - “Garbage first”.
3) В Young идет копирование из региона Eden в другой регион Survivor (аналог To). В Old идет initial mark, concurrent mark, remark. Только вместо concurrent sweep идет concurrent copy живых объектов в другой регион, за счет чего и происходит уплотнение.
Какие типы памяти в JVM вы знаете?
1) Heap
2) Stack
3) MetaSpace (с Java8).
4) До Java8 вместо MetaSpace была область PermGen в Heap.
Расскажите про тип памяти Heap. (4)
1) Абсолютно все объекты, созданные в ходе работы приложения, размещаются в heap.
2) Обычно делится на Young и Old Generation.
3) Работает медленнее, чем Stack память.
4) Если нет места под объект после сборки мусора, выкидывается OutOfMemoryException
Расскажите про тип памяти Stack. (6.4)
1) Stack (стек) - область памяти для хранения ЛОКАЛЬНЫХ переменных, создаваемых в методе.
2) Stack значительно меньше, чем Heap, скорость доступа - значительно быстрее.
3) Память Stack не требует сборщика мусора - блок полностью очищается при выходе из метода.
4) Если локально создается объект, то сам объект помещается в Heap, а ссылка на него - в Stack.
5) Если память стека полностью занята (н-р бесконечная рекурсия), выбрасывается StackOverflowException.
6.1) Устройство: по принципу LIFO. Вызван метод - ему выделяется блок стек-памяти и кладется “сверху”.
6.2) Внутри вызван подметод - выделяется еще блок памяти и кладется “сверху”.
6.3) Всегда доступен только последний, самый “верхний” блок памяти.
6.4) Метод отработал - его верхний блок памяти очищается, становится доступен более нижний блок
Что такое MetaSpace? В чём отличие от PermGen? (5)
1) MetaSpace - область памяти, отдельная от Heap. Зарезервирована JVM для размещения классов, методов, статических переменных.
2) В отличии от PermGen умеет автоматически расширяться, пока позволяет операционная система (или до заданного макс. значения).
3) MetaSpace появилась в Java 8+ как замена PermGen.
4)В отличии от PermGen проверяется сборщиком мусора на “мертвые объекты”.
5) Раньше класс загружался вместе с JVM и умирал с ее выключением. Сейчас есть динамическая загрузка/выгрузка классов в ходе жизни JVM. Отсюда - нужна сборка “мертвых” классов и расширение под добавленные.
Расскажите про String Pool в Java (5)
1) String Pool - область памяти, где хранятся объекты строк для многоразового использования.
2) В пул попадают строки, созданные с помощью литералов или строки, на которых вызван string.intern().
3) До Java 7 String Pool находился в PermGen. Не проверялся сборщиком мусора, нет возможности расти.
4) В Java 7+ String pool находится в heap, проверяется сборщиком мусора и может возрастать.
5) Начальный размер пула можно задать в ключах запуска JVM
Что такое литерал?
Литералы — это явно заданные значения в коде программы: константы определенного типа, которые находятся в коде в момент запуска.
- Числовые:
- Целочисленные;
- С плавающей точкой;
- Строковые;
- Символьные;
- Логические.
Расскажите про Integer pool в Java. (4)
1) Часть пула объектов-оберток примитивов. Он создается статически, при инициализации соответствующего класса.
2) По спецификации пул используется для переменных: 1) byte и boolean; 2) int и long в интервале [-128…127] и 3) char в интервале [0…127].
3) Для таких объектов при автобоксинге (а также при вызове метода valueOf()) не будет создаваться новый объект, а будет возвращаться объект из пула.
4) Например, Integer.valueOf(127) == Integer.valueOf(127), а вот Integer.valueOf(128) != Integer.valueOf(128).