Objektumorientált programozási alapelvek a Java-ban: OOP-koncepciók kezdőknek

Az objektum-orientált programozás fenntartható módon kínál spagetti kódot. Lehetővé teszi a programok javításokként történő javítását.
- Paul Graham

objektumorientált

Az objektum-orientált programozás alapjai

Az objektumorientált programozás olyan programozási paradigma, ahol mindent objektumként ábrázolnak.

Az objektumok üzeneteket adnak át egymásnak. Minden objektum eldönti, hogy mit kezdjen a kapott üzenettel. Az OOP minden objektum állapotára és viselkedésére összpontosít.

Mik azok az objektumok?

Az objektum olyan entitás, amelynek állapota és viselkedése van.

Például kutya, macska és jármű. Szemléltetésképpen: a kutyának olyan állapotai vannak, mint az életkor, a szín, a név és a viselkedés, például az evés, az alvás és a futás.

Az állam megmondja, hogyan néz ki az objektum vagy milyen tulajdonságokkal rendelkezik.

A viselkedés megmondja, hogy az objektum mit csinál.

Valójában a valós kutyát képviselhetjük egy programban, mint szoftver objektumot, meghatározva annak állapotát és viselkedését.

A szoftveres objektumok a valós objektumok tényleges ábrázolása. Logikai objektum létrehozásakor a memória a RAM-ban van lefoglalva.

Az objektum egy osztály példányára is hivatkozik. Az osztály beindítása ugyanazt jelenti, mint egy objektum létrehozása.

Az objektum létrehozásakor fontos megjegyezni: a referencia típusnak a azonos típusú vagy a szuper típus az objektumtípus. A referencia típusát később megnézzük ebben a cikkben.

Mik az osztályok?

Az osztály egy sablon vagy tervrajz, amelyből objektumok jönnek létre.

Képzeljen el egy osztályt süti-vágóként, a tárgyakat pedig sütiként.

Az osztályok az állapotokat példányváltozókként, a viselkedést pedig példamódszerként definiálják.

A példányváltozók tagváltozóként is ismertek.

Az osztályok nem foglalnak helyet.

Hogy képet alkothassunk az osztályokról és az objektumokról, hozzunk létre egy Cat osztályt, amely a valós világ állapotait és viselkedését reprezentálja.

Most sikeresen definiáltunk egy sablont a Cat számára. Tegyük fel, hogy van két macskánk, Thor és Rambo.

Hogyan definiálhatjuk őket a programunkban?

Először létre kell hoznunk a Mac osztály két objektumát.

Ezután meghatározzuk állapotukat és viselkedésüket.

A fenti kódpéldákhoz hasonlóan definiálhatjuk az osztályunkat, példányosíthatjuk (objektumokat hozhatunk létre), és meghatározhatjuk az objektumok állapotát és viselkedését.

Most áttekintettük az objektum-orientált programozás alapjait. Térjünk át az objektum-orientált programozás elveire.

Az objektum-orientált programozás alapelvei

Ez az objektum-orientált programozási paradigma négy fő elve. Megértésük elengedhetetlen a sikeres programozóvá váláshoz.

  1. Egységbezárás
  2. Öröklés
  3. Absztrakció
  4. Polimorfizmus

Most nézzük meg mindegyiket részletesebben.

Egységbezárás

A beágyazás a kód és az adatok egyetlen egységbe csomagolásának folyamata.

Olyan, mint egy kapszula, amely több gyógyszer keverékét tartalmazza, és olyan technika, amely segít megőrizni a példányváltozókat.

Ezt úgy érhetjük el, hogy olyan privát hozzáférés-módosítókat használunk, amelyekhez az osztályon kívül más nem fér hozzá. A magánállamok biztonságos elérése érdekében nyilvános módszereket kell kidolgoznunk. (Java-ban ezeknek a módszereknek meg kell felelniük a JavaBeans elnevezési szabványainak.)

Tegyük fel, hogy van egy lemezbolt, amely különböző előadók zenei albumait árulja, és egy készletgazda, aki ezeket kezeli.

Ha megnézzük a 4. ábrát, a StockKeeper osztály közvetlenül elérheti az Album osztály állapotait, mivel az Album osztály állapota nyilvános. .

