Pogledajte postavku zadatka sa prethodnog termina. U postavci zadatka piše da metoda dajPovrsinu() u klasi GeometrijskiOblik vraća 0. Klase koje nasleđuju ovu klasu posle prepisuju ovu metodu tako da vraćaju površinu za neki konkretan oblik. Znamo kako se računa površina pravougaonika, trougla, … tj. njihove formule za površinu.
Koja je formula za računanje površine za klasu GeometrijskiOblik? Ona ne postoji.
U objektnim jezicima je moguće metode ostaviti i bez implementacije. Takvi metodi se nazivaju apstraktnim i u Javi se deklarišu na sledeći način:
abstract void metod_name(arguments);
Apstraktni metodi nemaju implementaciju, tj. definisano telo. Imaju samo potpis.
Klase u kojima postoje metodi koji su apstraktni se nazivaju apstraktnim klasama i pri njihovom deklarisanju je neophodno, kao i kod metoda, potrebno apstraktnost naglasiti.
abstract class GeometrijskiOblik {
abstract double dajPovrsinu();
}
Apstraktna klasa se ne može instancirati, već se može koristiti samo za referenciranje objekata koji su instance izvedenih klasa. Klase koje se mogu instancirati se nazivaju konkretnim.
Osobine apstraktnih klasa:
Interfejs je “ugovor” kojim se klasa obavezuje da će implementirati metode definisane u interfejsu. U Javi interfejs je referentni tip (kao i klasa).
interface Interfejs {
...
}
Osobine interfejsa:
interface IDeljivo {
boolean jeDeljivo(int n, int k); // <=> public abstract boolean jeDeljivo(int n, int k);
}
interface GeometrijskaFigura {
double PI = 3.14; // <=> public static final double PI = 3.14;
double dajPovrsinu(); // <=> public abstract double dajPovrsinu();
}
interface IDeljivo {
boolean jeDeljivo(int n, int k); // <=> public abstract boolean jeDeljivo(int n, int k);
}
class Test {
public static void main(String[] args) {
IDeljivo d = new IDeljivo(); // NIJE MOGUCE
}
}
Klase implementiraju interfejse. Nakon navođenja imena neke podklase i eventualnog definisanja da je izvedena iz neke nadklase, mogu se opciono implemetirati (implements) jedan ili više interfejsa (simulacija višestrukog nasleđivanja).
class NekaKlasa extends Object implements IDeljivo, GeometrijskaFigura, ... {
}
/// ili
class NekaKlasa implements IDeljivo, GeometrijskaFigura, ... {
}