Abstrakt klasse vs. Grensesnitt i Java: Forklaring med eksempler

Abstrakte klasser og grensesnitt brukes for abstraksjon i Java. Abstraksjon i objektorientert programmering refererer til å skjule implementeringsdetaljer fra sluttbrukerne.

I abstraksjon kan du vite hva funksjonene er, men du kan ikke vite hvordan de ble implementert.

La oss se på hver av dem og prøve å forstå hvorfor de brukes.

Abstrakt klasse

En klasse som ikke kan instansieres som et objekt og kanskje ikke har abstrakte metoder i seg, kalles en abstrakt klasse i Java. En abstrakt metode er en metode som ikke har et implementeringsorgan når den er deklarert.

Eksempel på en abstrakt klasse GraphicObject – Oracle

Du kan opprette en abstrakt klasse ved å spesifisere det abstrakte nøkkelordet før klassenøkkelet.

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

En abstrakt klasse kan utvides med andre klasser. Med andre ord kan den også underklasses.

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 brukes til å implementere vanlige metoder blant flere klasser som utvider en gitt abstrakt klasse. Evnen til å definere abstrakte metoder i abstrakte klasser gjør dem også utrolig nyttige for klasser som har lignende metoder, men med forskjellige implementeringer. La oss ta et eksempel.

  8 Pålitelig CS:GO 🔫 Serverhosting for bedre spilling

Tenk på en bil som har noen funksjoner, som start, stopp, revers osv. Disse funksjonene er vanlige blant alle typer biler.

Men hva med automatiseringsfunksjoner som selvkjøring? Implementeringen av disse funksjonene kan variere for ulike typer biler. La oss se hvordan du kan lage et objektorientert program relatert til det.

Først av alt, lag en bilklasse som vil bli utvidet med flere klasser av forskjellige 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 som er vanlige i alle biler. Så implementeringen deres er allerede definert i selve bilklassen. En viss type bil kan imidlertid ha forskjellige implementeringer av selvkjørende modus. Og dermed kan du definere selfDrive() som en abstrakt metode og implementere den på forskjellige måter i forskjellige klasser av forskjellige 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 viktig å merke seg at hvis en underklasse ikke implementerer alle abstrakte metoder definert i den abstrakte klassen, bør den erklæres som en abstrakt klasse selv.

  12 beste nettsteder for å finne fjernarbeidsjobber

Grensesnitt

Et grensesnitt er en måte å fortelle en klasse hvilke metoder som må implementeres av den. Hvis du for eksempel ser på eksemplet med en bil, har den noen grunnleggende funksjoner. Den kan starte, bevege seg og stoppe. Disse funksjonene er vanlige i alle biler.

Så hvis du implementerer et grensesnitt til en bil i en klasse, må du implementere alle metodene for at bilen skal fungere riktig og trygt.

I likhet med abstrakte klasser kan vi ikke instansiere eller lage objekter i et grensesnitt. Den kan betraktes som en fullstendig abstrakt klasse fordi den kun inneholder abstrakte metoder, dvs. metoder uten implementeringsorgan.

Du kan opprette et grensesnitt ved å bruke grensesnittnøkkelordet.

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

Implementer et grensesnitt ved å bruke nøkkelordet implements 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");
    }
}

Likheten

Ingen instansiering som et objekt er den eneste tingen som abstrakte klasser og grensesnitt har til felles.

Forskjeller

Abstrakt klassegrensesnitt Arv og implementeringBare én abstrakt klasse kan arves av en klasse.Flere grensesnitt kan implementeres av en klasse.Variable TypesIt kan ha endelige, ikke-endelige, statiske og ikke-statiske variabler.Den kan bare ha statiske og endelige variabler. Metodetyper Den kan inneholde både abstrakte og ikke-abstrakte metoder. Den kan bare inneholde abstrakte metoder, men statiske metoder er et unntak. TilgangsmodifikatorerEn abstrakt klasse kan ha en tilgangsmodifikator. Metodesignaturene som er definert i grensesnittet er offentlige som standard. Et grensesnitt har ikke en tilgangsmodifikator.Konstruktører og destruktorerDet kan erklære konstruktører og destruktorer.Det kan ikke erklære konstruktører eller destruktorer.SpeedFastSlowForskjeller mellom abstrakt klasse og grensesnitt

  Hvordan forhindre de 11 beste truslene i Cloud Computing?

Når skal man bruke abstrakt klasse og grensesnitt?

Bruk abstrakte klasser når:

  • Du vil dele noen vanlige metoder og felt mellom flere klasser.
  • Erklære ikke-statiske og ikke-endelige felt for å endre tilstanden til objektet de er bundet til.

Du kan bruke grensesnitt når:

  • Du vil definere oppførselen til en klasse som implementerer grensesnittet, men du bryr deg ikke om måten den er implementert på.
  • Du vil forsikre deg om at en klasse implementerer alle metodene for å fungere ordentlig.

Siste ord

Grensesnitt brukes hovedsakelig til å lage APIer fordi de kan gi en struktur for å implementere funksjonalitet uten å bekymre deg for den faktiske implementeringen.

Abstrakte klasser brukes vanligvis til å dele vanlige abstrakte og ikke-abstrakte metoder blant flere klasser, som utvider den abstrakte klassen for å gjøre koden mer gjenbrukbar.

Lær mer om Java ved hjelp av disse nettbaserte kursene for java. Forbereder du deg på et intervju på Java? Her er noen intervjuspørsmål om objektorientert programmering.