15. hét Objektum-orientált feladat megoldása
Tartalom:
15.1. Számítógép
15.2. Tesztkérdések
15.3.
Feladatok
Az alábbiakban egy olyan összetett feladatot fogunk megoldani, amely a Java nyelv igazi erősségét, az objektumközpontú programozást helyezi előtérbe.
Adott az alábbi osztály:

1.
feladat: Definiáljunk egy olyan konstruktort az osztályhoz, amellyel az
adattagoknak kezdőérték adható!
A megoldásban segít a NetBeans fejlesztőrendszer. A szerkesztőterület helyi menüjének "Insert code" menüpontjából kezdeményezhetünk konstruktor-generálást, kijelölve azokat az adattagokat, amelyeknek kezdőértéket kívánunk adni.

.
Figyeljük meg, hogy az adattagok nevei önmagukban mint paraméterek jelennek meg, az osztály "igazi" adattagjaira a this kulcsszóval hivatkozhatunk!
2. feladat: Írjuk meg az adattagok lekérdező és beállító metódusait!
Ismét használható a helyi menü, ahol a metódusokat a Getter (lekérdező) és a Setter (beállító) menüpontok generálják le.

A létrejövő kódrészletek:


Figyeljük meg, hogy az automatikus generálás az adattagokat mindkét metódusnál ABC sorrendbe állította, amely utasítások természetesen visszaállíthatók az osztálydefiníció szerinti sorrendjükbe.
3. feladat: Definiáljuk felül az osztályunk
toString()
metódusát úgy, hogy az adattagjait soronként és a következő formátumban adja
vissza:
<processzor>
<sebesség> GHz CPU, <ram> MB RAM, <hdd> GB HDD
(pl. "AMD 2.4 GHz CPU, 1024 MB RAM, 500 GB HDD")
Az Object osztályból örökölt toString() metódus átdefiniálását szintén kezdeményezhetjük a helyi menü metódus-felülíró (Override Method) menüpontjában, viszont a kapott kódot a kívánalmaknak megfelelően át kell alakítani:

4. feladat: Definiáljuk felül az equals() metódust úgy, hogy két számítógép akkor legyen egyenlő, ha a processzoruk neve megegyezik, és a sebesség- és kapacitás-paramétereik páronként maximum 10%-kal térnek el egymástól!
Ennek a metódusnak is generáljuk a vázát, majd a Math osztály abs() metódusát felhasználva - és a kódot jelentősen átírva - előállítjuk az összetett feltételt. Az automatikusan generálódó hashCode() metódus átdefiniálására most nincs szükség, akár törölhető is.

Figyeljük meg, hogy null (üres) és nem számítógép objektum esetén nincs átdefiniálás!
5. feladat: Egészítsük ki a Számítógép osztály definícióját úgy, hogy az objektumai processzoruk sebessége alapján összehasonlíthatók legyenek! Implementáljuk a Comparable interfészt is!
A feladat megoldásához a compareTo() metódust kell felüldefiniálni, hogy a megadott szempont szerint tudjuk az osztálypéldányokat összehasonlítani.

A Comparable interfész implementálását az osztály fejében jelezni kell. Definíciója csak egyetlenegy metódust tartalmaz.


6. feladat: Származtassunk a Számítógép osztályból egy Notebook osztályt! Az új osztály objektumai a számítógép tulajdonságain kívül egy új - valós értékű - üzemidő adattaggal is rendelkeznek. Készítsünk az új adattaghoz lekérdező metódust, valamint az osztályhoz egy konstruktort, amellyel mindegyik adattagjának kezdőérték adható!
Az új osztályt az extends kulcsszóval származtathatjuk a szülőosztályból. A konstruktor és az új adattag lekérdező metódusának előállítása a generátor használatával egyszerű. Figyeljük meg a super() metódus használatát! Segítségével a szülőosztály adattagjaira hivatkozhatunk, míg a this a származtatott osztály új adattagját hivatkozza.

