OBJEKTINIS PROGRAMAVIMAS
Java abstrakcija
Abstrakcija paslepia nereikalingas realizacijos detales ir parodo tik esmines objekto galimybes. Java kalboje ją galima įgyvendinti abstrakčiomis klasėmis, abstrakčiais metodais ir sąsajomis.
Ką suteikia abstrakcija?
- apibrėžia, ką susiję objektai privalo mokėti atlikti;
- leidžia paslėpti, kaip konkretus veiksmas įgyvendintas;
- sutelkiamas bendras poklasių kodas;
- mažėja priklausomybė nuo konkrečių realizacijų;
- lengviau naudoti polimorfizmą ir pridėti naujus objektų tipus.
abstract klasė ir metodas
abstract yra ne prieigos modifikatorius. Juo galima pažymėti klasę arba metodą:
abstract class Leidinys {
public abstract void rodytiTipa();
public void rodytiBusena() {
System.out.println("Leidinį galima pasiskolinti");
}
}Leidinysyra bendra sąvoka, apimanti knygas, žurnalus ir kitus leidinius.abstract classreiškia, kad ši klasė skirta paveldėti, o ne tiesioginiams objektams kurti.- Abstraktus metodas
rodytiTipa()nurodo, ką kiekvienas konkretus leidinys privalės atlikti. - Įprastas metodas
rodytiBusena()jau turi kodą, todėl poklasiai gali jį paveldėti nepakeistą. - Šis kodas tik deklaruoja klasę, todėl konsolėje dar nieko neišveda.
| Elementas | Savybė |
|---|---|
| Abstrakti klasė | Negalima tiesiogiai kurti jos objektų; ji paveldima |
| Abstraktus metodas | Neturi metodo kūno; realizaciją pateikia konkretus poklasis |
| Įprastas metodas | Turi kūną ir gali būti paveldėtas toks, koks yra |
Abstrakčios klasės objekto sukurti negalima
Leidinys leidinys = new Leidinys();
// Klaida: abstrakčios klasės objekto sukurti negalimaerror: Leidinys is abstract; cannot be instantiated
Leidinys aprašo tik bendrą idėją. Norint sukurti objektą, pirmiausia reikia konkretaus poklasio, pavyzdžiui, Knyga.
Abstraktaus metodo realizavimas
Konkretus poklasis paveldi abstrakčią klasę ir privalo realizuoti jos abstrakčius metodus:
abstract class Leidinys {
public abstract void rodytiTipa();
public void rodytiBusena() {
System.out.println("Leidinį galima pasiskolinti");
}
}
class Knyga extends Leidinys {
@Override
public void rodytiTipa() {
System.out.println("Tai yra knyga");
}
}Knyga extends Leidinyssukuria konkretų leidinio poklasį.- Klasė
Knygaprivalo parašyti abstraktaus metodorodytiTipa()kūną. - Metodo kūnas nusprendžia, ką programa atliks iškvietus šį metodą knygos objektui.
- Šiame bloke metodas dar nekviečiamas, todėl konsolės rezultato nėra.
Jei konkretus poklasis neįgyvendina visų paveldėtų abstrakčių metodų, jis pats taip pat turi būti pažymėtas abstract.
Konkretaus objekto naudojimas
public class Main {
public static void main(String[] args) {
Knyga knyga = new Knyga();
knyga.rodytiTipa();
knyga.rodytiBusena();
}
}Tai yra knyga
Leidinį galima pasiskolinti
new Knyga()leidžiama, nesKnygayra konkreti, o ne abstrakti klasė.rodytiTipa()vykdo klasėjeKnygaparašytą realizaciją.rodytiBusena()vykdo iš abstrakčios klasės paveldėtą paruoštą metodą.
Abstrakti klasė gali turėti konstruktorių
Nors abstrakčios klasės objekto tiesiogiai sukurti negalima, jos konstruktorius inicializuoja bendrą poklasių būseną:
abstract class Leidinys {
protected String pavadinimas;
Leidinys(String pavadinimas) {
this.pavadinimas = pavadinimas;
}
public abstract void rodytiInformacija();
}
class Zurnalas extends Leidinys {
Zurnalas(String pavadinimas) {
super(pavadinimas);
}
@Override
public void rodytiInformacija() {
System.out.println("Žurnalas: " + pavadinimas);
}
public static void main(String[] args) {
Zurnalas zurnalas = new Zurnalas("Mokslas šiandien");
zurnalas.rodytiInformacija();
}
}Žurnalas: Mokslas šiandien
- Kuriant
Zurnalasobjektą jo konstruktorius gauna pavadinimą. super(pavadinimas)perduoda reikšmę abstrakčios klasės konstruktoriui.Leidinyskonstruktorius išsaugo bendrą laukąpavadinimas.- Poklasio metodas panaudoja paveldėtą pavadinimą ir išveda informaciją.
Abstrakcija ir polimorfizmas
Abstrakti klasė gali būti bendras skirtingų konkrečių objektų tipas:
abstract class Leidinys {
public abstract void rodytiTipa();
}
class Knyga extends Leidinys {
public void rodytiTipa() {
System.out.println("Tai yra knyga");
}
}
class Zurnalas extends Leidinys {
public void rodytiTipa() {
System.out.println("Tai yra žurnalas");
}
}
public class Main {
public static void main(String[] args) {
Leidinys[] leidiniai = {
new Knyga(),
new Zurnalas()
};
for (Leidinys leidinys : leidiniai) {
leidinys.rodytiTipa();
}
}
}Tai yra knyga
Tai yra žurnalas
- Masyvo tipas yra bendras
Leidinys, todėl jame galima laikyti skirtingus jo poklasius. - Ciklas žino tik abstrakčioje klasėje apibrėžtą sutartį – metodą
rodytiTipa(). - Kiekvienas tikras objektas pateikia savo šio metodo realizaciją.
Kada rinktis abstrakčią klasę?
- Kai susijusiems poklasiams reikia bendrų laukų arba konstruktoriaus.
- Kai dalis metodų turi bendrą realizaciją, o dalį privalo pateikti poklasiai.
- Kai norima uždrausti kurti pernelyg bendros bazinės klasės objektus.
- Kai klasės sudaro aiškią paveldėjimo hierarchiją.
Sąsajos ypač naudingos bendrai elgsenos sutarčiai tarp klasių, kurios nebūtinai dalijasi bendra būsena.