Mi van, ha a részvénytulajdonos létrehoz egy albumot és negatív értékekre állítja az állapotokat? Ezt szándékosan vagy akaratlanul teheti meg a készletgazda.

Ennek szemléltetésére nézzünk meg egy Java program mintát, amely elmagyarázza a fenti ábrát és állítást.

Az album ára és példányszáma nem lehet negatív érték. Hogyan kerülhetjük el ezt a helyzetet? Itt használjuk a kapszulázást.

Ebben a forgatókönyvben megakadályozhatjuk, hogy a készletgazda negatív értékeket rendeljen hozzá. Ha megpróbálnak negatív értékeket rendelni az album árához és példányszámához, akkor azokat 0,0 és 0 értékként rendeljük hozzá.

A beágyazással letiltottuk állományőrzőnktől a negatív értékek hozzárendelését, ami azt jelenti, hogy rendelkezünk az adatok feletti ellenőrzéssel.

A Java beágyazásának előnyei

  1. Készíthetünk osztályt csak olvasható vagy csak írható: csak olvasható osztály esetén csak egy getter módszert kell megadnunk. Csak írható osztály esetében csak egy szetter módszert kell megadnunk.
  2. Az adatok ellenőrzése: az adatokat úgy állíthatjuk be, hogy logikát adunk a szetter módszerekhez, mint ahogy a fenti példában korlátoztuk az állománygazdát negatív értékek hozzárendelésétől.
  3. Adatok elrejtése: más osztályok nem férhetnek hozzá közvetlenül az osztály privát tagjaihoz.

Öröklés

Tegyük fel, hogy a fent tárgyalt lemezbolt Blu-ray filmeket is árul.

Amint a fenti ábrán látható, az Album és a Film között sok általános állapot és viselkedés (közös kód) van .

Ha ezt az osztálydiagramot kódba implementálja, megírja (vagy átmásolja és beilleszti) a Movie teljes kódját? Ha így tesz, akkor megismétli önmagát. Hogyan lehet elkerülni a kódduplikációt?

Itt használjuk az öröklést.

Az öröklés olyan mechanizmus, amelyben egy objektum megszerzi a szülő objektum összes állapotát és viselkedését.

Az öröklés szülő-gyermek kapcsolatot használ (IS-A kapcsolat).

Tehát mi pontosan öröklődik?

Láthatóság/hozzáférés módosítók befolyásolja, mi öröklődik egyik osztályból a másikba.

Java-ban, mint a ökölszabály a példányváltozókat priváttá, a példánymódszereket pedig nyilvánosá tesszük .

Ebben az esetben nyugodtan kijelenthetjük, hogy a következők öröklődnek:

  1. közpéldai módszerek.
  2. magánpéldány-változók (a magánpéldány-változók csak nyilvános getter és setter módszerekkel érhetők el).

Az öröklés típusai a Java-ban

Ötféle öröklődés létezik a Java-ban. Egységesek, többszintűek, hierarchikusak, többszörösek és hibridek.

Az osztály egyszeri, többszintű és hierarchikus örökségeket tesz lehetővé. Az interfész lehetővé teszi több és hibrid öröklődést.

Egy osztály csak egy osztályt bővíthet, de tetszőleges számú interfészt képes megvalósítani. Egy interfész több interfészt is kiterjeszthet.

Kapcsolatok

I. IS-A kapcsolat

Az IS-A kapcsolat öröklődésre vagy megvalósításra utal.

a. Általánosítás

Az általánosítás IS-A kapcsolatot használ egy specializációs osztálytól az általánosítási osztályig.

II. HAS-Egy kapcsolat

Az egyik osztály példánya HAS-A hivatkozás egy másik osztály példányára.

a. Összesítés

Ebben a kapcsolatban az A és B osztály megléte nem függ egymástól.

Ebben az összesítési részben megnézzük a Student osztály és a ContactInfo osztály példáját.

Hallgató HAS-A ContactInfo. A ContactInfo más helyeken is használható - például egy vállalat Employee osztálya is használhatja ezt a ContactInfo osztályt. Tehát a Student létezhet ContactInfo nélkül, a ContactInfo pedig Student nélkül. Ez a fajta kapcsolat aggregáció néven ismert.

