Главная страница

ОглавлениеCore


Скачать 1.53 Mb.
НазваниеОглавлениеCore
Дата17.05.2023
Размер1.53 Mb.
Формат файлаpdf
Имя файлаpolnaya_metodichka (1).pdf
ТипДокументы
#1138113
страница7 из 25
1   2   3   4   5   6   7   8   9   10   ...   25
безопасности
приложения. Например, имя пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так как строка неизменяемая, ее
значение не может быть изменено, в противном случае злоумышленник может изменить значение ссылки и вызвать проблемы в безопасности приложения.

Неизменяемость позволяет избежать синхронизации: строки безопасны для
многопоточности, и один экземпляр строки может быть совместно использован различными потоками.

Строки используются classloader, и неизменность обеспечивает правильность
загрузки класса.


Поскольку строка неизменяемая, ее hashCode() кешируется в момент создания и нет необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в HashMap, т. к. его обработка происходит быстрее.
Почему строка является популярным ключом в HashMap в Java?
Поскольку строки неизменяемы, их хеш-код вычисляется и кешируется в момент создания,
не требуя повторного пересчета при дальнейшем использовании. Поэтому в качестве ключа
HashMap они будут обрабатываться быстрее.
Что делает метод intern() в классе String?
Метод intern() используется для сохранения строки в пуле строк или получения ссылки, если такая строка уже находится в пуле.
Можно ли использовать строки в конструкции switch?
Да, начиная с Java 7 в операторе switch можно использовать строки, ранние версии Java не поддерживают этого. При этом:
● участвующие строки чувствительны к регистру;
● используется метод equals() для сравнения полученного значения со значениями case, поэтому во избежание NullPointerException стоит предусмотреть проверку на
null;
● согласно документации Java 7 для строк в switch компилятор Java формирует более эффективный байт-код для строк в конструкции switch, чем для сцепленных условий if-else.
Какая основная разница между String, StringBuffer, StringBuilder?
Класс String является неизменяемым (immutable) – модифицировать объект такого класса нельзя, можно лишь заменить его созданием нового экземпляра.
Класс StringBuffer изменяемый – использовать StringBuffer следует тогда, когда необходимо часто модифицировать содержимое.
Класс StringBuilder был добавлен в Java 5, он во всем идентичен классу StringBuffer за исключением того, что он не синхронизирован и поэтому его методы выполняются
значительно быстрей.
Что такое StringJoiner?
Класс StringJoiner используется, чтобы создать последовательность строк, разделенных разделителем с возможностью присоединить к полученной строке префикс и суффикс:
StringJoiner joiner = new StringJoiner(".", "prefix-", "-suffix");
for (String s : "Hello the brave world".split(" ")) {
joiner.add(s);
}
System.out.println(joiner); //prefix-Hello.the.brave.world-suffix

Существуют ли в Java многомерные массивы?
Да (спорно). Тип данных массива – ссылочный. Массив подразумевает непрерывное хранение в памяти, все вложенные массивы будут одинаковыми, под них выделена одинаковая память, это структура, под которую выделяется объем памяти, поэтому нужно знать заранее, какой объем будет у массива.
Какими значениями инициируются переменные по умолчанию?

byte, short, int – 0;

long – 0L;

float – 0.0f;

double – 0.0d;

char – '\u0000' (символ конца строки);

boolean – false (зависит от реализации, можно установить true по умолчанию);

объекты – null (это ссылка никуда не указывает, спецуказатель);

локальные (в методе) переменные не имеют значений по умолчанию, их имеют поля класса;

не static-поле класса будет инициализировано после того, как будет создан объект этого класса, а static-поле будет инициализировано тогда, когда класс будет загружен JVM;

сколько весит ссылка в Java: на 32 бит – 4 байта, на 64 бит – 8 байт (но вроде как есть 4 байта) (железо + JVM);

