EDAA20
Programmering och databaser
Föreläsning 6 – Klasser
2021-09-14, Niklas Fors, @Zoom
Viktigt att komma ihåg om objekt
• Objekt består av data/egenskaper (attribut) och har metoder
• Objekt skapas genom new Klassnamn(...)
• Referenser till objekt sparas i referensvariabler, vars typ är en klass
• Metoder anropas genom referens.metod(argument)
• Värdet av en referensvariabel är en adress till ett objekt
• Tilldelning (=) betyder att adressen kopieras
• Jämförelse (==) betyder att adresserna jämförs
• Dokumentationen beskriver hur objekt skapas och vilka metoder som kan anropas
2
Klasser
• Programkoden delas upp i klasser
• En klass lagras normalt i en egen fil
• De flesta klasser beskriver objekt och fungerar som en mall på hur objekt skapas och används
• Det finns klasser som bara innehåller statiska metoder, exempelvis Math
• Då behöver man inte skapa ett objekt
Klass
• En klass specificerar vilka attribut, konstruktorer och metoder ett objekt har:
public class Klassnamn {
// attribut (deras typ och namn)
// konstruktorer – anger hur objekt av klassen initieras // metoder
}
• En klass fungerar som en mall på hur objekt skapas och används
• Flera objekt kan skapas av samma klass
4
public class Square { private int x;
private int y;
private int side;
...
}
Attribut i klassen Square
Attribut:
• Lagrar objektets data och allokeras när objektet skapas
• Får standardvärden (0, 0.0, false, null, …) när objektet skapas
• De kan initieras i konstruktorn
• Får användas i hela klassen
• Deklareras normalt som private
• ⟹ de kan enbart användas inuti klassen
public class Square { private int x;
private int y;
private int side;
public Square(int xPos, int yPos, int sideLength) { x = xPos;
y = yPos;
side = sideLength;
} }
Konstruktor – hur objekt initieras
• Konstruktorn används för att ge attributen startvärden och har samma namn som klassen
• Satserna i konstruktorn exekveras när ett objekt skapas (new Square(…))
• Returtyp ska ej anges
6
0 0 0 x
y side
public class Square { private int x;
private int y;
private int side;
public Square(int xPos, int yPos, int sideLength) { x = xPos;
y = yPos;
side = sideLength;
Konstruktor – hur objekt initieras
new Square(20, 30, 40)
(2) Argumenten överförs till parametrarna i konstruktorn
(3) Satserna i konstruktorn utförs, som sätter attributvärden utifrån parametervärdena
20 30 40 x
y side (1) Plats allokeras för objektet i minnet och alla
attribut får standardvärden (0, 0.0, false, osv)
public class Square { private int x;
private int y;
private int side;
...
public int getX() { return x;
}
public int getY() { return y;
}
public int getSide() { return side;
} }
Några metoder
Som tidigare har varje metod:
• Returtyp
• void betyder inget returvärde
• Namn
• Noll eller flera parametrar
• Satser
• return-sats krävs när returtypen inte är void
En metod kan komma åt alla attributen
8
Exekvering
public static void main ... { ...
int x = sq.getX();
...
}
...
public int getX() { return x;
} ...
• Ett anrop av en metod innebär att exekveringen fortsätter med den första satsen i den anropade metoden
• När den anropade metoden är klar återupptas exekveringen i den metod där anropet gjordes
Klassen Square Klassen DrawSquare
public class Square { private int x;
private int y;
private int side;
...
/** Returnerar arean */
public int getArea() { return side*side;
}
/** Flyttar kvadraten relativt */
public void move(int dx, int dy) { x = x + dx;
y = y + dy;
} }
Några fler metoder
I metoden move används parametrarna för att uppdatera attributen!
10
Övning – implementera metod
public class Square { private int x;
private int y;
private int side;
...
/** Uppdaterar sidan till newSide */
public void setSide(int newSide) {
} }
Implementera metoden setSide
Övning – implementera metod
public class Square { private int x;
private int y;
private int side;
...
/** Uppdaterar sidan till newSide */
public void setSide(int newSide) { side = newSide;
} }
Implementera metoden setSide
12
Rita kvadraten i ett fönster
public class Square { private int x;
private int y;
private int side;
...
/** Ritar kvadraten i fönstret w */
public void draw(SimpleWindow w) {
Metoden draw tar ett fönsterobjekt
som parameter, vilket används för att
rita kvadraten.
Rita kvadraten i ett fönster
public class Square { private int x;
private int y;
private int side;
...
/** Ritar kvadraten i fönstret w */
public void draw(SimpleWindow w) {
} }
x,y
x,y+side x+side,y+side x+side,y
(0, 0)
x
y
14
Rita kvadraten i ett fönster
public class Square { private int x;
private int y;
private int side;
...
/** Ritar kvadraten i fönstret w */
public void draw(SimpleWindow w) { w.moveTo(x, y);
w.lineTo(x, y + side);
w.lineTo(x + side, y + side);
w.lineTo(x + side, y);
w.lineTo(x, y);
x,y
x,y+side x+side,y+side x+side,y
public static void main ... {
...
sq.draw(w);
...
}
public void draw (SimpleWindow w) {
...
w.lineTo(x, y + side);
...
}
Klassen Square Klassen DrawSquare
public void lineTo (int x, int y) {
...
...
...
}
Klassen SimpleWindow
Exekvering – flera metodanrop
16
Övning – implementera metod
public class Square { private int x;
private int y;
private int side;
...
/** Returnerar true om kvadraten har större area än
* kvadraten other, i annat fall returneras false. */
public boolean biggerThan(Square other) {
Övning – implementera metod
public class Square { private int x;
private int y;
private int side;
...
/** Returnerar true om kvadraten har större area än
* kvadraten other, i annat fall returneras false. */
public boolean biggerThan(Square other) { if (getArea() > other.getArea()) {
return true;
} else {
return false;
} }
} 18
Övning – förenkling
public class Square { private int x;
private int y;
private int side;
...
/** Returnerar true om kvadraten har större area än
* kvadraten other, i annat fall returneras false. */
public boolean biggerThan(Square other) { return getArea() > other.getArea();
}
public eller private?
• Man behöver bestämma var ett attribut eller en metod ska kunna användas
• public – kan även användas utanför klassen
• private – kan bara användas inuti klassen
• protected – kan användas i klassen och dess subklasser (mer om detta senare)
• Skriver man inget så betyder det paketsynlighet, dvs, att alla klasser i samma paket kommer åt attributet/metoden
• I regel har man attribut privata och metoder publika
• Men det finns undantag, exempelvis:
• Metoder som bara används inuti klassen kan vara privata
• Attribut som är konstanter kan vara publika (Math.PI osv)
20
Parametrar
... public void move(int dx, int dy) { } ...
...
Parametrar:
• Är variabler som deklareras i metodens parameterlista
• Får plats i minnet då metoden anropas och försvinner när metoden är färdigexekverad
• Får värden vid anropet som kopieras från argumenten
• Är bara åtkomliga inuti den metod som de är deklarerade för
public class Square { private int x;
private int y;
private int side;
public Square(int x, int y, int side) { this.x = x;
this.y = y;
this.side = side;
} }
Konstruktor – alternativ implementation
• Normalt brukar man ha samma parameternamn i konstruktorn som attributnamn
• Eftersom det finns två x behöver man ange om man syftar på parametern (x) eller attributet (this.x)
this är en referens till objektet själv
22
Specifikation
• En specifikation beskriver hur en klass används (hur man skapar objekt, vilka metoder som finns och hur de används). Detta beskrivs typiskt i dokumentation för klassen.
• En specifikation ses som ett kontrakt mellan klassens implementatör och de som använder klassen
/** Skapar en kvadrat med övre vänstra hörnet i x,y och med sidlängden side. */
Square(int x, int y, int side);
/** Ritar kvadraten i fönstret w. */
void draw(SimpleWindow w);
/** Flyttar kvadraten avståndet dx i x-led, dy i y-led. */
void move(int dx, int dy);
/** Tar reda på kvadratens area. */
Checklista
• Förklara begreppen objekt och klass
• Skapa objekt och anropa metoder på dem
• Implementera klasser (med attribut, konstruktorer och metoder)
• Förstå vilka variabler och objekt som finns i ett program och hur de hänger ihop. Visa detta genom att rita en figur över
minnessituationen med variabler och objekt med attribut.
• Förklara begreppen specifikation och implementation
24