Vecka 6: Objektorienterad programmering (Del 2)

Arv och polymorfism

Abstrakta klasser och interfaces

Vecka 6 i en grundkurs i Java fokuserar ofta på fördjupad förståelse av objektorienterad programmering, med särskilt fokus på koncept som arv, polymorfism, abstrakta klasser och interfaces. Dessa koncept är centrala byggstenar i objektorienterad design och programmering, och förståelsen för dem är avgörande för att skapa välstrukturerad, återanvändbar och underhållbar kod. Låt oss utforska dessa koncept mer detaljerat.

Arv

Arv är en av de grundläggande principerna i objektorienterad programmering. Det möjliggör för en klass att ärva fält och metoder från en annan klass. I Java används nyckelordet extends för att etablera ett arvsförhållande mellan två klasser. Arv främjar kodåteranvändning och skapar en hierarkisk klassificering.

Tänk dig en grundläggande klass kallad Fordon som representerar alla typer av fordon. Den kan ha egenskaper som hastighet och färg, samt en metod för att visaInfo() som skriver ut fordonets egenskaper.

class Fordon {
    protected int hastighet;
    protected String färg;

    public Fordon(int hastighet, String färg) {
        this.hastighet = hastighet;
        this.färg = färg;
    }

    public void visaInfo() {
        System.out.println("Hastighet: " + hastighet + " Färg: " + färg);
    }
}

En Bil klass kan ärva från Fordon för att använda dess egenskaper och metoder, och även lägga till egna specifika egenskaper.

class Bil extends Fordon {
    private int antalDörrar;

    public Bil(int hastighet, String färg, int antalDörrar) {
        super(hastighet, färg);
        this.antalDörrar = antalDörrar;
    }

    @Override
    public void visaInfo() {
        super.visaInfo();
        System.out.println("Antal dörrar: " + antalDörrar);
    }
}

Polymorfism

Polymorfism är konceptet att en metod kan utföra olika funktioner baserat på objektet som den tillhör. Detta uppnås genom överlagring (method overloading) och överskridning (method overriding).

Överskridning innebär att en underklass ger en specifik implementation av en metod som är ärvt från en överklass. I exemplet ovan överskrevs visaInfo()-metoden i Bil klassen för att visa ytterligare information.

Abstrakta klasser

En abstrakt klass är en klass som inte kan instansieras. Den används som en bas för andra klasser. Abstrakta klasser kan innehålla både abstrakta metoder (utan implementation) och konkreta metoder (med implementation). Abstrakta metoder måste överskridas av subklasserna.

abstract class Däggdjur {
    public abstract void göraLjud();
}

class Hund extends Däggdjur {
    @Override
    public void göraLjud() {
        System.out.println("Vov!");
    }
}

Interfaces

Ett interface i Java är en referenstyp som kan innehålla konstanter och deklarationer av abstrakta metoder. Genom att implementera ett interface kan en klass förbinda sig till att förse implementationer av de metoder som interfacet deklarerar. Ett interface används för att specificera ett set av metoder som en klass måste implementera.

interface Vattenlevande {
    void simma();
}

class Fisk implements Vattenlevande {
    @Override
    public void simma() {
        System.out.println("Fisken simmar");
    }
}

Genom att använda arv och polymorfism kan vi skapa ett flexibelt och återanvändbart kodsystem. Abstrakta klasser och interfaces tillåter oss att definiera kontrakt för vad ett objekt kan göra, utan att specificera hur det