Klasser och Objekt

En klass är en ritning eller mall för objekt. Ett objekt är en konkret instans av en klass — det har ett tillstånd (fält) och ett beteende (metoder).


Deklarera en klass

// Klassen Bil är en ritning — den beskriver vad varje bil har och kan göra
public class Bil {
    // Tillstånd (fält)
    String farg;
    String marke;
    int arsmodell;

    // Beteende (metoder)
    void tuta() {
        System.out.println("Tut tut!");
    }

    void visaInfo() {
        System.out.println(marke + " (" + arsmodell + "), färg: " + farg);
    }
}

Skapa objekt

// Objekt är konkreta instanser — "riktiga" bilar byggda från ritningen
Bil bil1 = new Bil();
bil1.farg = "Röd";
bil1.marke = "Volvo";
bil1.arsmodell = 2024;

Bil bil2 = new Bil();
bil2.farg = "Blå";
bil2.marke = "Tesla";
bil2.arsmodell = 2025;

bil1.visaInfo(); // "Volvo (2024), färg: Röd"
bil2.tuta();     // "Tut tut!"

Varje objekt har sin egen uppsättning fältvärden — bil1 och bil2 är oberoende av varandra.


Konstruktorer

En konstruktor är en speciell metod som körs när ett objekt skapas. Den används för att sätta initiala värden.

public class Bil {
    String farg;
    String marke;
    int arsmodell;

    // Konstruktor — anropas med `new Bil(...)`
    public Bil(String farg, String marke, int arsmodell) {
        this.farg = farg;
        this.marke = marke;
        this.arsmodell = arsmodell;
    }
}

// Skapa objekt med konstruktor
Bil bil = new Bil("Röd", "Volvo", 2024);

this refererar till den aktuella instansen — den skiljer på parametern farg och fältet this.farg.

Default-konstruktor

Om du inte definierar någon konstruktor skapar kompilatorn en tom default-konstruktor automatiskt:

public class Bil {
    String farg;          // null som default
    int arsmodell;        // 0 som default
}

Bil b = new Bil(); // fungerar — default-konstruktor

Men så fort du lägger till en egen konstruktor försvinner default-konstruktorn.


Fält — tillstånd

Fält (även kallade attribut eller medlemsvariabler) lagrar objektets tillstånd:

public class Kund {
    // Instansfält — varje kund har egna värden
    private String namn;
    private String epost;
    private int poang;

    // Static-fält — delas av alla instanser
    private static int totalaKunder = 0;

    public Kund(String namn, String epost) {
        this.namn = namn;
        this.epost = epost;
        totalaKunder++;
    }
}

Typer av fält

TypDeklarationTillhör
Instansfältprivate String namnVarje objekt
Statiskt fältprivate static int countKlassen själv
Konstantspublic static final double PI = 3.14Oföränderligt, per klass

Metoder — beteende

Metoder definierar vad ett objekt gör:

public class Kalkylator {
    // Metod med returvärde
    public int addera(int a, int b) {
        return a + b;
    }

    // Void-metod — ingen retur
    public void skrivUt(int resultat) {
        System.out.println("Resultat: " + resultat);
    }

    // Statisk metod — tillhör klassen, inte objektet
    public static double pi() {
        return 3.14159;
    }
}

Kalkylator k = new Kalkylator();
int summa = k.addera(3, 4);
k.skrivUt(summa); // "Resultat: 7"

double p = Kalkylator.pi(); // anrop på klassen

Skillnad: Klass vs Objekt

KlassObjekt
Vad är det?En ritning / mallEn konkret instans
Finns i minnet?Nej, bara definitionenJa, allokerat på heapen
Skapas medclass-nyckelordetnew-operatorn
AntalEn per klassdefinitionMånga (eller noll)
// Klassdefinition (ritning)
public class Hus {
    String farg;
    int vaningar;
}

// Objekt (konkreta hus byggda från ritningen)
Hus hus1 = new Hus();
Hus hus2 = new Hus();
Hus hus3 = new Hus();
// Alla tre är separata objekt, var och en med sitt eget tillstånd

Pass-by-value

I Java och de flesta OOP-språk skickas parametrar alltid efter värde — men för objekt skickas värdet av referensen, inte objektet självt:

public void bytFarg(Bil bil, String nyFarg) {
    bil.farg = nyFarg;    // Ändrar det ursprungliga objektet!
    bil = new Bil(...);   // Påverkar INTE anroparen
}

Bil minBil = new Bil("Röd", "Volvo", 2024);
bytFarg(minBil, "Blå");
System.out.println(minBil.farg); // "Blå" — objektet ändrades

Fortsätt till Inkapsling.

Av Victor Hernandez från Bytebase.se