b. Fogalmazás

Ebben a kapcsolatban a B osztály nem létezhet A osztály nélkül - hanem A osztály tud B osztály nélkül léteznek.

Ha ötletet szeretnénk adni a kompozícióról, nézzünk meg egy példát a Student osztályra és a StudentId osztályra.

Hallgató HAS-A StudentId. A Student létezhet StudentId nélkül, de a StudentId nem létezhet Student nélkül. Ez a fajta kapcsolat összetétel néven ismert.

Térjünk vissza a korábbi lemezbolt-példánkhoz, amelyet fentebb tárgyaltunk.

Ezt a diagramot Java-ban is megvalósíthatjuk a kódduplikálás elkerülése érdekében.

Az öröklés előnyei

  1. Kód újrafelhasználás: a gyermekosztály örökli a szülőosztály összes példánytagját.
  2. Nagyobb rugalmasságot kínál a kód megváltoztatására: elegendő a kód megváltoztatása a helyén.
  3. Használhatja a polimorfizmust: a módszer felülbírálásához IS-A kapcsolat szükséges.

Absztrakció

Az absztrakció a megvalósítás részleteinek elrejtése és a felhasználó számára csak a funkcionalitás megjelenítése.

Az absztrakció általános példája, hogy a gázpedál megnyomásával megnő az autó sebessége. De a vezető nem tudja, hogy a gázpedál lenyomása hogyan növeli a sebességet - ezt nem kell tudniuk.

A műszakilag elvont valami hiányos vagy később befejezendő dolgot jelent.

A Java-ban az absztrakciót kétféleképpen érhetjük el: absztrakt osztály (0–100%) és interfész (100%).

Az absztrakt kulcsszó osztályokra és módszerekre alkalmazható. absztrakt és végleges vagy statikus soha nem lehet együtt.

I. Absztrakt osztály

Az absztrakt osztály az absztrakt kulcsszót tartalmazza .

Az absztrakt osztályokat nem lehet példányosítani (absztrakt osztályok objektumait nem lehet létrehozni). Lehetnek konstruktoraik, statikus és végleges módszereik.

II. Absztrakt módszerek

Az absztrakt módszer az absztrakt kulcsszót tartalmazza .

Az absztrakt módszer nem rendelkezik megvalósítással (nincs módszer törzs, és pontosvesszővel végződik). Nem szabad privátként megjelölni .

III. Absztrakt osztály és elvont módszerek

  • Ha legalább egy absztrakt módszer létezik egy osztályon belül, akkor az egész osztálynak absztraktnak kell lennie.
  • Van elvont osztályunk absztrakt módszerek nélkül.
  • Egy elvont osztályon belül egyszerre tetszőleges számú absztrakt és nem absztrakt módszer is lehet.
  • Az absztrakt osztály első konkrét alosztályának biztosítania kell az összes elvont módszer megvalósítását.
  • Ha ez nem történik meg, akkor az alosztályt is absztraktként kell megjelölni.

Valódi világban a megvalósítást olyan személy biztosítja, aki a végfelhasználók számára ismeretlen. A felhasználók nem ismerik a megvalósítási osztályt és a tényleges megvalósítást.

Vegyünk egy példát az elvont fogalomhasználatra.

Mikor akarunk egy osztályt elvontként megjelölni?

  1. Kényszeríteni az alosztályokat absztrakt módszerek megvalósítására.
  2. Hogy abbahagyja az adott osztály tényleges objektumait.
  3. Osztályhivatkozás fenntartása.
  4. A közös osztálykód megtartása érdekében.

Felület

Az interfész egy osztály tervrajza.

Az interfész 100% -ban elvont. Kivitelezők itt nem engedélyezettek. IS-A kapcsolatot képvisel.

JEGYZET: Az interfészek csak a szükséges módszereket definiálják. Nem tudjuk megtartani a közös kódot.

Egy felület csak elvont módszerekkel rendelkezhet, konkrét módszerekkel nem. Alapértelmezés szerint az interfész metódusai nyilvánosak és elvontak. Tehát a felületen belül nem kell nyilvánosat és elvontat megadnunk .

