Gyakorlati alapok III.
Az osztály további tulajdonságai
Az előző, Az absztrakció mélységei: az osztály fogalma című fejezetben már alapszinten részleteztük az osztály legfontosabb, modellező tulajdonságát. Természetesen nem minden osztály feladata a valóság adott szintű leképezése, sok-sok osztály más, szintén elvont, de nem modellező feladatot lát el. Ilyen például a Javán belül az Integer osztály (java.lang.Integer), amely egy egyszerű adattípushoz (Numerikus egész című fejezet) biztosít sokféle, magasabb szintű, legtöbbször nagyon praktikus műveletet.
Tapasztaltabbak a fentiek alapján már rájöhettek arra is, hogy az osztály a legkisebb önállóan működő egység.
Nem véletlen tehát, hogy a main() főprogram, amelyet a JVM programfuttatáskor legelőször keres, egy, ebben az esetben szintén Main néven illetett osztályon belül helyezkedik el (Egy üres Java-projekt létrehozása című fejezet):
public class Main {
public static void main(String[] args) {
}
}
A pontosság kedvéért itt kell megjegyeznünk, hogy a Main osztálynevet voltaképpen mi adtuk meg a projekt önálló létrehozásakor. Természetesen bármely konvencionális osztálynév megfelelő ide. Az egyszerű átnevezés azonban nem fog működni, mert a Java-tárolófájlok egyikének neve továbbra is Main lesz. A megoldás a refaktorálás.
Az osztályok deklarációi azonban csak tervrajzok. A tervrajz nyilvánvalóan nem azonos a felépült házzal, annak pusztán pontos modellje (ha ugyan a kőműves el nem rontja a házépítést). Ahhoz, hogy "élő, lélegző", a műveleti memóriában azonnal futtatható kódokká váljanak, szakszóval illetve példányosítani kell őket. Ez legtöbbször a new parancs kiadásával történik. Például:
Munkavallalo mv = new Munkavallalo();
A példányosítás után az osztályokat már objektumoknak hívjuk. Tehát a Munkavallalo() tervrajza alapján keletkezett objektum az mv lesz. A new parancs lefoglalta a szükséges mennyiségű memória-tárterületet, az mv pedig -mint egyfajta referencia-, a memóriában közvetlenül rámutat magára az objektumra. Ezután hozzáférhetünk az objektummá lett osztályok változóihoz, műveleteihez, ha ez a hozzáférés valamilyen módon nincsen korlátozva (A hozzáférés-módosítók című fejezet). Nézzünk a példányosításra egy egyszerű, de nem futtatható Java-példát!
public class Munkavallalo{
String keresztNev;
String vezetekNev;
String anyaNev;
ellenorzoMetodus1(){
}
ellenorzoMetodus2(){
}
}
public class Main {
public static void main(String[] args) {
Munkavallalo mv = new
Munkavallalo();
mv.keresztNev = "Janos";
mv.vezetekNev = "Kovacs";
mv.fizetes = 120000;
mv.ellenorzoMetodus1();
mv.ellenorzoMetodus2();
...
}
}
Az osztály tehát zárt szerkezetével egybekapcsolja a valamilyen szempont alapján összefüggő adatokat és a rajta elvégezhető műveleteket, sőt a hozzáférés korlátozásával egységbe is zárja, ezáltal pedig elrejtheti a többi kód (a külvilág) elől. Ezen lehetőségek képviselik leginkább az objektumorientált programozás alapelveit (amelyeket most azt hiszem meg is értettünk):
-
adatabsztrakció (modellezés),
-
egységbezárás (funkcionális szegmentálás),
-
adatelrejtés (hozzáférések korlátozása).
Azonban az osztálynak van egy további, szintén nagyon fontos sajátossága. Az osztályok csupán tervrajzok, amelyekből elméletileg bármennyi objektum felépíthető.
Hasonló ez az épületek tervrajzaihoz: egyetlen épülettípus tervrajzából aztán egész városok felépíthetők.
Ám az osztályok újrahasznosíthatósága ezzel még nem ér véget. Az öröklődés bevezetésével arra is van lehetőségünk, hogy szülőosztályokból gyermekosztályokat hozzunk létre, amelyek a szülő tulajdonságait egy az egyben öröklik vagy képesek azokat kiegészíteni, sőt módosítani. E módszer segítségével rengeteg összetett vagy egyedi tulajdonsággal rendelkező objektumot, sőt objektumcsaládot lehet létrehozni, amelyek egyetlen alaposztályra épülnek, ám közben egyéni tulajdonságokkal is rendelkeznek. Az öröklődéssel a későbbiekben fogunk foglalkozni.