заголовок объекта – 1 бит.
Что такое сигнатура метода?
Это имя метода плюс параметры (порядок параметров имеет значение из-за множественной передачи данных через троеточие, которое должно располагаться последним). В сигнатуру метода не входит возвращаемое значение, а также бросаемые им исключения.
Сигнатура метода в сочетании с типом возвращаемого значения и бросаемыми исключениями называется контрактом метода.
От модификатора до выбрасываемого исключения – это контракт.
Расскажите про метод main
Является, как правило, точкой входа в программу и вызывается JVM.
Как только заканчивается выполнение метода main(), так сразу же завершается работа
самой программы.
static – чтобы JVM смогла загрузить его во время компиляции.
public static void и сигнатура – обязательное декларирование.
Мэйнов может быть много и может не быть вообще.
Может быть перегружен.

Каким образом переменные передаются в методы, по значению или по
ссылке?
В Java параметры всегда передаются только по значению, что определяется как
«скопировать значение и передать копию». С примитивами это будет копия содержимого. Со ссылками – тоже копия содержимого, т. е. копия ссылки. При этом внутренние члены ссылочных типов через такую копию изменить возможно, а вот саму ссылку, указывающую на экземпляр – нет.
Массив – это объект.
Если передать массив и изменить его в методе, то будет ли изменяться
текущий массив?
Да, текущий массив изменится тоже.
Какие типы классов есть в Java?

Top level class (обычный класс):
◦ Abstract class (абстрактный класс);
◦ Final class (финализированный класс).

Interfaces (интерфейс).

Enum (перечисление).

Nested class (вложенный класс):
◦ Static nested class (статический вложенный класс);
◦ Member inner class (простой внутренний класс);
◦ Local inner class (локальный класс);
◦ Anonymous inner class (анонимный класс).
Расскажите про вложенные классы. В каких случаях они применяются?
Класс называется вложенным (Nested class), если он определен внутри другого класса.
Вложенный класс должен создаваться только для того, чтобы обслуживать обрамляющий его класс. Если вложенный класс оказывается полезен в каком-либо ином контексте, он должен стать классом верхнего уровня. Вложенные классы имеют доступ ко всем (в том числе приватным) полям и методам внешнего класса, но не наоборот. Из-за этого разрешения использование вложенных классов приводит к некоторому нарушению инкапсуляции.
Вложенные классы делятся на две категории: статические и нестатические. Объявленные вложенные классы static называются статическими вложенными классами. Нестатические вложенные классы называются внутренними классами.
Внутренние классы ассоциируются не с внешним классом, а с экземпляром внешнего.
1. Статические вложенные классы (Static nested classes)

есть возможность обращения к внутренним статическим полям и методам класса- обертки;

обрамляющий класс не имеет доступа к статическим полям;


из статического вложенного класса не имеем доступ к статическим полям внешнего класса.
2. Вложенные классы бывают двух видов (Inner или Non-static Nested)

есть возможность обращения к внутренним полям и методам класса-обертки;

не может иметь статических объявлений;

внутри такого класса нельзя объявить перечисления;

если нужно явно получить this внешнего класса – OuterClass.this.
3. Локальные классы

видны только в пределах блока, в котором объявлены;

не могут быть объявлены как private/public/protected или static (по этой причине интерфейсы нельзя объявить локально);

не могут иметь внутри себя статических объявлений (полей, методов, классов), но могут иметь константы (static final);

имеют доступ к полям и методам обрамляющего класса;

можно обращаться к локальным переменным и параметрам метода, если они объявлены с модификатором final или являются effectively final.
4. Анонимные классы

локальный класс без имени;

создается, чтобы его сразу же применить.
Вложенный класс – это итератор внутри коллекции.
Если связь между объектом внутреннего класса и объектом внешнего класса не нужна,
можно сделать внутренний класс статическим (static). Такой класс называют вложенным
(nested).
Применение статического внутреннего класса означает следующее:

для создания объекта статического внутреннего класса не нужен объект внешнего класса;

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