Tehát, amikor egy osztály az interfész metódusát úgy hajtja végre, hogy nem adja meg a módszer hozzáférési szintjét, a fordító hibát dob, hogy „Nem lehet csökkenteni az örökölt módszer láthatóságát az interfészről”. Tehát a megvalósított módszer hozzáférési szintjét nyilvánosra kell állítani .

Alapértelmezés szerint az interfész változók nyilvánosak, statikusak és véglegesek .

Lássunk egy példát, amely elmagyarázza az interfész koncepcióját:

Alapértelmezett és statikus módszerek az interfészekben

Az interfész módszereket általában külön osztályban valósítjuk meg. Tegyük fel, hogy új módszert kell hozzáadnunk egy felülethez. Akkor ezt a módszert abban a külön osztályban is meg kell valósítanunk.

A probléma leküzdésére a Java 8 alapértelmezett és statikus módszereket vezetett be, amelyek az absztrakt módszerektől eltérően az interfészen belül valósítják meg a módszereket.

  • Alapértelmezett módszer
  • Statikus módszer

Az osztályok statikus módszereihez hasonlóan az interfészük nevén is hívhatjuk őket.

  • Marker felület

Ez egy üres felület. Például Serializable, Cloneable és Remote interfészek.

Az interfészek előnyei

  • Segítenek a többszörös öröklés használatában a Java-ban.
  • Absztrakciót nyújtanak.
  • Laza összekapcsolást biztosítanak: az objektumok függetlenek egymástól.

Mikor akarunk egy osztályt interfésszé változtatni?

  1. Kényszeríteni az alosztályokat absztrakt módszerek megvalósítására.
  2. Hogy abbahagyja az adott osztály tényleges objektumait.
  3. Osztályhivatkozás fenntartása.

JEGYZET: Ne feledje, hogy az interfészen belül nem tudjuk megtartani a közös kódot.

Ha meg szeretné adni a potenciálisan szükséges módszereket és a közös kódot, használjon egy absztrakt osztály.

Ha csak egy kívánt metódust szeretne megadni, használjon egy felület.

Polimorfizmus

A polimorfizmus az objektum azon képessége, hogy sokféle formát öltsön.

A polimorfizmus az OOP-ban akkor fordul elő, amikor egy szuper osztály egy alosztály objektumra hivatkozik.

Az összes Java objektum polimorfnak tekinthető, mivel több IS-A kapcsolattal rendelkezik (legalább az összes objektum megfelel az IS-A tesztnek a saját típusa és az Object osztály esetében).

Az objektumhoz referencia változón keresztül férhetünk hozzá. A referencia változó csak egy típusú lehet. A deklarálás után a referencia változó típusa nem változtatható meg.

A referencia változó deklarálható osztályként vagy interfész típusként.

Egyetlen objektumra sokféle referenciaváltozó hivatkozhat, amennyiben azok az azonos típusú vagy a szuper típus az objektum.

Módszer túlterhelése

Ha egy osztálynak több metódusa van, amelyeknek ugyanaz a neve, de különböző paramétereik vannak, akkor ezt metódustúlterhelésnek nevezzük.

A módszer túlterhelésének szabályai:

  1. Más paraméterlistának kell lennie.
  2. Különböző visszatérési típusai lehetnek.
  3. Különböző hozzáférés-módosítók lehetnek.
  4. Különböző kivételeket vethet fel.

JEGYZET: A statikus módszerek is túlterhelhetők.

JEGYZET: Túlterhelhetjük a main () metódust, de a Java Virtual Machine (JVM) meghívja a main () metódust, amely argumentumként String tömböket fogad.

A polimorfizmusra vonatkozó szabályok

Időszabályok összeállítása

  1. A fordító csak a referencia típusát ismeri.
  2. Csak referencia típusban kereshet módszereket.
  3. Kimeneti metódus aláírást ad ki.

Futási idő szabályai

  1. Futás közben a JVM pontosan követi futásidejű típus (objektumtípus) módszer megtalálására.
  2. Meg kell egyeznie a fordítási idő metódus aláírásával és a tényleges objektum osztályának módszerével.

A módszer felülbírálása

