7Koja četiri principa OOP-a (Object-Oriented Programming) Java podržava?
Java podržava enkapsulaciju, apstrakciju, nasleđivanje i polimorfizam. Enkapsulacija skriva unutrašnje stanje iza javnog API-ja. Apstrakcija se fokusira na suštinsko ponašanje. Nasleđivanje kreira novi tip na osnovu postojećeg tipa. Polimorfizam omogućava kodu da radi sa različitim implementacijama kroz zajednički ugovor. U praksi, kompoziciji se često daje prednost u odnosu na nasleđivanje jer stvara manju spregnutost.
interface PaymentService {
void pay(BigDecimal amount);
}
class CardPaymentService implements PaymentService {
@Override
public void pay(BigDecimal amount) {
// payment implementation
}
}
Pokušajte da odgovorite na ovo pitanje sa AI trenerom
8Koja je razlika između preopterećivanja metoda (method overloading) i nadjačavanja metoda (method overriding)?
Preopterećivanje (overloading) znači da više metoda ima isto ime, ali različite parametre; kompilator bira metodu na osnovu statičkih tipova argumenata. Nadjačavanje (overriding) znači da potklasa zamenjuje implementaciju instance metode iz roditeljske klase; dinamičko dispečiranje u vreme izvršavanja (runtime dispatch) bira metodu na osnovu stvarnog tipa objekta. Statičke metode se sakrivaju, a ne nadjačavaju, dok se privatne metode ne nadjačavaju jer se ne nasleđuju kao dostupni članovi.
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"); }
}
Pokušajte da odgovorite na ovo pitanje sa AI trenerom
9Koja je razlika između interfejsa i apstraktne klase?
Interfejs definiše ugovor i može sadržati apstraktne metode, podrazumevane (default) metode, statičke metode, konstante i privatne pomoćne metode. Apstraktna klasa dodatno može imati stanje instance, konstruktore, zaštićena (`protected`) polja, deljenu implementaciju i apstraktne ili konkretne metode. Klasa može naslediti samo jednu klasu, ali može implementirati više interfejsa. Koristite interfejs za nezavisan ugovor, a apstraktnu klasu za usko povezane tipove sa deljenom implementacijom i stanjem.
interface Repository<T> {
Optional<T> findById(long id);
}
Pokušajte da odgovorite na ovo pitanje sa AI trenerom
10Šta označava ključna reč final?
Promenljivoj označenoj sa `final` vrednost se može dodeliti samo jednom, ali `final` referenca ne čini referencirani objekat nepromenljivim. Metoda označena sa `final` ne može se redefinisati. Klasa označena sa `final` ne može se nasleđivati. Ključna reč `final` iskazuje nameru i ograničava izmenu referenci ili nasleđivanje, ali sama po sebi ne pruža potpun model nepromenljivosti niti bezbednost u višenitnom radu.
final int maxAttempts = 3;
final List<String> names = new ArrayList<>();
names.add("Alice"); // allowed
public final void validate() {}
public final class Token {}
Pokušajte da odgovorite na ovo pitanje sa AI trenerom
11Šta su record tipovi u programskom jeziku Java?
`Record` je sažeta sintaksa za nepromenljive nosioce podataka. Kompajler generiše privatna `final` polja, konstruktor, pristupne metode, `equals`, `hashCode` i `toString`. `Record` tipovi su korisni za DTO (Data Transfer Object) objekte, objekte vrednosti i rezultate metoda. Oni nisu zamena za svaki domenski entitet: validacija se može dodati u kompaktnom konstruktoru, ali složeno promenljivo ponašanje, lenjo učitavanje i modeli zasnovani na nasleđivanju obično ne odgovaraju `record` tipovima.
public record User(long id, String name) {}
public record Order(List<String> items) {
public Order {
items = List.copyOf(items);
}
}
Pokušajte da odgovorite na ovo pitanje sa AI trenerom
12Kako se kreira nepromenljivi objekat u programskom jeziku Java?
Označite klasu kao `final` ili pažljivo ograničite nasleđivanje, definišite polja kao `private final`, izbegavajte setere i izvršite validaciju unutar konstruktora. Za promenljive ulazne podatke kreirajte defanzivne kopije i vraćajte kopije ili nepromenljive prikaze. Duboka nepromenljivost zahteva da i celokupno ugnježdeno stanje bude nepromenljivo. Polja deklarisana kao `final` pomažu pri bezbednom objavljivanju, ali objekat i dalje može biti logički promenljiv ako izlaže promenljivu kolekciju ili promenljivi ugnježdeni objekat.
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;
}
}
Pokušajte da odgovorite na ovo pitanje sa AI trenerom