нестатический: если вложенный класс должен быть виден за пределами одного метода или он слишком длинный для того, чтобы его можно было удобно разместить в границах одного метода и если каждому экземпляру такого класса необходима ссылка на включающий его экземпляр;

статический: если ссылка на обрамляющий класс не требуется;

локальный: если класс необходим только внутри какого-то метода и требуется создавать экземпляры этого класса только в этом методе;

анонимный: если к тому же применение класса сводится к использованию лишь в одном месте и уже существует тип, характеризующий этот класс.

Что такое «статический класс»?
Это вложенный класс, объявленный с использованием ключевого слова static. К классам верхнего уровня модификатор static неприменим.
Какие существуют особенности использования вложенных классов:
статических и внутренних? В чем заключается разница между ними?
Вложенные классы могут обращаться ко всем членам обрамляющего класса, в том числе и приватным.
Для создания объекта статического вложенного класса объект внешнего класса не требуется.
Из объекта статического вложенного класса нельзя обращаться к не статическим членам обрамляющего класса напрямую, а только через ссылку на экземпляр внешнего класса.
Обычные вложенные классы не могут содержать статических методов, блоков инициализации и классов. Статические вложенные классы могут.
В объекте обычного вложенного класса хранится ссылка на объект внешнего класса. Внутри статического такой ссылки нет. Доступ к экземпляру обрамляющего класса осуществляется через указание .this после его имени. Например: Outer.this.
Что такое «локальный класс»? Каковы его особенности?
Local inner class (локальный класс) – это вложенный класс, который может быть декларирован в любом блоке, в котором разрешается декларировать переменные. Как и простые внутренние классы (member inner class), локальные классы имеют имена и могут использоваться многократно. Как и анонимные классы, они имеют окружающий их экземпляр только тогда, когда применяются в нестатическом контексте.
Локальные классы имеют следующие особенности:

видны только в пределах блока, в котором объявлены;

не могут быть объявлены как private/public/protected или static;

не могут иметь внутри себя статических объявлений (полей, методов, классов);

имеют доступ к полям и методам обрамляющего класса;

могут обращаться к локальным переменным и параметрам метода, если они объявлены с модификатором final.
Что такое «анонимные классы»? Где они применяются?
Это вложенный локальный класс без имени, который разрешено декларировать в любом месте обрамляющего класса, разрешающем размещение выражений. Создание экземпляра анонимного класса происходит одновременно с его объявлением. В зависимости от местоположения анонимный класс ведет себя как статический либо как нестатический вложенный класс – в нестатическом контексте появляется окружающий его экземпляр.
Анонимные классы имеют несколько ограничений:

использование разрешено только в одном месте программы – месте его создания;

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


реализует лишь методы своего интерфейса или суперкласса, т. е. не может объявлять каких-либо новых методов, так как для доступа к ним нет поименованного типа.
Анонимные классы обычно применяются для:

создания объекта функции (function object), например, реализация интерфейса
Comparator;

создания объекта процесса (process object), такого как экземпляры классов
Thread, Runnable и подобных;

в статическом методе генерации;

инициализации открытого статического поля final, которое соответствует сложному перечислению типов, когда для каждого экземпляра в перечислении требуется отдельный подкласс.
Каким образом из вложенного класса получить доступ к полю внешнего
класса?
Статический вложенный класс имеет прямой доступ только к статическим полям обрамляющего класса.
Простой внутренний класс может обратиться к любому полю внешнего класса напрямую. В
случае, если у вложенного класса уже существует поле с таким же литералом, то обращаться к такому полю следует через ссылку на его экземпляр. Например: Outer.this.field.
Что такое перечисления (enum)?
Перечисления представляют набор логически связанных констант.
Перечисление фактически представляет новый класс, поэтому можно определить переменную данного типа и использовать ее.
Перечисления, как и обычные классы, могут определять конструкторы, поля и методы.
При этом конструктор по умолчанию приватный. Также можно определять методы для отдельных констант.
Можно создавать публичные геттеры\сеттеры. Они создаются в момент компиляции.
Методы:

valueOf() возвращает конкретный элемент;

ordinal() возвращает порядковый номер определенной константы (нумерация начинается с 0);

values() возвращает массив всех констант перечисления;

name() отличается от toString тем, что второй можно переопределить.
В Енам реализация equals() через ==, поэтому можно и через equals(), и через ==.
Еnum имеет ряд преимуществ при использовании в сравнении с static final int.
Главным отличием является то, что, используя enum, можно проверить тип данных.
Недостатки:

не применимы операторы >, <, >=, <=;


требует больше памяти для хранения, чем обычная константа.
Нужны для ограничения области допустимых значений: например, времена года, дни недели.
Особенности Enum-классов

Конструктор всегда private или default.

Могут имплементировать интерфейсы.

Не могут наследовать класс.

Можно переопределить toString().

Нет public конструктора, поэтому нельзя создать экземпляр вне Enum.

При equals() выполняется ==.

ordinal() возвращает порядок элементов.

Может использоваться в TreeSet и TreeMap, т. к. Enum имплементирует
Comparable.

compareTo() имитирует порядок элементов, предоставляемый ordinal().

Можно использовать в Switch Case.

values() возвращает массив всех констант.

Легко создать потокобезопасный singleton без double check volatile переменных.
Ромбовидное наследование
Ромбовидное наследование (англ. diamond inheritance) – ситуация в объектно- ориентированных языках программирования с поддержкой множественного наследования,
когда два класса B и C наследуют от A, а класс D наследует от обоих классов B и C. При этой схеме наследования может возникнуть неоднозначность: если объект класса D
вызывает метод, определенный в классе A (и этот метод не был переопределен в классе D),
а классы B и C по-своему переопределили этот метод, то от какого класса его наследовать:
B или C?
Как проблема ромбовидного наследования решена в java?
В Java нет поддержки множественного наследования классов.
Предположим, что SuperClass – это абстрактный класс, описывающий некоторый метод, а классы ClassA и ClassB – обычные классы наследники SuperClass, а класс ClassC
наследуется от ClassA и ClassB одновременно. Вызов метода родительского класса приведет к неопределенности, так как компилятор не знает о том, метод какого именно суперкласса должен быть вызван. Это и есть основная причина, почему в Java нет поддержки множественного наследования классов. Интерфейсы – это только резервирование/описание метода, а реализация самого метода будет в конкретном классе,
реализующем эти интерфейсы, таким образом исключается неопределенность при множественном наследовании интерфейсов. В случае, если вызывается default-метод из интерфейса его обязательно надо будет переопределить.

Дайте определение понятию «конструктор»
Конструктор – это специальный метод, у которого отсутствует возвращаемый тип и который имеет то же имя, что и класс, в котором он используется. Конструктор вызывается при создании нового объекта класса и определяет действия, необходимые для его инициализации.
Что такое конструктор по умолчанию?
Если у какого-либо класса не определить конструктор, то компилятор сгенерирует конструктор без аргументов – так называемый «конструктор по умолчанию».
Если у класса уже определен какой-либо конструктор, то конструктор по умолчанию создан не будет и, если он необходим, его нужно описывать явно.
В классе-наследнике при отсутствии переопределенного конструктора будет использован конструктор родителя.
Могут ли быть приватные конструкторы? Для чего они нужны?
Да, могут. Приватный конструктор запрещает создание экземпляра класса вне методов
самого класса.
Финальные нет.
Нужен для реализации паттернов, например, singleton.
Приватный конструктор запрещает вызывать конструктор другим классам извне.
У абстрактного класса есть приватный конструктор (абстрактный класс позволяет описать некоторое состояние объекта).
1   2   3   4   5   6   7   8   9   10   ...   25


написать администратору сайта