Ha egy alosztálynak ugyanaz a módszere van, mint amit a szuper osztályban deklaráltunk, akkor ezt metódus felülbírálásnak nevezzük.

A módszer felülíró szabályai:

  1. Ugyanannak a paraméterlistának kell lennie.
  2. Ugyanannak a visszatérési típusnak kell lennie: bár a kovariáns visszatérés lehetővé teszi számunkra, hogy megváltoztassuk az felülbírált módszer visszatérési típusát.
  3. Nem rendelkezhet korlátozóbb hozzáférés-módosítóval: lehet, hogy kevésbé korlátozó hozzáférés-módosítóval rendelkezik.
  4. Nem dobhat új vagy szélesebb körű bejelölt kivételt: szűkebb bejelölt kivételeket dobhat, és minden be nem ellenőrzött kivételt.
  5. Csak az öröklött módszereket lehet felülbírálni (IS-A kapcsolattal kell rendelkeznie).

Példa a módszer felülírására:

JEGYZET: A statikus módszereket nem lehet felülbírálni, mert a módszereket futás közben felülírják. A statikus módszerek az osztályokhoz, míg a példányok az objektumokhoz vannak társítva. Tehát a Java-ban a main () metódust sem lehet felülírni.

JEGYZET: A kivitelezők túlterhelhetők, de nem írhatók felül.

Objektumtípusok és referenciatípusok

Személyben mary = new Student ();, ez az objektum létrehozása teljesen rendben van.

mary egy Person típusú referencia változó, és az új Student () új Student objektumot hoz létre.

Mária nem fér hozzá a tanulmányhoz () fordítási időben, mert a fordító csak a referencia típust ismeri. Mivel a referencia típusú osztályban nincs tanulmány (), ezért nem férhet hozzá. De futás közben mary a Student típusú lesz (futásidejű/objektumtípus).

Kérjük, olvassa el ezt a bejegyzést, ha további információt szeretne a futásidejű típusokról.

Ebben az esetben meggyőzhetjük a fordítót azzal, hogy „futás közben Mary már Student típusú lesz, ezért kérem, engedje meg, hogy felhívjam”. Hogyan győzhetjük meg így a fordítót? Itt használjuk az öntést.

A fordítási idő alatt Mary-ből Student típusúat tehetünk, és az öntéssel hívhatjuk a study () -t.

A továbbiakban megtanuljuk a castingot.

Objektumtípus öntés

A Java típusú casting két típusra osztható:

  1. Szélesítés (implicit): automatikus típusátalakítás.
  2. Szűkítő casting (explicit): explicit átalakításra van szükség.

A primitívekben a hosszú nagyobb típus, mint az int. Az objektumokhoz hasonlóan a szülőosztály is nagyobb típus, mint a gyermekosztály.

A referencia változó csak egy objektumra vonatkozik. A referencia változó leadása nem változtatja meg az objektumot a kupacon, de más módon címkézi ugyanazt az objektumot például a tagok hozzáférhetősége révén.

I. Szélesített casting

II. Szűkítő casting

Vigyáznunk kell a szűkítésre. Szűkítéskor meggyőzzük a fordítót, hogy hibátlanul fordítson. Ha tévesen győzünk meg róla, futási hibát kapunk (általában ClassCastException).

A szűkítés helyes végrehajtása érdekében az instanceof operátort használjuk. Ellenőrzi az IS-A kapcsolatot.

Mint már korábban említettem, egy fontos dologra kell emlékeznünk, amikor objektumot hozunk létre az új kulcsszó használatával: a referencia típusnak a azonos típusú vagy a szuper típus az objektumtípus.

Következtetés

Köszönöm mindenkinek, hogy elolvasta. Remélem, ez a cikk segített neked.

Erősen javasolom, hogy olvassa el az OOP-ról szóló kapcsolódó cikkeket.

Nézze meg eredeti cikk sorozatomat a Közepes: Objektumorientált programozási elvekről a Java-ban

Kérjük, bátran jelezze, ha bármilyen kérdése van.

Az álom nem az, amit alvás közben lát, hanem valami, ami nem hagyja aludni.
- A P J Abdul Kalam, A tűz szárnyai: önéletrajz

Boldog kódolás!