Absztrakt osztályokat és interfészeket használnak az absztrakcióhoz a Java nyelven. Az absztrakció az objektum-orientált programozásban a megvalósítás részleteinek elrejtését jelenti a végfelhasználók elől.
Absztrakcióban tudhatod, hogy mik a funkciók, de nem tudhatod, hogyan valósították meg őket.
Nézzük meg mindegyiket, és próbáljuk megérteni, miért használják őket.
Absztrakt osztály
Az olyan osztályt, amely nem példányosítható objektumként, és tartalmazhat absztrakt metódusokat, vagy nem, a Java absztrakt osztálynak nevezi. Az absztrakt metódus olyan metódus, amelynek deklarálásakor nincs implementációs törzse.
Példa egy absztrakt GraphicObject osztályra – Oracle
Létrehozhat egy absztrakt osztályt az absztrakt kulcsszó megadásával az osztály kulcsszó előtt.
abstract class abstractClass { void run() { System.out.println("ran"); } }
Egy absztrakt osztály kibővíthető más osztályokkal. Más szóval, alosztályozható is.
abstract class AbstractClass { void run() { System.out.println("ran"); } } class ExtendingAbstractClass extends AbstractClass { void newMethod() { System.out.println("new"); } @Override void run() { System.out.println("override"); } }
Az absztrakt osztályok közös metódusok megvalósítására szolgálnak több osztály között, amelyek kiterjesztik egy adott absztrakt osztályt. Ezenkívül az absztrakt osztályokon belüli absztrakt metódusok definiálása hihetetlenül hasznossá teszi azokat az olyan osztályok számára, amelyek hasonló metódusokkal rendelkeznek, de eltérő megvalósítással. Vegyünk egy példát.
Vegyünk egy olyan autót, amely rendelkezik bizonyos funkciókkal, mint például az indítás, a leállítás, a hátramenet stb. Ezek a funkciók minden típusú autóban gyakoriak.
De mi a helyzet az olyan automatizálási funkciókkal, mint az önvezetés? Ezeknek a funkcióknak a megvalósítása különböző típusú autók esetén eltérő lehet. Nézzük meg, hogyan lehet hozzá kapcsolódó objektumorientált programot készíteni.
Először is hozzon létre egy autóosztályt, amely kibővül a különböző autótípusok több osztályával.
abstract class Car { void start() { // implementation System.out.println("runs car"); } void stop() { // implementation System.out.println("engine stops"); } void reverse() { // implementation System.out.println("reverse mode enabled"); } abstract void selfDrive(); }
A start(), stop() és reverse() metódusok minden autóban általánosak. Így ezek megvalósítása már magában a Car osztályon belül meg van határozva. Egy bizonyos típusú autónak azonban különböző megvalósításai lehetnek az önvezető üzemmódban. Így a selfDrive() absztrakt módszerként definiálható, és különféle módon valósítható meg a különböző típusú autók különböző osztályaiban.
class CarTypeA extends Car { @Override void start() { super.start(); } @Override void stop() { super.stop(); } @Override void reverse() { super.reverse(); } void selfDrive() { // custom implementation System.out.println("Type A self driving mode enabled"); } }
class CarTypeB extends Car { // ...all similar methods void selfDrive() { // custom implementation // different implementation than CarTypeB System.out.println("Type B self driving mode enabled"); } }
Fontos megjegyezni, hogy ha egy alosztály nem valósítja meg az absztrakt osztályban meghatározott összes absztrakt metódust, akkor magát absztrakt osztályként kell deklarálni.
Felület
Az interfész egy módja annak, hogy megmondja egy osztálynak, hogy milyen metódusokat kell megvalósítania. Például, ha figyelembe vesszük egy autó példáját, akkor néhány alapvető funkciója van. Indulhat, mozoghat és megállhat. Ezek a funkciók minden autóban közösek.
Tehát, ha egy autó interfészt egy osztályba valósítja meg, akkor az összes módszert meg kell valósítania ahhoz, hogy az autó megfelelően és biztonságosan működjön.
Az absztrakt osztályokhoz hasonlóan nem tudunk példányokat létrehozni vagy létrehozni egy interfész objektumát. Teljesen absztrakt osztálynak tekinthető, mivel csak absztrakt metódusokat tartalmaz, azaz implementációs törzs nélküli metódusokat.
Az interfész kulcsszó használatával felületet hozhat létre.
interface CAR { void start(); void stop(); void move(); }
Valósítson meg interfészt az implements kulcsszó használatával egy osztály meghatározásakor.
class CarTypeB implements CAR { public void start() { System.out.println("started"); } public void stop() { System.out.println("stopped"); } public void move() { System.out.println("running"); } }
Hasonlóság
Az absztrakt osztályok és interfészek közös tulajdonsága a példányosítás mint objektum.
Különbségek
Absztrakt osztályinterfész öröklése és megvalósítása Egy osztály csak egy absztrakt osztályt örökölhet. Egy osztály több interfészt is megvalósíthat. Változótípusok Lehetnek végső, nem végleges, statikus és nem statikus változók. Csak statikus és végső változók lehetnek. Metódustípusok Absztrakt és nem absztrakt metódusokat is tartalmazhat.Csak absztrakt metódusokat tartalmazhat, de a statikus metódusok kivételt képeznek.Hozzáférés-módosítókEgy absztrakt osztálynak lehet hozzáférés-módosítója.A felületen meghatározott metódusaláírások alapértelmezés szerint nyilvánosak. Egy interfésznek nincs hozzáférésmódosítója.Konstruktorok és destruktorokKijelölhet konstruktorokat és destruktorokat.Nem tud konstruktorokat vagy destruktorokat deklarálni.SpeedFastSlowKülönbségek az absztrakt osztály és interfész között
Mikor használjunk absztrakt osztályt és felületet?
Absztrakt osztályokat használjon, ha:
- Néhány gyakori metódust és mezőt szeretne megosztani több osztály között.
- Nem statikus és nem végleges mezők deklarálása annak az objektumnak az állapotának módosítására, amelyhez hozzá vannak kötve.
Az interfészeket akkor használhatja, ha:
- Meg akarja határozni az interfészt megvalósító osztály viselkedését, de nem érdekli a megvalósítás módja.
- Győződjön meg arról, hogy egy osztály végrehajtja az összes metódust a megfelelő működéshez.
Végső szavak
Az interfészek főként API-k létrehozására szolgálnak, mivel struktúrát biztosítanak a funkciók megvalósításához anélkül, hogy aggódnának a tényleges megvalósítás miatt.
Az absztrakt osztályokat általában a közös absztrakt és nem absztrakt módszerek megosztására használják több osztály között, amelyek kiterjesztik az absztrakt osztályt, hogy a kód újrafelhasználhatóbbá váljon.
Tudjon meg többet a Java-ról ezen online java-tanfolyamok segítségével. Java-interjúra készül? Íme néhány interjúkérdés az objektum-orientált programozásról.