Absztrakt osztály vs. Java interfész: magyarázat példákkal

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.

  Hogyan lehet az alacsony fogyasztású módot tartósan engedélyezni az iPhone-on

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.

  Hogyan találjuk meg az Amethyst minecraftot

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

  12 ClickFunnels alternatíva 2022-ben

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.