Jelenlegi hely

2.3. Az osztály

A valódi világban gyakran sok objektummal találkozunk ugyanabból a fajtából. Például a biciklink nagyon sok más biciklire jelentősen hasonlít. Az objektumorientált szóhasználatban azt mondjuk, hogy egy konkrét bicikli a biciklik osztályának egy példánya. A biciklik rendelkeznek állapottal (aktuális sebességfokozat, fordulatszám stb.) és viselkedéssel (sebességváltás, fékezés). Ennek ellenére minden bicikli konkrét állapota független az összes többi bicikli állapotától.

UML osztálydiagram

Osztályozásnak nevezzük azt a folyamatot, amelynek során a hasonló objektumokat közös csoportokba, más néven osztályokba soroljuk.

Amikor a biciklik készülnek, a gyártók nyereséget szeretnének előállítani, ezért a biciklik nagy mennyiségben, közös tervrajz alapján sorozatgyártásban készülnek. Nagyon rossz lenne a hatásfok, ha minden biciklihez egyedi tervrajzot kellene készíteni.

Az objektumorientált programokban is hasonló a helyzet: közös tervezésre ad lehetőséget, hogy sok objektum hasonló jellemzőkkel rendelkezik: téglalapok, alkalmazottak, videofelvételek, stb. A kerékpárgyártókhoz hasonlóan nekünk is előnyös az, ha sok hasonló objektumot közös tervrajz alapján készíthetünk el. Az objektumok tervrajzait hívjuk osztályoknak.

Az osztály bizonyos fajta objektumok közös változóit és metódusait leíró tervrajz.

A bicikli osztály legszükségesebb példányváltozói az aktuális sebesség és a sebességfokozat lehetnek. Az osztály tartalmazza a példánymetódusokat is: a sebességváltást és a fékezést, ahogy a következő UML osztálydiagramon (Class diagram) látszik:

A következő kód az így megtervezett osztály kódját tartalmazza:

class Bicycle {
       int cadence = 0;
       int speed = 0;
       int gear = 1;
       void changeCadence(int newValue) {
            cadence = newValue;
       }
       void changeGear(int newValue) {
            gear = newValue;
       }
       void speedUp(int increment) {
            speed = speed + increment;  
       }
       void applyBrakes(int decrement) {
            speed = speed – decrement;
       }
       void printStates() {
            System.out.println("cadence:"+cadence+" speed:"+speed+" gear:"+gear);
       }
}

Miután létrehoztuk a Bicikli osztályt, az osztály alapján akármennyi bicikli objektumot létre tudunk hozni. Amikor példányosítunk egy osztályból, a futtatórendszer elegendő memóriát foglal az objektum példányváltozóinak. Minden példány kap egy másolatot a definiált változókról:

Nézzük meg egy bicikliket példányosító kódot:

class BicycleDemo {
     public static void main(String[] args) {
          // Create two different Bicycle objects
          Bicycle bike1 = new Bicycle();
          Bicycle bike2 = new Bicycle();
          // Invoke methods on those objects
          bike1.changeCadence(50);
          bike1.speedUp(10);
          bike1.changeGear(2);
          bike1.printStates();
          bike2.changeCadence(50);
          bike2.speedUp(10);
          bike2.changeGear(2);
          bike2.changeCadence(40);
          bike2.speedUp(10);
          bike2.changeGear(3);
          bike2.printStates();
     }
}

A példányváltozók mellett az osztályok definiálhatnak osztályváltozókat is. Az osztályváltozók az összes objektumpéldány számára megosztott információkat tartalmaznak. Például képzeljük el, hogy az összes kerékpár ugyanannyi sebességfokozattal rendelkezik. Ebben az esetben felesleges példányváltozót alkalmazni, minden példány ugyanazt a másolatot tárolná. Ilyenkor osztályváltozóban érdemes az adatot tárolni, amit minden példány el tud érni. Ha egy objektum megváltoztatja az értékét, az összes objektum számára is megváltozik.

Az osztálynak lehet osztálymetódusa is.

Az objektumok használatának előnye a modularitás és az információelrejtés. Az osztályok használatának előnye az újrafelhasználhatóság. A bicikligyárak újra és újra fel tudják használni a gyártás során az egyszer elkészített tervrajzokat. A programozók ugyanazokat az osztályokat, ugyanazokat a kódokat újra és újra felhasználják a példányosítás során.