Föreläsning 5-6 Innehåll Exempel på program med objekt Skapa och använda objekt Skriva egna klasser public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600, 600, "Square"); System.out.println(sq.getArea()); I programmet skapas och används två objekt: ett SimpleWindow-objekt som beskriver ett fönster på skärmen som man kan rita i. ett Square-objekt som beskriver en kvadrat. Datavetenskap (LTH) Föreläsning 5-6 HT 2017 1 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 2 / 32 Objekt Exempel: kvadratobjekt Objekt motsvarar verkliga eller tänkta saker. kvadrater fönster Attributen är variabler som lagrar objektets data. x x-koordinat för övre vänstra hörnet y y-koordinat för övre vänstra hörnet side sidlängd Ett objekt är en samling data (attribut): En kvadrat har en sidlängd och ett läge (x- och y-koordinat) för övre vänstra hörnet. Ett fönster har bredd och höjd Man kan anropa metoder på objekt: rita kvadraten i ett fönster ta reda arean x y side 20 10 40 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 3 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 4 / 32
Klass Objekt av samma typ beskrivs i en klass. Exempel: klassen Square som beskriver kvadrater. Klassen innehåller attribut och metoder och fungerar som mall för objekten. Exempel: klassen Square (skiss): public class Square { int x; int y; int side; Skapa objekt Man skapar objekt genom att skriva: new Klassnamn(lista med argument) Exempel: Skapa en kvadrat med läget 20,10 och sidlängden 40: new Square(20, 10, 40) Antal argument och deras typer framgår av klassens dokumentation: /** Tar reda på kvadratens area. */ public int getarea() { return side * side; Datavetenskap (LTH) Föreläsning 5-6 HT 2017 5 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 6 / 32 Referensvariabel Referensvariabler När vi skapar ett objekt får vi tillbaka en referens till det. Referensen kan lagras i en variabel. Exempel: Variabeln sq refererar nu till ett kvadratobjekt och kan användas som namn på objektet: En referensvariabel har en klass som typ. Typen bestämmer vilka slags objekt variabeln får referera till. Exempel: Square sq = new Square(20, 10 40); x y side 20 10 40 Square sq = new SimpleWindow(600, 600, "Square"); sq Datavetenskap (LTH) Föreläsning 5-6 HT 2017 7 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 8 / 32
Anropa metoder Diskutera Hitta fel När vi anropar en metod använder vi punktnotation: referens.metodnamn(lista med argument); Exempel: sq.move(30, 10); int a = sq.getarea(); Observera att parenteserna ska vara med även om inga argument ska skickas med. I nedanstående kod finns några fel: Rätta till felen: Square sq = new Square(20, 10); SimpleWindow w = new SimpleWindow(600, 600, "Square"); sq.move(30, 10); System.out.println("Arean: " + w.getarea()); Datavetenskap (LTH) Föreläsning 5-6 HT 2017 9 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 10 / 32 Referenstilldelning Värdet null Objekt i datorns minne En referensvariabel kan även tilldelas värdet null och refererar då inte till något objekt: Square sq = null; sq null Om referensvariablen har värdet null kan man inte anropa en metod på den. sq.move(30, 10); När ett objekt skapas reserveras det plats för objektets attribut i datorns minne. Exempel på hur ett kvadratobjekt lagras i minnet: x 20 y 10 side 40 47540 47544 47548 (Numren på minnescellerna (adresserna) är bara exempel och ingenting vi normalt behöver tänka på.) Datavetenskap (LTH) Föreläsning 5-6 HT 2017 11 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 12 / 32
Referensvariabel och objekt i datorns minne Det som egentligen lagras i en referensvariabel är ett heltal adressen till det objekt referensvariabeln refererar till. Pilen vi ritat i tidigare bild är motsvarar denna adress. Exempel på hur variabeln sq och det kvadratobjekt sq refererar till kan lagras i minnet. sq 47540 5200 x 20 y 10 side 40 47540 47544 47548 Diskutera Fyll i värden på variabler och attribut när följande satser exekverats: Square sq1 = new Square(50, 50, 100); Square sq2 = new Square(10, 10, 20); sq1 = sq2; sq1.move(50, 50); sq1 sq2 x y side x y side Datavetenskap (LTH) Föreläsning 5-6 HT 2017 13 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 14 / 32 Specifikation För att kunna använda en klass måste vi få veta vilka metoder som finns och hur de ska anropas. Detta beskrivs i klassens specifikation. Specifikationen kan ses som ett kontrakt mellan den som implementerat (skrivit koden för) klassen och den som ska använda klassen i sin egen kod. Specifikationen kan se ut på olika sätt, men innehåller en uppräkning av klassens metoder (beskrivning, returtyp, namn, parametrar). Exempel: Specifikation Exempel på specifikation /** 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. */ int getarea(); Datavetenskap (LTH) Föreläsning 5-6 HT 2017 15 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 16 / 32
Övning Viktiga begrepp Klass public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600, 600, "Square"); double area = sq.getarea(); System.out.println(area); Vilka variabler finns i main-metoden? Vilka typer har de? Hur många objekt skapas i programmet? Ge exempel på en metod som anropas. Ge exempel på ett argument. Programkoden delas upp i klasser. Klassen lagras normalt i en egen fil. Det finns klasser som bara innehåller statiska metoder, t.ex. klassen Math. Andra klasser beskriver objekt och innehåller då: attribut de variabler som innehåller objektets data. konstruktor/er och övriga metoder. Klassen fungerar som en mall för objekten. Datavetenskap (LTH) Föreläsning 5-6 HT 2017 17 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 18 / 32 Klass Mönster Klassen Square Attribut public class Klassnamn { public class Square { private int x; private int y; private int side; attribut // deklaration av attribut // konstruktor // övriga metoder Attribut I attributen lagras objektets data. Attributen skapas då objektet skapas (med new ) och finns så länge som objektet finns. Attributen får defaultvärden då de skapas (0, 0.0, null, ). Attributen får användas i hela klassen. Attributen är normalt deklarerade private får bara användas inuti klassen. Datavetenskap (LTH) Föreläsning 5-6 HT 2017 19 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 20 / 32
Klassen Square Metoderna draw och move /** 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); /** Flyttar kvadraten avståndet dx i x-led, dy i y-led. */ public void move(int dx, int dy) { x = x + dx; y = y + dy; public eller private Man måste bestämma var ett attribut eller en metod ska kunna användas: public kan även användas utanför klassen private är bara åtkomligt inuti i klassen protected kan bara åtkomligt i klassen och dess subklasser (kommer senare i kursen) om man inte skriver någon av dessa modifierare får attributet/metoden paketskydd och kan användas av andra klasser i samma paket. I regel är attributen privata och metoderna publika, men undantag finns, t.ex. Metoder som bara ska användas internt inuti klassen ska då deklareras private. Atrribut som är konstanter kan vara avsedda att användas utanför klassen och är då publika, t.ex. Math.PI. Datavetenskap (LTH) Föreläsning 5-6 HT 2017 21 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 22 / 32 Parametrar public void move(int dx, int dy); parametrar Parametrar Parametrar är variabler som deklareras i metodens parameterlista. Parametrarna skapas då metoden anropas och försvinner när metoden är färdigexekverad. Speciellt för parametrar är att de får värden vid anropet av metoden. Argumentets värde kopieras vid anropet in i motsvarande parameter. dx dy 30 10 En parameter är bara åtkomliga inuti den metod den är deklarerad. Anropa metoder på objekt Argument Argument Argument är värden som skickas in till en metod. Exempel: Man vill kunna skapa kvadrater med olika läge och sidlängd,... public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600, 600, "Square"); double area = sq.getarea()); System.out.println(area); argument Datavetenskap (LTH) Föreläsning 5-6 HT 2017 23 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 24 / 32
Klassen Square Metoderna getx, gety och getarea /** Tar reda på x-koordinaten för kvadratens läge. */ public int getx() { return x; /** Tar reda på y-koordinaten för kvadratens läge. */ public int gety() { return y; Metoder som returnerar värden Vissa metoder returnerar ett värde. De har då något annat än void som returtyp. Metoden måste också ha (minst) en return-sats. returtyp public int getarea() { return side * side; /** Tar reda på kvadratens area. */ public int getarea() { return side * side; return-sats Datavetenskap (LTH) Föreläsning 5-6 HT 2017 25 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 26 / 32 Exekvering och metodanrop 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 Konstruktor public Square(int xcoord, int ycoord, int sidelength) { x = xcoord; y = ycoord side = sidelength; DrawSquare public static void main { Square public void draw (SimpleWindow w) { SimpleWindow public void moveto (int x, int y) { attributet side parametern sidelength sq.draw(); w.moveto(x, y); Konstruktor Konstruktorn är en metod med samma namn som klassen Satserna i konstruktorn utförs då objektet skapas (med new ). Konstruktorn innehåller oftast satser för att ge attributen startvärden. Konstruktorn är deklarerad public är åtkomlig utanför klassen. Returtyp ska ej anges. Datavetenskap (LTH) Föreläsning 5-6 HT 2017 27 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 28 / 32
this Övning Implementera klasser Det är vanligt att samma namn används på attribut och parametrar: public Square(int x, int y, int side) { this.x = x; this.y = y; this.side = side; attributet side parametern side Lägg till följande metod i klassen Square: /** Sätter sidlängden till newside */ public void setside(int newside) { this this är en referens till objektet självt. Datavetenskap (LTH) Föreläsning 5-6 HT 2017 29 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 30 / 32 Övning Implementera klasser Checklista Lägg till följande metod i klassen Square: /** Returnerar true om kvadraten har större area än kvadraten other, i annat fall returneras false. */ public boolean biggerthan(square other) { Exempel på vad du ska kunna Förklara begreppen objekt och klass. Skapa objekt och anropa metoder på dem. Implementera klasser (med attribut, konstruktor och övriga 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 implementering. Datavetenskap (LTH) Föreläsning 5-6 HT 2017 31 / 32 Datavetenskap (LTH) Föreläsning 5-6 HT 2017 32 / 32