Föreläsning 3-4 Innehåll Eempel på program med objekt Klass med main-metod Klasser Implementera (skriva programkod för) egna klasser Datatper Undervisningsmoment: föreläsning 3-4 övning 2 laboration 3-5 Avsnitt i läroboken: 3, 5 public class ClickAndDraw { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(200, 200, "A square"); w.waitformouseclick(); Square sq = new Square(w.getMouseX(), w.getmousey(), 40); sq.draw(w); Vad händer när man eekverar programmet? EDAA20 (F3-4 programmering) HT 2016 1 / 42 EDAA20 (F3-4 programmering) HT 2016 2 / 42 Övning Viktiga begrepp Vilka klasser/filer behövs för att köra programmet? Vilka variabler finns i main-metoden? Vilka tper har de? Hur skapar man objekt? Hur många objekt skapas i programmet? Varför står det w framför.waitformouseclick() och sq framför.draw(w)? Ge eempel på en aktuell parameter. Filer med programkod: ClickAndDraw.java klassenmedmain-metoden Square.java klassensquare SimpleWindow.java klassensimplewindow För att köra programmet ClickAndDraw behövs motsvarande.class-filer som skapas vid kompileringen: ClickAndDraw.class Square.class SimpleWindow.class EDAA20 (F3-4 programmering) HT 2016 3 / 42 EDAA20 (F3-4 programmering) HT 2016 4 / 42
Klass Klass Mönster Programkoden delas upp i klasser. Klassen lagras normalt i en egen fil. Objekt av samma slag beskrivs av en klass som innehåller: Deklaration av attribut de variabler som beskriver objektets tillstånd. metoder Klassen fungerar som en mall för objekten. public class Klassnamn { // deklaration av attribut // konstruktor // övriga metoder EDAA20 (F3-4 programmering) HT 2016 5 / 42 EDAA20 (F3-4 programmering) HT 2016 6 / 42 Block Klassen Square Attribut Block Satser som hör ihop. Omges av klammerparenteser { public class Square { private int ; private int ; private int side; attribut Eempel: Satserna i en klass: public class Square { eller satserna som ska repeteras i en for-sats: for (int i = 0; i < 9; i++) { Attribut Attribut är variabler där objektets tillstånd lagras. 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 är bara snliga inuti klassen. EDAA20 (F3-4 programmering) HT 2016 8 / 42 EDAA20 (F3-4 programmering) HT 2016 7 / 42
Klassen Square Metoderna draw och move public eller private /** Ritar kvadraten i fönstret w. */ public void draw(simplewindow w) { w.moveto(, ); w.lineto(, + side); w.lineto( + side, + side); w.lineto( + side, ); w.lineto(, ); /** Flttar kvadraten avståndet d i -led, d i -led. */ public void move(int d, int d) { = + d; = + d; Man måste ange vad som ska vara åtkomligt utanför klassen. public snlig utanför klassen private bara snlig inuti i klassen Iregelärattributenprivataochmetodernapublika. Det kan finnas metoder som bara ska utnttjas internt inuti klassen. De ska då deklareras private. EDAA20 (F3-4 programmering) HT 2016 9 / 42 EDAA20 (F3-4 programmering) HT 2016 10 / 42 Aktuella parametrar (argument) Formella arametrar Aktuella parametrar (argument) Eempel: Parametrar används för att föra in värden till en metod. Man vill skapa kvadrater med olika läge och sidlängd, fltta kvadraten med olika avstånd,... public class DrawSquare { public static void main(string[] args) { SimpleWindow w = new SimpleWindow(600, 600, Square ); Square sq = new Square(20, 10, 40); sq.move(30, 10); sq.draw(w); aktuella parametrar (argument) Formella parametrar De formella parametrarna deklareras i metodens parameterlista. Parametrarna skapas då metoden anropas och försvinner när metoden är färdigeekverad. Värdena på de aktuella parametrarna kopieras vid anropet in i motsvarande formella parametrar. De formella parametrarna är bara åtkomliga inuti metoden. public void move(int d, int d) { formella parametrar tp och namn d d 30 10 EDAA20 (F3-4 programmering) HT 2016 11 / 42 EDAA20 (F3-4 programmering) HT 2016 12 / 42
Klassen Square Metoderna getx, gety och getarea Metoder som returnerar värden /** Tar reda på -koordinaten för kvadratens läge. */ public int getx() { return ; Vissa metoder returnerar ett värde. De har då något annat än void som returtp. Metoden måste också ha (minst) en return-sats. /** Tar reda på -koordinaten för kvadratens läge. */ public int gety() { return ; /** Tar reda på kvadratens area. */ public int getarea() { return side * side; returtp public int getarea() { return side * side; return-sats EDAA20 (F3-4 programmering) HT 2016 13 / 42 EDAA20 (F3-4 programmering) HT 2016 14 / 42 Eekvering och metodanrop Ett anrop av en metod innebär att eekveringen fortsätter med den första satsen i den anropade metoden. När den anropade metoden är klar återupptas eekveringen i den metod där anropet gjordes. public static void main { sq.draw(); public void draw (SimpleWindow w) { w.moveto(, ); public void moveto (int, int ) { Klassen Square Konstruktor /** Skapar en kvadrat med övre vänstra hörnet i, och med sidlängden side. */ public Square(int, int, int side) { this. = ; this. = ; this.side = side; Konstruktor Konstruktorn är en metod med samma namn som klassen, saknar returtp. 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 snlig utanför klassen. EDAA20 (F3-4 programmering) HT 2016 15 / 42 EDAA20 (F3-4 programmering) HT 2016 16 / 42
this this this är en referens till objektet självt. this kan t.e. användas för att nå ett attribut bra vid namnkrockar. Eempel: Det är vanligt att samma namn används på parametrar och på attribut: public Square(int, int, int side) { this. = ; this. = ; this.side = side; parametern side attributet side Implementera en klass Recept Om man har en specifikation av en klass kan man följa dessa steg: Skriv public class { runt om. Deklarera attributen. Implementera konstruktorn och de övriga metoderna. Deklarera attributen private och metoderna public. EDAA20 (F3-4 programmering) HT 2016 17 / 42 EDAA20 (F3-4 programmering) HT 2016 18 / 42 Övning Implementera klasser Övning Implementera klasser Lägg till följande metod i klassen Square: Lägg till en metod i klassen Square som ändrar kvadratens sidlängd: /** Sätter sidlängden till newside */ public void setside(int newside) { /** Returnerar true om kvadraten har större area än kvadraten other, i annat fall returneras false. */ public boolean biggerthan(square other) { EDAA20 (F3-4 programmering) HT 2016 19 / 42 EDAA20 (F3-4 programmering) HT 2016 20 / 42
Klassen Point från datorlab. 3 Specifikation /** Skapar en punkt med koordinaterna,. */ Point(int, int ); /** Tar reda på -koordinaten. */ int getx(); /** Tar reda på -koordinaten. */ int gety(); /** Flttar punkten avståndet d i -led och d i -led. */ void move(int d, int d); /** Beräknar avståndet mellan denna punkt och punkten p. */ double distanceto(point p); /** Returnerar en teckensträng som representerar punkten. Strängen innehåller koordinaterna. E: 150 200 */ String tostring(); EDAA20 (F3-4 programmering) HT 2016 21 / 42 Klassen Point implementering Klassen Point Implementering public class Point { private int ; private int ; /** Skapar en punkt med koordinaterna och. */ public Point(int, int ) { this. = ; this. = ; /** Tar reda på -koordinaten. */ public int getx() { return ; /** Tar reda på -koordinaten. */ public int gety() { return ; EDAA20 (F3-4 programmering) HT 2016 22 / 42 Hur komma åt den andra punktens attribut? /** Flttar punkten avståndet d i -led och d i -led. */ public void move(int d, int d) { = + d; = + d; /** Beräknar avståndet mellan denna punkt och punkten p. */ public double distanceto(point p) { return Math.hpot( - p., - p.); Koordinaterna för det punkt-objekt metoden utförs på når vi som vanligt via attributen och. För att nå det andra objektets koordinater kan vi använda metoderna i Point: Math.hpot( - p.getx(), - p.gety()) Vi kan också nå det andra punkt-objektets attribut direkt: /** Returnerar en teckensträng som representerar punkten. Strängen innehåller koordinaterna. E: 150 200 */ public String tostring(){ return + " " + ; Math.hpot( - p., - p.) Detta beror på att attributen är privata för klassen, inte för ett specifikt objekt. Detta fungerar alltså eftersom p har tpen Point och metoden distanceto finns i klassen Point. EDAA20 (F3-4 programmering) HT 2016 23 / 42 EDAA20 (F3-4 programmering) HT 2016 24 / 42
Klassen Math Klassen Math innehåller metoder för att beräkna kvadratrot, sinus, cosinus etc. Där finns också konstanterna Math.PI och Math.E (e = 2.718... ) Metoden double hpot(double a, double b) som beräknar p a 2 + b 2 kan användas när man beräknar avståndet mellan två punkter. Eempel: Math.hpot( - p., - p.) Statiska attribut och metoder Attributen och metoderna i klassen Math är statiska. De är inte knutna till något objekt utan finns bara i en upplaga för klassen. Man når statiska storheter med Klassnamn.namn, inte referens.namn. Eempel: double result = Math.pow(10, 4); Inuti klassen Math ser det ut så här: public class Math { public static final double PI = 3.14159265358979323846; /** beräknar av a upphöjt till b */ public static double pow(double a, double b) { EDAA20 (F3-4 programmering) HT 2016 25 / 42 EDAA20 (F3-4 programmering) HT 2016 26 / 42 Konstanter Metoden tostring() Det är vanligt att man lägger till en metod tostring() i en klass: Man kan deklarera konstanter för värden som inte ska ändras. Eempel: static final double PI = 3.14159265358979323846; static final int NBR_CARDS = 52; static behöverbarafinnasienupplaga final värdetfårinteändras public String tostring(){ return + " " + ; Metoden tostring() ska returnera en sträng som representerar objektet och som används vid utskrifter. Metoden tostring() anropas inuti print() och println() när man skriver ut ett objekt: Sstem.out.println(sq); Metoden tostring används också inifrån debuggern. EDAA20 (F3-4 programmering) HT 2016 27 / 42 EDAA20 (F3-4 programmering) HT 2016 28 / 42
String String Datatp för teckensträngar String är egentligen en klass och teckensträngar är egentligen objekt. Men man kan skapa teckensträngar utan att använda new: String s = "En massa tecken"; Program som använder punkter Eempel public class ComputeDistance { public static void main(string[] args) { Point p1 = new Point(50, 20); Point p2 = new Point(25, 35); double dist = p1.distanceto(p2); Sstem.out.println(dist); 50 20 Man kan konkatenera (slå ihop) en sträng med en annan sträng eller med ett värde av en annan tp. Resultatet blir en n sträng. + " " + p1 p2 dist 29.154 25 35 EDAA20 (F3-4 programmering) HT 2016 29 / 42 EDAA20 (F3-4 programmering) HT 2016 30 / 42 Vad är tillgängligt inuti en metod? public class Point private int ; private int /** Beräknar avståndet mellan denna punkt och punkten p. */ public double distanceto(point p) { return Math.hpot( - p., - p.); Lokal variabel Alternativ implementering av metoden distanceto där avstånden i - och -led lagras i lokala variabler: /** Beräknar avståndet mellan denna punkt och punkten p. */ public double distanceto(point p) { int Dist = - p.; int Dist = - p.; return Math.hpot(Dist, Dist); Inuti metoden distanceto får vi använda attributen och. metodens parametrar p. lokala variabler deklarerade inuti metoden finns inga i eemplet. Lokala variabler En lokal variabel skapas när deklarationen eekveras och försvinner när det block den är deklarerad i är färdigeekverat. Innan man använder en lokal variabel måste man ge den ett startvärde. En lokal variabel är endast åtkomlig i det block där den är deklarerad (från det den är deklarerad). EDAA20 (F3-4 programmering) HT 2016 31 / 42 EDAA20 (F3-4 programmering) HT 2016 32 / 42
Parametrar och lokala variabler i datorns minne Aktiveringspost Vid varje anrop av en metod reserveras plats i minnet för metodens parametrar och lokala variabler (variabler som deklareras inuti metoden). Detta minnesutrmme kallas för aktiveringspost. När man lämnar metoden strks aktiveringsposten. Eempel: När metoden distanceto eekveras skapas en aktiveringspost som innehåller den formella parametern p. Övning Implementera klasser Lägg till en metod i klassen Point som returnerar mittpunkten mellan punkten och punkten p. /** Returnerar mittpunkten mellan punkten och punkten p. */ public Point midpoint(point p) { formell parameter p 25 35 EDAA20 (F3-4 programmering) HT 2016 33 / 42 EDAA20 (F3-4 programmering) HT 2016 34 / 42 Program som använder punkter Eempel 2 En klass kan implementeras på olika sätt Alternativ 1 public class CreateMidpoint { public static void main(string[] args) { Point p1 = new Point(100, 100); Point p2 = new Point(300, 50); Point m = p1.midpoint(p2); Sstem.out.println("Mittpunkten: " + m); 100 p1 p2 m 200 75 100 300 50 Läget hos en kvadrat kan representeras av två heltal - och -koordinat för övre vänstra hörnet: public class Square { private int ; private int ; private int side; /** Skapar en kvadrat med övre vänstra hörnet i, och med sidlängden side. */ public Square(int, int, int side) { this. = ; this. = ; this.side = side; side 20 10 40 EDAA20 (F3-4 programmering) HT 2016 35 / 42 EDAA20 (F3-4 programmering) HT 2016 36 / 42
En klass kan implementeras på olika sätt Alternativ 2 Datatper Läget hos en kvadrat kan representeras av en punkt: public class Square { private Point location; // övre vänstra hörnet private int side; // sidlängd /** Skapar en kvadrat med övre vänstra hörnet i, och med sidlängden side. */ public Square(int, int, int side) { location = new Point(, ); this.side = side; location side 40 20 10 De data som behandlas i ett program är av olika tper, t.e. heltal, flttal, referenser Eempel: int sum = 0; double d = 12.7; boolean read = false; char blank = ; Square sq = new Square(10, 10, 50); EDAA20 (F3-4 programmering) HT 2016 37 / 42 EDAA20 (F3-4 programmering) HT 2016 38 / 42 Primitiva datatper Konvertering mellan int och double bte heltal (-128+127) short heltal (-32768+32767) int heltal (-2147483648+2147483647) long heltal (ca -9*1018 +9*1018) float flttal tal (tal med decimaldel) double flttal tal (tal med decimaldel) boolean logiska värden (true eller false) char tecken Ett int-värde får plats i en variabel av tpen double: double d = 42; Tvärtom går inte utan konvertering eller avrundning: Konvertering till int: double d = 42.87; int a = (int) d; // talet avkortas till 42 sum d read blank 0 12.7 false ' ' Avrundning till närmaste heltal: double d = 42.87; int b = (int) Math.round(d); // talet avrundas till 43 Metoden round ger ett resultat av tpen long som måste konverteras till tpen int. EDAA20 (F3-4 programmering) HT 2016 39 / 42 EDAA20 (F3-4 programmering) HT 2016 40 / 42
Referens Checklista Eempel: Square sq; String s; Referensvariabler kan innehålla en referens till objekt, d.v.s. adressen till det område i minnet där objektet lagras. sq = new Square(10, 10, 50); sq En referensvariabel kan också tilldelas värdet null. sq = null; sq null Eempel på vad du ska kunna Förklara begreppen: objekt, klass, specifikation, implementering. Implementera enkla klasser (med attribut, konstruktor och övriga metoder). Rita figur över minnessituationen med variabler och objekt med attribut (d.v.s. visa att du förstår vilka variabler och objekt som finns och hur de hänger ihop). Förklara begreppet datatp EDAA20 (F3-4 programmering) HT 2016 41 / 42 EDAA20 (F3-4 programmering) HT 2016 42 / 42