Core-1 Flashcards

1
Q

Что такое ООП?

A

Представление программы в виде совокупности
обменивающихся сообщениями объектов, каждый из которых
является экземпляром определенного класса, а классы образуют иерархию наследования.

Объекты могут обладать состоянием, единственный способ изменить состояние объекта – послать ему сообщение, в ответ на которое объект может изменить собственное состояние.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

3 требования для ООП Программы

A
  • объектно-ориентированное программирование использует в качестве основных
    логических конструктивных элементов объекты, а не алгоритмы;
  • каждый объект является экземпляром определенного класса;
  • классы образуют иерархии.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Какие преимущества у ООП?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Какие недостатки у ООП?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Инкапсуляция

A

СОКРЫТИЕ РЕАЛИЗАЦИИ:
Объединение данных и работающих с ними методов
в классе с целью скрыть детали реализации от пользователя, открыв только то, что необходимо при использовании этого класса.
=> Всё то, что не входит в интерфейс, инкапсулируется в классе.
Полезна для:
- контроль доступа
- контроль целостности/валидности данных
- возможность изменения реализации

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Наследование

A

Создание нового класса на основе уже существующего с частично или полностью заимствующейся функциональностью.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Полиморфизм

A

ВОЗМОЖНОСТЬ ИМЕТЬ РАЗНЫЕ ФОРМЫ ДЛЯ ОДНОЙ И ТОЙ ЖЕ СУЩНСТИ:
это свойство системы использовать объекты с одинаковым интерфейсом
без информации о типе и внутренней структуре объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

ключевая особенность
полиморфизма

A

использование объекта производного класса вместо объекта базового:
потомки могут переопределять родительское поведение, даже если обращение к ним будет
производиться по ссылке родительского типа.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Преимущество полиморфизма

A

он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

2 Типа Полиморфизма

A
  1. Динамический: переопределение
  2. Статический: перегрузка
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Полиморфная переменная

A

Может принимать значение разных типов

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Полиморфная функция

A

хотя бы 1 ее аргумент - полиморфная переменная.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

2 типа полиморфных функций

A
  1. Ad hoc - Ф. ведет себя по разному для разных типов ( draw() )
  2. Параметрический: Ф. ведёт себя одинаково для аргументов разных типов (Collections.sort )
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Абстракция

A

Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, абстракция – это набор всех таких
характеристик.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое обмен сообщениями?

A

Сообщение - запрос на выполнения действия, отправка сообщения = вызов метода.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Класс

A

Класс описывает состояние и зависящее от него поведение сущности, а также правила для взаимодействия с данной сущностью (контракт).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Объект

A

Объект (экземпляр) – это представитель класса, имеющий конкретное состояние
и поведение, полностью определяемое классом.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что такое Интерфейс и как он связан с классом?

A

И. - набор всех публичных методов класса в совокупности с набором
публичных атрибутов.
И. специфицирует класс, четко определяя все
возможные действия над ним.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Ассоциация

A

означает, что объекты двух классов могут ссылаться один на другой. Композиция и агрегация – частные случаи ассоциации «часть-целое».
«is a» - наследование
«has a» - ассоциаия

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Агрегация

A

Агрегация предполагает, что объекты связаны взаимоотношением «part-of». Student - Course

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Композиция

A

более жесткое отношение , чем агрегация: когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Engine - Car.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Связывание метода (binding)

A

Присоединение вызова метода к телу метода

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

early binding

A

статическое или раннее связывание: связывание
проводится компилятором (компоновщиком) перед запуском программы

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

late binding

A

