Abstrakt klasse vs. Interface i Java: Forklaring med eksempler

Abstrakte klasser og grænseflader bruges til abstraktion i Java. Abstraktion i objektorienteret programmering refererer til at skjule implementeringsdetaljer fra slutbrugerne.

I abstraktion kan du vide, hvad funktionaliteterne er, men du kan ikke vide, hvordan de blev implementeret.

Lad os se på hver af dem og prøve at forstå, hvorfor de bruges.

Abstrakt klasse

En klasse, der ikke kan instansieres som et objekt og måske eller måske ikke har abstrakte metoder i sig, kaldes en abstrakt klasse i Java. En abstrakt metode er en metode, der ikke har et implementeringsorgan, når den erklæres.

Eksempel på en abstrakt klasse GraphicObject – Oracle

Du kan oprette en abstrakt klasse ved at angive det abstrakte nøgleord før klassenøgleordet.

abstract class abstractClass {
    void run() {
        System.out.println("ran");
    }
}

En abstrakt klasse kan udvides med andre klasser. Det kan med andre ord også underklassificeres.

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");
    }
}

Abstrakte klasser bruges til at implementere fælles metoder blandt flere klasser, som udvider en given abstrakt klasse. Evnen til at definere abstrakte metoder inde i abstrakte klasser gør dem også utrolig nyttige for klasser, der har lignende metoder, men med forskellige implementeringer. Lad os tage et eksempel.

  Sådan skriver du Shrug Emoji ¯_(ツ)_/¯ på én gang

Overvej en bil, der har nogle funktioner, såsom start, stop, bakning osv. Disse funktioner er almindelige blandt alle typer biler.

Men hvad med automatiseringsfunktioner såsom selvkørende? Implementeringen af ​​disse funktioner kan variere for forskellige typer biler. Lad os se, hvordan du kan oprette et objektorienteret program relateret til det.

Først og fremmest skal du oprette en bilklasse, der vil blive udvidet med flere klasser af forskellige biltyper.

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();
}

Metoden start(), stop() og reverse() er metoder, der er almindelige i alle biler. Så deres implementering er allerede defineret i selve bilklassen. En bestemt type bil kan dog have forskellige implementeringer af selvkørende tilstand. Og dermed kan du definere selfDrive() som en abstrakt metode og implementere den på forskellige måder i forskellige klasser af forskellige typer biler.

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");
    }
}

Det er vigtigt at bemærke, at hvis en underklasse ikke implementerer alle abstrakte metoder defineret i den abstrakte klasse, så skal den erklæres som en abstrakt klasse selv.

  Sådan redigeres videoer

Interface

En grænseflade er en måde at fortælle en klasse, hvilke metoder der skal implementeres af den. Hvis du for eksempel betragter eksemplet med en bil, har den nogle grundlæggende funktioner. Den kan starte, bevæge sig og stoppe. Disse funktioner er almindelige i alle biler.

Så hvis du implementerer en grænseflade for en bil i en klasse, skal du implementere alle metoderne for at bilen kan fungere korrekt og sikkert.

I lighed med abstrakte klasser kan vi ikke instansiere eller skabe objekter i en grænseflade. Det kan betragtes som en fuldt abstrakt klasse, fordi den kun indeholder abstrakte metoder, dvs. metoder uden et implementeringsorgan.

Du kan oprette en grænseflade ved at bruge grænsefladenøgleordet.

interface CAR {
    void start();
    void stop();
    void move();
}

Implementer en grænseflade ved at bruge implements nøgleordet, når du definerer en klasse.

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");
    }
}

Lighed

Ingen instansiering som et objekt er den ene ting, som abstrakte klasser og grænseflader har til fælles.

Forskelle

Abstrakt klassegrænsefladearv og implementeringKun én abstrakt klasse kan nedarves af en klasse.Flere grænseflader kan implementeres af en klasse.VariabletyperDen kan have endelige, ikke-endelige, statiske og ikke-statiske variabler.Den kan kun have statiske og endelige variabler. MetodetyperDen kan indeholde både abstrakte såvel som ikke-abstrakte metoder.Den kan kun indeholde abstrakte metoder, men statiske metoder er en undtagelse.AdgangsmodifikatorerEn abstrakt klasse kan have en adgangsmodifikator. Metodesignaturerne, der er defineret i grænsefladen, er offentlige som standard. En grænseflade har ikke en adgangsmodifikator.Konstruktører og destruktorerDen kan erklære konstruktører og destruktorer.Den kan ikke erklære konstruktører eller destruktorer.SpeedFastSlowForskelle mellem abstrakt klasse og grænseflade

  9 bedste ekspertnetværk, der skal bruges til at træffe informerede forretningsbeslutninger

Hvornår skal man bruge abstrakt klasse og interface?

Brug abstrakte klasser, når:

  • Du vil dele nogle fælles metoder og felter mellem flere klasser.
  • Erklæring af ikke-statiske og ikke-endelige felter for at ændre tilstanden af ​​det objekt, som de er bundet til.

Du kan bruge grænseflader, når:

  • Du vil definere adfærden for en klasse, der implementerer grænsefladen, men du er ligeglad med den måde, den er implementeret på.
  • Du vil sikre dig, at en klasse implementerer alle metoderne for at fungere korrekt.

Afsluttende ord

Grænseflader bruges hovedsageligt til at skabe API’er, fordi de kan give en struktur til at implementere funktionalitet uden at bekymre sig om den faktiske implementering.

Abstrakte klasser bruges generelt til at dele fælles abstrakte og ikke-abstrakte metoder blandt flere klasser, som udvider den abstrakte klasse for at gøre koden mere genanvendelig.

Lær mere om Java ved hjælp af disse online-kurser til java. Forbereder du dig til et interview på Java? Her er nogle interviewspørgsmål om objektorienteret programmering.