7. feladat: Egészítsük ki a Notebook osztályt egy olyan konstruktorral is, amely a RAM méretét 2048 MB-ra állítja be, a többi adattag értékét pedig paraméterek határozzák meg!
A Notebook osztály új konstruktorában a ram adattag nem szerepel paraméterként, mert konkrét értéket kap, amit a super() metódus meghívásakor állítunk be.

8. feladat: Definiáljuk felül a Számítógép osztálytól örökölt toString() metódust úgy, hogy a notebook a számítógéptől örökölt adattagjai után az üzemidőt is jelenítse meg egy tizedes pontossággal (pl. ..., 3,5 óra üzemidő)!
A korábban már megismert java.text.DecimalFormat osztályt importálva a feladat megoldása nem okoz gondot.

9. feladat: Készítsünk egy main nevű osztályt, amely a főprogramot tartalmazza. Hozzunk létre két-két Számítógép típusú objektumot az alábbi adatokkal, majd írassuk ki őket a képernyőre!
Számítógép szg1: AMD, 3.2 GHz, 4096 MB, 400 GB
Számítógép szg2: Intel, 2.6 GHz, 2048 MB, 500 GB

A két objektumpéldány adattagjainak megjelenése a toString() metódus átdefiniálásának megfelelő formátumú:

10. feladat: Hozzunk létre két Notebook objektumot is! Az első minden adattagját paraméterként kapja, a második viszont 2048 MB-os memóriával jöjjön létre. Adatok:
Notebook nb1: AMD Turion X2, 1.8 GHz, 3072 MB, 250 GB, 3.55 óra
Notebook nb2: Intel Atom, 1.6 GHz, 120 GB, 2.2 óra

Figyeljük meg, hogy a két objektumpéldányt más-más konstruktor hozta létre!

A teljes program forráskódja: szamitogep.rar.
15.2. Tesztkérdések
15.3.1. Egészítsük ki a Számítógép osztályt egy olyan metódussal, amely a következő feltételek alapján eldönti egy objektumról, hogy korszerű-e! Korszerű, ha a processzor sebessége minimum 1.6 GHz-es, a memória legalább 2048 MB-os, valamint a merevlemez nagyobb, mint 160 GB. Ezek a számítógépek korszerűek?
Számítógép szg3: AMD, 2.8 GHz, 3072 MB, 500 GB
Számítógép szg4: Intel, 2.6 GHz, 1024 MB, 320 GB
15.3.2. Származtassunk a Notebook osztályból egy Pda osztályt! Az új osztály objektumai a notebook tulajdonságain kívül egy új - egész értékű - súly adattaggal is rendelkeznek, amely a pda súlyát tárolja grammban kifejezve. Készítsünk az új adattaghoz lekérdező és beállító metódust, valamint az osztályhoz egy konstruktort, amellyel mindegyik adattagjának kezdőérték adható!
15.3.3. Definiáljuk felül a Pda osztály Notebook osztálytól örökölt toString() metódusát úgy, hogy az örököltek mellett a súly adattagot is jelenítse meg, valamint a hdd adattag neve "HDD" helyett "háttértár" legyen! Az alábbi pda példányt hozzuk létre, és jelenítsük meg a képernyőn!
Pda p1: Samsung, 0.4 GHz, 512 MB, 64 GB, 3 óra, 125 g
15.3.4. Módosítsuk a Számítógép osztály korszerű() metódusát úgy, hogy az alábbi feltételek teljesülése esetén a Notebook és a Pda osztály példányait is - a kategóriájuknak megfelelő paraméterekhez viszonyítva - minősíteni tudjuk! Jelenítsük meg a képernyőn a már létező nb1, nb2 és p1 példányok minősítését!
Korszerűek, ha teljesítik az alábbi paramétereket:
| CPU sebesség (GHz) | RAM (MB) | Háttértár (GB) | Üzemidő (óra) | Súly (g) | |
| notebook | >1 | >=1024 | >=120 | >=3 | |
| pda | >0.3 | >=128 | >=16 | >=2.5 | <150 |