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
| Typ | Deklaration | Tillhör |
|---|---|---|
| Instansfält | private String namn | Varje objekt |
| Statiskt fält | private static int count | Klassen själv |
| Konstants | public static final double PI = 3.14 | Ofö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
| Klass | Objekt | |
|---|---|---|
| Vad är det? | En ritning / mall | En konkret instans |
| Finns i minnet? | Nej, bara definitionen | Ja, allokerat på heapen |
| Skapas med | class-nyckelordet | new-operatorn |
| Antal | En per klassdefinition | Må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