• No results found

EDAA20 Programmering och databaser. Föreläsning 6 Klasser , Niklas

N/A
N/A
Protected

Academic year: 2022

Share "EDAA20 Programmering och databaser. Föreläsning 6 Klasser , Niklas"

Copied!
24
0
0

Loading.... (view fulltext now)

Full text

(1)

EDAA20

Programmering och databaser

Föreläsning 6 – Klasser

2021-09-14, Niklas Fors, @Zoom

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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)

(8)

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

(9)

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

(10)

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

(11)

Ö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

(12)

Ö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

(13)

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.

(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) {

} }

x,y

x,y+side x+side,y+side x+side,y

(0, 0)

x

y

14

(15)

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

(16)

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

(17)

Ö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) {

(18)

Ö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

(19)

Ö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();

}

(20)

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

(21)

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

(22)

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

(23)

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. */

(24)

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

References

Related documents

Myndighetsnämnden måste ha fått din skrivelse inom tre veckor från den dag då justerat protokoll med beslutet har satts upp på kommunens anslagstavla, annars kan ditt

• Notera att vi inte har skapat Dice-objekten än, utan enbart en vektor med plats för 5 referensvariabler som inte pekar på något (null). dices null

Det finns en färdig klass Random för att generera slumptal.. Övning

Bra konsistens; fast gel, mild smak, mjölig, smältande fruktkött men för lite

”Då staten aktivt delar ut ekonomiska stöd i form av subventioner, lån och skatte- undantag finns det en risk att dessa medel inte går till de företag som har mest nytta av dem,

Det är även viktigt att tänka på kriteriets eller kravets exakta roll i processen, är det för att sålla bort sådana projekt som aldrig borde få stöd, alla välja ut de

Input Feature: Valde planområdet då jag vill ha ett index som täcker det området Bockade för ”Generate Polygon Grid that intersects input feature layers or datasets…”

• static - Metoden hör till klassen och anropas inte på något objekt (senare kommer vi att skriva metoder utan static).. public static int sumTo(int n)