7Кои четири принципа на ООП (Обектно-ориентирано програмиране) поддържа Java?
Java поддържа капсулация, абстракция, наследяване и полиморфизъм. Капсулацията скрива вътрешното състояние зад публичен API. Абстракцията се фокусира върху същественото поведение. Наследяването създава нов тип въз основа на съществуващ тип. Полиморфизмът позволява на кода да работи с различни имплементации чрез споделен договор. На практика композицията често е за предпочитане пред наследяването, тъй като създава по-слаба свързаност.
interface PaymentService {
void pay(BigDecimal amount);
}
class CardPaymentService implements PaymentService {
@Override
public void pay(BigDecimal amount) {
// payment implementation
}
}
Опитайте да отговорите на този въпрос с треньор с ИИ
8Каква е разликата между претоварване (overloading) и припокриване (overriding) на методи?
Претоварването означава, че няколко метода имат едно и също име, но различни параметри; компилаторът избира метода въз основа на статичните типове на аргументите. Припокриването означава, че даден подклас заменя реализацията на метод на инстанция от родителския клас; изборът на метод по време на изпълнение се базира на действителния тип на обекта. Статичните методи се скриват, а не се припокриват, а частните методи не се припокриват, тъй като не се наследяват като достъпни членове.
void send(String message) {}
void send(String message, int priority) {}
class Animal {
void speak() { System.out.println("Animal"); }
}
class Dog extends Animal {
@Override
void speak() { System.out.println("Dog"); }
}
Опитайте да отговорите на този въпрос с треньор с ИИ
9Каква е разликата между интерфейс и абстрактен клас?
Интерфейсът дефинира договор и може да съдържа абстрактни методи, методи по подразбиране, статични методи, константи и помощни частни методи. Абстрактният клас може допълнително да има състояние на инстанцията, конструктори, защитени полета, споделена имплементация и абстрактни или конкретни методи. Един клас може да наследи само един клас, но може да имплементира множество интерфейси. Използвайте интерфейс за независим договор, а абстрактен клас – за тясно свързани типове със споделена имплементация и състояние.
interface Repository<T> {
Optional<T> findById(long id);
}
Опитайте да отговорите на този въпрос с треньор с ИИ
10Какво означава ключовата дума final?
На променлива final може да бъде присвоена стойност само веднъж, но референция final не прави реферирания обект неизменяем. Метод final не може да бъде препокрит. Клас final не може да бъде наследен. Ключовата дума final съобщава намерението и ограничава промените в референциите или наследяването, но само по себе си не осигурява пълен модел за неизменяемост или безопасност при работа с нишки.
final int maxAttempts = 3;
final List<String> names = new ArrayList<>();
names.add("Alice"); // allowed
public final void validate() {}
public final class Token {}
Опитайте да отговорите на този въпрос с треньор с ИИ
11Какво представляват `records` в Java?
`record` е компактен синтаксис за неизменяеми носители на данни. Компилаторът генерира `private final` полета, конструктор, методи за достъп, `equals`, `hashCode` и `toString`. `records` са полезни за DTO (Data Transfer Object), обекти-стойности и резултати от методи. Те не са заместител на всяка домейн същност: в компактен конструктор може да се добави валидация, но сложно изменяемо поведение, мързеливо зареждане и модели, базирани на наследяване, обикновено не са подходящи за `records`.
public record User(long id, String name) {}
public record Order(List<String> items) {
public Order {
items = List.copyOf(items);
}
}
Опитайте да отговорите на този въпрос с треньор с ИИ
12Как се създава неизменяем обект в Java?
Направете класа `final` или внимателно ограничете наследяването, направете полетата `private final`, избягвайте сетъри и извършвайте валидация в конструктора. За изменяеми входни данни създавайте защитни копия и връщайте копия или немодифицируеми изгледи. Дълбоката неизменяемост изисква всички вложени състояния също да бъдат неизменяеми. Полетата `final` помагат за безопасното публикуване, но един обект все още може да бъде логически изменяем, ако излага изменяема колекция или изменяем вложен обект.
public final class User {
private final String name;
private final List<String> roles;
public User(String name, List<String> roles) {
this.name = name;
this.roles = List.copyOf(roles);
}
public List<String> getRoles() {
return roles;
}
}
Опитайте да отговорите на този въпрос с треньор с ИИ