Вопросы 111-120 для новичков и опытных разработчиков
Ответ: Да, клаузулу throws можно изменить при переопределении метода, но необходимо соблюдать определенные правила. Метод подкласса может выбросить то же самое исключение, подкласс этого исключения или не выбросить вообще.
// ✅ Правильно
class Parent {
void method() throws IOException {
// ...
}
}
class Child extends Parent {
@Override
void method() throws FileNotFoundException {
// ✅ FileNotFoundException - подкласс IOException
}
}
// ❌ Неправильно - более широкое исключение
class Child2 extends Parent {
@Override
void method() throws Exception {
// ❌ Exception шире чем IOException - компилятор выдаст ошибку
}
}
Ответ: Да, Java поддерживает виртуальные функции. По умолчанию все функции в Java являются виртуальными и могут быть сделаны невиртуальными с помощью ключевого слова final.
final ключевое слово, вы делаете метод невиртуальным - он решается на основе типа ссылки
class Animal {
void sound() { // Виртуальный метод по умолчанию
System.out.println("Some sound");
}
final void eat() { // Невиртуальный - не может быть переопределен
System.out.println("Eating");
}
}
class Dog extends Animal {
@Override
void sound() { // Переопределяет виртуальный метод
System.out.println("Bark");
}
}
Ответ: Абстракция - это концепция ООП, которая скрывает детали реализации и показывает только существенные особенности объекта. Она позволяет пользователю сосредоточиться на том, что делает объект, а не на том, как он это делает.
Когда вы едите на машине, вы используете руль, педали тормоза и газа, не зная внутреннего устройства двигателя. Это абстракция.
Ответ: Абстрактный класс - это класс, объявленный с использованием ключевого слова abstract, который не может быть инстанцирован (нельзя создать объект напрямую из него). Он используется для предоставления общего базового класса и может содержать как абстрактные, так и конкретные методы.
abstract class Shape {
abstract void draw(); // Абстрактный метод
void display() { // Конкретный метод
System.out.println("This is a shape");
}
}
class Circle extends Shape {
@Override
void draw() {
System.out.println("Drawing circle");
}
}
// Shape shape = new Shape(); // ❌ Ошибка - не может инстанцировать abstract класс
Shape shape = new Circle(); // ✅ Правильно
Ответ: Абстрактный метод используется, когда нужно использовать метод, но вы хотите, чтобы дочерние классы решали его реализацию. В таком случае используются абстрактные методы с родительскими классами.
abstract class Animal {
// Абстрактный метод - каждое животное должно издать свой звук
abstract void sound();
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("Meow");
}
}
Ответ: Если базовый класс реализует интерфейс Serializable, а вы хотите избежать сериализации в подклассе, вы можете определить метод writeObject() и выбросить NotSerializableException.
import java.io.*;
class Parent implements Serializable {
int id = 100;
}
class Child extends Parent {
// Предотвращение сериализации в подклассе
private void writeObject(ObjectOutputStream out)
throws IOException {
throw new NotSerializableException(
"Child class cannot be serialized");
}
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
throw new NotSerializableException(
"Child class cannot be deserialized");
}
}
Ответ: Collection Framework - это единая архитектура в Java, которая предоставляет классы и интерфейсы для эффективного хранения, управления и манипуляции группами объектов. Это предлагает готовые структуры данных и алгоритмы для упрощения работы с данными.
Ответ: Collection Framework предоставляет несколько интерфейсов, которые определяют различные способы хранения и управления данными. Каждый интерфейс служит конкретной цели и имеет несколько классов реализации.
| Интерфейс | Описание | Примеры реализации |
|---|---|---|
| List | Хранит элементы в порядке вставки, позволяет дубликаты | ArrayList, LinkedList |
| Set | Хранит уникальные элементы, не допускает дубликаты | HashSet, LinkedHashSet, TreeSet |
| Queue | Хранит элементы для обработки в определенном порядке (FIFO) | PriorityQueue, ArrayDeque |
| Map | Хранит данные как пары ключ-значение, каждый ключ уникален | HashMap, LinkedHashMap, TreeMap |
Ответ: ArrayList можно синхронизировать двумя способами:
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
// Создание синхронизированного списка
List<String> syncList = Collections.synchronizedList(list);
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("one");
list.add("two");
// CopyOnWriteArrayList - потокобезопасный вариант ArrayList
public static List<T> synchronizedList(List<T> list)
Ответ: ArrayList нужен даже при наличии Vector по ряду причин:
| Характеристика | ArrayList | Vector |
|---|---|---|
| Синхронизация | Не синхронизирован | Синхронизирован |
| Производительность | Быстрее для однопоточных приложений | Медленнее из-за синхронизации |
| Многопоточность | Не поддерживает (требует явной синхронизации) | Встроенная поддержка |
| Безопасность | Безопаснее использовать (явная синхронизация) | Может привести к незаметным ошибкам |
| Рекомендация | Предпочитаемый вариант | Устаревший в Java |