позднее связывание (dynamic или runtime binding) - связывание, проводимое непосредственно во время выполнения программы в зависимости от типа объекта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Виртуальный метод
Метод, который может быть переопределен в классах наследниках так, что конкретная реализация будет определяться во время исполнения.
26
Различия между ранним и поздним связыванием в Java (3)
1) в языке Java Статическое связывание используется для перегруженных методов, динамическое для переопределенных. 2) Следовательно, приватные, статические и терминальные (final) методы разрешаются при помощи статического связывания, поскольку их нельзя переопределять, а все виртуальные методы разрешаются при помощи динамического связывания. 3) В статическом связывании для выбора метода используется тип ссылочной переменной, при динамическом связывании для нахождения нужного метода в Java используется конкретный объект.
27
Перечислите 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 - Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
28
SOLID: Single Responsibility
Принцип единственной ответственности: На каждый объект возлагается единственная обязанность, полностью инкапсулированная в класс. Такие классы всегда будет просто изменять и не бояться последствий — влияния на другие объекты.
29
SOLID: Open-Closed
https://habr.com/ru/company/tinkoff/blog/472186/ программные сущности (классы, модули, функции и т.п.) должны быть открыты для расширения, но закрыты для изменения: классы разрабатываются так, чтобы для подстройки класса к конкретным условиям применения было достаточно расширить его и переопределить некоторые функции. Это можно решить с помощью интерфейса: он закрыт для изменения, но его можно расширить, добавив новую имплементацию. => В хорошо спроектированных программах новая функциональность вводится путем добавления нового кода, а не изменением старого, уже работающего.
30
SOLID: Liskov Substitution
https://habr.com/ru/company/tinkoff/blog/490738/ Объекты в программе можно заменить их наследниками без изменения свойств программы. Правильная иерархия наследования в ООП — это иерархия, построенная согласно LSP, чтобы отвечать принципу открытости-закрытости.
31
SOLID: Interface Segregation
Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более мелкие и специфические, чтобы клиенты мелких интерфейсов знали только о методах, необходимых в работе. В итоге, при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют.
32
SOLID: Dependency Inversion
Зависимости внутри системы строятся на основе абстракций: программное обеспечение нужно проектировать так, чтобы модули высокого и низкого уровней были автономными и соединялись друг с другом с помощью абстракции.
33
Какая основная идея языка?
«Написано однажды – работает везде» (WORA). Идея основывается в написании одного кода, который будет работать на любой платформе.
34
За счет чего обеспечивается кроссплатформенность?
за счет JRE – это программа, являющаяся прослойкой между операционной системой и Java-программой. В среде виртуальной машины выполняются коды Java-программ. Сама JVM реализована для разных ОС.
35
Какие преимущества у Java?
- ООП - Безопасность - Кроссплатформенность - garbage collector - Многопоточность
36
Какие недостатки у java?
* низкая производительность * не развитые инструменты по созданию GUI-приложений на чистой java. * многословный код
37
кратко определить JDK, JRE, JVM
- JDK позволяет создавать программы запускаемые посредством JRE & JVM - JRE создает и запускает JVM - JVM отвечает за исполнение программ. JDK может включать в себя JRE, которая включает в себя JVM.
38
Что такое JDK? Что в него входит (4)?
Основной компонент среды Java, он предоставляет все инструменты, исполняемые и бинарные файлы, которые нужны для компиляции, отладки и выполнения программы. Включает: - JRE - Компилятор - Отладчик - Базовые Классы https://topjava.ru/blog/what-is-the-jdk
39
Что такое Cреда Выполнения?
Cреда выполнения (окружение) — это часть программного обеспечения, предназначенная для запуска другого программного обеспечения.
40
Что такое JRE? Что в него входит (4)?
Runtime Environment. JRE - это уровень ПО, работающий поверх ОС и предоставляющий дополнительные службы, специфичные для Java. Она берет Java-код, объединяет его с необходимыми библиотеками и запускает JVM для его выполнения. Включает: - Class Loader - Byte Code Verification -JVM - стандартного набора библиотек классов Java. JRE не содержит инструменты для разработки (компилятор, отладчик и т.д). https://topjava.ru/blog/what-is-the-jre
41
Что такое JVM? 2 основные функции?
JVM — это спецификация программного обеспечения, которое выполняет код и предоставляет среду выполнения для этого кода: - считывает команды, представленные в class-файлах и транслирует их в виде инструкций процессору. - Управляет и оптимизирует память, используемую приложением. JVM является виртуальной машиной, потому что обеспечивает интерфейс, который не зависит от операционной системы и аппаратных средств.
42
Что такое byte code?
набор инструкций, скомпилированный компилятором, исполняемый JVM
43
Что такое rt.jar
Файл, содержащий классы, входящие в JRE.
44
Что такое загрузчик классов (classloader)?
POJO, отвечающий за динамическую загрузку классов в JVM и, соответственно в память.
45
Какие загрузчики классов создаются в начале работы программы?
* базовый (bootstrap) является **native** «корневым» и частью JVM. Загружает основные системные и внутренние классы JDK из rt.jar и порождает остальные сущности ClassLoader * загрузчик расширений (extention).Загружает различные пакеты расширений, которые располагаются в директории /lib/ext или другой директории, описанной в системном параметре java.ext.dirs. * системный загрузчик (system/application). Загружает классы, пути к которым указаны в переменной окружения CLASSPATH или пути, которые указаны в командной строке запуска JVM после ключей -classpath или -cp.
46
Иерархия загрузчиков классов
Bootstrap -> Extension -> System. Каждыж загрузчик содержит ссылку на родителя, чтобы делегировать ему загрузку, если сам будет не в состоянии загрузить класс.
47
Как работае Модель Делегирования в Загрузчиках Классов?
- Поиск класса в кэше от потомка к родителю, затем попытки загрузки класса в обратном порядке - В случае неудачи генерится ClassNotFoundException
48
Этапы загрузки класса? (3)
1. Loading – поиск и физическая загрузка файла класса из определенного источника (в зависимости от загрузчика) . Этот процесс определяет базовое представление класса в памяти. На этом этапе такие понятия как «методы», «поля» и т. д. пока неизвестны. 2. Linking – приведение класса в run-time state (готов к исполнению). Он может быть разбит на 3 части: * Bytecode verification – проверка корректности полученного байт-кода. * Class preparation – выделение оперативной памяти под статические поля и инициализация их значениями по умолчанию согласно их типу. * Resolution (optional) – загрузка и линковка прочих классов, с которыми связан данный. 3. Initialization – вызов init метода класса: - инициализация статических переменных их значениями - инициализация супер классов, если еще не.
49
Как получить экземпляр системного загрузчика? Как получить экземпляр загрузчика класса А?
``` 1. ClassLoader.getSystemClassLoader() 2. A.class.getClassLoader() ```
50
Что такое LAZY загрузка?
Первоначально загружается только один класс. Как только код этого класса обращается к какому-то другому классу (любым способом: вызовом конструктора, обращением к статическому методу или полю), загружается другой класс.
51
Что такое текущий загрузчик?
экземпляр некоторого наследника ClassLoader, который загрузил класс, код которого исполняется в данный момент.
52
Как инициировать загрузку требуемого класса?
* явно: вызов ClassLoader.loadClass() или Class.forName() (по умолчанию используется загрузчик, создавший текущий класс, но есть возможность и явного указания загрузчика); * неявно: когда для дальнейшей работы приложения требуется ранее не использованный класс, JVM инициирует его загрузку.
53
Что такое JIT?
Подразумевает компиляцию кода, когда это нужно, а не до выполнения программы. Главный принцип JIT — это не компилировать всю программу, а лишь те ее участки, которые наиболее часто используются пользователем. Они хранятся в памяти устройства. В результате быстродействие программ при JIT-компиляции достигается за счет увеличенного потребления памяти устройства.
54
Что такое ссылка? Виды ссылок в Java (4)
ссылка - переменная, содержащая адрес ячейки памяти, где хранится объект.  сильные (strong reference) - запрещено удалять объект  мягкие (SoftReference) - удалять только при острой нехватке памяти. Подходят для кэша  слабые (WeakReference) - можно удалять в любой момент. Подходят для метаданных  фантомные (PhantomReference)- можно удалять в любой момент Особенности каждого типа ссылок связаны с работой Garbage Collector.
55
ReferenceQueue
сюда попадают ссылки на удаленные объекты
56
Что такое сборщик мусора?
Это отдельный поток. Он ведет каждый существующий в HEAP объект и помечает их, и удаляет в зависимости от своих настроек и типа ссылки на конкретный объект.
57
Описать жизненный цикл объекта (4.4)
) Все новые объекты, за исключением очень больших, попадают в Young Generation. Очень большие - могут сразу попасть в Old. 2) В первую очередь сборщик собирает Young Generation. Объекты, которые пережили несколько сборок, могут быть "повышены" до Old Generation. 3) Объекты в Old Generation собираются тогда, когда памяти, очищенной в Young Generation, уже недостаточно. 4) Процесс сборки примерно таков: --- 4.1) Пометить все "живые" объекты. --- 4.2) Удалить из памяти все "мертвые" объекты. --- 4.3) (Желательно) Переставить оставшиеся объекты так, чтобы они компактно занимали одну область. --- 4.4) Получилась большая свободная область памяти для новых объектов.
58
Какие принципиальные варианты дизайна сборщика мусора вы знаете? (3.3)
1) Последовательный (serial) VS параллельный (parallel) - использовать ли одно ядро процессора или несколько. 2) Действующий параллельно с приложением (concurrent) или "остановись, мгновенье" (stop-the-world"). 3) Уплотняющий (compacting), не уплотняющий (non-compacting) или копирующий (copying). --- 3.1) Уплотняющий сдвигает после очистки оставшиеся живые объекты, чтобы создать за ними большой блок свободной памяти --- 3.2) Не сдвигающий - так и оставляет кусками. Это быстрее, но возникает проблема "влезет ли туда объект". --- 3.3) Копирующий - копирует ("эвакуирует") живые объекты в другую область памяти.
59
Как устроена коллекция 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.
60
Какие типы сборщиков мусора в 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 является коллектором по-умолчанию.
61
Что за алгоритм сборки мусора mark-sweep-compact?
1) Сначала размечаем живые и мертвые объекты. 2) Затем очищаем "мертвые" объекты. 3) Затем "уплотняем" живые объекты, смещая их в одно место. Тем самым, свободное место превращается в один большой свободный блок.
62
Опишите сборщик мусора - Serial Collector. (3)
1) Serial Collector - однопоточный, копирующий, stop-the-world сборщик. 2) Собирает Young Generation, копируя объекты из блоков Eden и From в To. 3) Собирает Old Generation с помощью mark-sweep-compact.
63
Опишите сборщик мусора - 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.
64
Опишите сборщик мусора - 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 свободного места (уже в один поток).
65
Опишите сборщик мусора - 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 у этого коллектора нет - и в этом его большой минус.
66
Опишите сборщик мусора - 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 живых объектов в другой регион, за счет чего и происходит уплотнение.
67
Какие типы памяти в JVM вы знаете?
1) Heap 2) Stack 3) MetaSpace (с Java8). 4) До Java8 вместо MetaSpace была область PermGen в Heap.
68
Расскажите про тип памяти Heap. (4)
1) Абсолютно все объекты, созданные в ходе работы приложения, размещаются в heap. 2) Обычно делится на Young и Old Generation. 3) Работает медленнее, чем Stack память. 4) Если нет места под объект после сборки мусора, выкидывается OutOfMemoryException
69
Расскажите про тип памяти Stack. (6.4)
1) Stack (стек) - область памяти для хранения ЛОКАЛЬНЫХ переменных, создаваемых в методе. 2) Stack значительно меньше, чем Heap, скорость доступа - значительно быстрее. 3) Память Stack не требует сборщика мусора - блок полностью очищается при выходе из метода. 4) Если локально создается объект, то сам объект помещается в Heap, а ссылка на него - в Stack. 5) Если память стека полностью занята (н-р бесконечная рекурсия), выбрасывается StackOverflowException. 6.1) Устройство: по принципу LIFO. Вызван метод - ему выделяется блок стек-памяти и кладется "сверху". 6.2) Внутри вызван подметод - выделяется еще блок памяти и кладется "сверху". 6.3) Всегда доступен только последний, самый "верхний" блок памяти. 6.4) Метод отработал - его верхний блок памяти очищается, становится доступен более нижний блок
70
Что такое MetaSpace? В чём отличие от PermGen? (5)
1) MetaSpace - область памяти, отдельная от Heap. Зарезервирована JVM для размещения классов, методов, статических переменных. 2) В отличии от PermGen умеет автоматически расширяться, пока позволяет операционная система (или до заданного макс. значения). 3) MetaSpace появилась в Java 8+ как замена PermGen. 4)В отличии от PermGen проверяется сборщиком мусора на "мертвые объекты". 5) Раньше класс загружался вместе с JVM и умирал с ее выключением. Сейчас есть динамическая загрузка/выгрузка классов в ходе жизни JVM. Отсюда - нужна сборка "мертвых" классов и расширение под добавленные.
71
Расскажите про String Pool в Java (5)
1) String Pool - область памяти, где хранятся объекты строк для многоразового использования. 2) В пул попадают строки, созданные с помощью литералов или строки, на которых вызван string.intern(). 3) До Java 7 String Pool находился в PermGen. Не проверялся сборщиком мусора, нет возможности расти. 4) В Java 7+ String pool находится в heap, проверяется сборщиком мусора и может возрастать. 5) Начальный размер пула можно задать в ключах запуска JVM
72
Что такое литерал?
Литералы — это явно заданные значения в коде программы: константы определенного типа, которые находятся в коде в момент запуска. - Числовые: - Целочисленные; - С плавающей точкой; - Строковые; - Символьные; - Логические.
73
Расскажите про 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).