Föreläsning Innehåll. Checklista. Några metoder i klassen ArrayList<E> Exempel på vad du ska kunna

Relevanta dokument
Föreläsning Innehåll. Generisk klass. Några metoder i klassen ArrayList<E>

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Föreläsning 13 Innehåll

Objektorienterad programmering (OOP) Föreläsning 15 & 16. Klasser för olika slags fordon. Klasser och objekt

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Saker du ska kunna Föreläsning 13 & 14

Föreläsning 5-6 Innehåll

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning REPETITION & EXTENTA

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

Föreläsning 2 Innehåll

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Objekt-orientering. Java är ett objekt-orienterat programmeringsspråk

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Exempel på program med objekt Klass med main-metod. Föreläsning 3-4 Innehåll. Övning Viktiga begrepp

Föreläsning 9-10 Innehåll

1 Repetition av viktiga begrepp inom objektorienterad programmering

Repetition av viktiga begrepp inom objektorienterad programmering

OOP Objekt-orienterad programmering

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Datastrukturer. Föreläsning Innehåll. Program med vektor Exempel. Deklarera vektorer

Mål Förklaring av termer

Mål Förklaring av termer

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Föreläsning 2 Innehåll

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Föreläsning 3-4 Innehåll

Classes och Interfaces, Objects och References, Initialization

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

TDDD78 Viktiga begrepp, del 2

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 4 Innehåll

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Tvådimensionella fält

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

OOP Objekt-orienterad programmering

Konstruktion av klasser med klasser

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Föreläsning 9 Innehåll

EDAA30 Programmering i Java - fortsättningskurs

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

OOP Objekt-orienterad programmering

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

TENTAMEN OOP

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Klasshierarkier - repetition

Objektorienterad programmering i Java

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

Arrayer. results

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Föreläsning 1 Innehåll

TENTAMEN OOP

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

2. Betrakta följande program, där fyra heltal läses från tangentbordet och några (ointressanta) beräkningar görs:

DAT043 - föreläsning 8

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Kopiering av objekt i Java

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Laboration 1: Figurer i hierarki

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Objektorienterad programmering med Java, Generics

Malmö högskola 2007/2008 Teknik och samhälle

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Programmering för språkteknologer II, HT2014. Rum

Objektorienterad Programmering (TDDC77)

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Del A (obligatorisk för alla)

Transkript:

Föreläsning 13-15 Innehåll Checklista Klassen ArrayList<E> Arv Undervisningsmoment: föreläsning 13-15 övning 5 laboration 9-10 Avsnitt i läroboken: 12.1-3, 12.8, 9.1-9.6, 10 Avsnitt 12.6 och 12.10 ingår inte i kursen, men är bra att läsa om du fortsätter med programmering på egen hand eller i någon annan kurs. Exempel på vad du ska kunna Förklara begreppet generisk klass. Använda klassen ArrayList<E>. Förstå och rita enkla UML-diagram. Förklara begreppen: arv, superklass, subklass, abstrakta klasser och metoder. Implementera superklasser och subklasser. EDAA20 (F13-15 programmering) HT 2015 1 / 52 EDAA20 (F13-15 programmering) HT 2015 2 / 52 Klassen ArrayList<E> Några metoder i klassen ArrayList<E> /** Skapar en tom lista. */ ArrayList(); Klassen ArrayList<E> är en standardklass (i paketet java.util). innehåller alltid objekt (inte int, double,... ). lagrar internt sina element i en vektor. utökar vektorns storlek vid behov. har metoder för att sätta in och ta bort element... /** Returnerar elementet på plats pos. */ E get(int pos); /** Lägger in obj sist. */ void add(e obj); /** Tar bort elementet på plats pos, returnerar det borttagna elementet. */ E remove(int pos); /** Returnerar antalet element. */ int size(); EDAA20 (F13-15 programmering) HT 2015 3 / 52 EDAA20 (F13-15 programmering) HT 2015 4 / 52

Generisk klass ArrayList<E> är en generisk klass och kan innehålla objekt av godtycklig typ. En generisk klass har en eller flera typparametrar. När en generisk klass används ersätts typparametrarna med klassnamn. Exempel där vi skapar en lista som kan innehålla Point-objekt och sätter in tre punkter i listan: ArrayList<Point> vertices = new ArrayList<Point>(); vertices.add(new Point(50, 50)); Vertices.add(new Point(50, 10)); Vertices.add(new Point(30, 40)); EDAA20 (F13-15 programmering) HT 2015 5 / 52 Traversera alla elementen i listan x y vertices 10 10 x y 50 10 Listan vertices innehåller punkter. Skriv programkod för att flytta punkterna 10 pixels i x-led och 20 i y-led. Använd metoden void move(int dx, int dy) från klassen Point för att flytta en punkt. x y 30 40 Traversera alla elementen i listan Mönster Uppgift: Behandla alla elementen i listan list. Algoritm: för varje element i listan { använd elementet Exempel, där list är en lista av typen ArrayList<Integer>: int sum = 0; for (int i = 0; i < list.size(); i++) { sum = sum + list.get(i); Anm: Detta sätt att traversera en lista fungerar bra då man använder ArrayList<E>. I Java finns flera olika klasser för att hålla reda på en samling med element. Om man använder en annan samlingsklass passar inte ovanstående sätt att traversera genom elementen. Man får använda en for-each -sats eller iterator istället (avsnitt 12.10). EDAA20 (F13-15 programmering) HT 2015 6 / 52 Traversera alla elementen i listan Alternativ Man kan också använda en for-each -sats för att traversera genom elementen. Exempel: for (Point p : vertices) { p.move(10, 20); int sum = 0; for (int nbr : list) { sum = sum + nbr; // för varje punkt p i vertices // för varje heltal nbr i list Anm: Detta sätt att traversera en lista fungerar bra för alla Javas samlingsklasser. Man får dock inte ändra i listan (med add, remove etc.) medan man itererar genom listan på detta sätt. EDAA20 (F13-15 programmering) HT 2015 7 / 52 EDAA20 (F13-15 programmering) HT 2015 8 / 52

Vektor vs Arraylist<E> ArrayList<E> passar bra när antal element inte är bestämt. Klassen har färdiga metoder för att lägga till element, ta bort element... En vektor passar bra när man på förhand vet antal element. Exempel: en kortlek med 52 kort: Card[] deck = new Card[52]; en samling räknare vid registrering int[] nbrs = new int[6]; Observera att ett ArrayList är en lista och inte en vektor (även om det internt i objektet används en vektor för att lagra elementen.) En nyskapad list är tom från början. Ett anrop av metoden size() på en nyskapad lista ger resultatet 0. En nyskapad vektor har däremot redan från början det antal element som angavs vid skapandet. Elementen har startvärden (0, 0.0, null etc. beroende på typ). EDAA20 (F13-15 programmering) HT 2015 9 / 52 ArrayList kan bara innehålla objekt Exempel: polygoner Klassen Polygon public class Polygon { private ArrayList<Point> vertices; /** Skapar en polygon. */ public Polygon() { vertices = new ArrayList<Point>(); /** Lägger till en ny punkt med koordinaterna x, y. */ public void addvertex(int x, int y) { vertices.add(new Point(x, y)); /** Flyttar polygonen avståndet dx i x-led, dy i y-led. */ public void move(int dx, int dy) { for (int i = 0; i < vertices.size(); i++) { vertices.get(i).move(dx, dy); EDAA20 (F13-15 programmering) HT 2015 10 / 52 Typklasser Om man vill lagra heltal, reella tal etc. måste man använda motsvarande typklass: inte ArrayList<Integer> list = new ArrayList<Integer>(); list.add(2); ArrayList<int> list = new ArrayList<int>(); Primitiva typer i Java: boolean short int long char byte float double Motsvarande typklasser: Boolean Short Integer Long Character Byte Float Double EDAA20 (F13-15 programmering) HT 2015 11 / 52 EDAA20 (F13-15 programmering) HT 2015 12 / 52

Autoboxing - unboxing int vs Integer Automatisk konvertering mellan primitiv datatyp och motsvarande typklass. Exempel: Integer i = 12; // Autoboxing till Integer-objekt Observera skillnaden mellan typerna int (primitiv datatyp) och Integer (klass). Exempel: int a = 12; Integer b = 12; // autoboxing ArrayList<Integer> list = new ArrayList<Integer>(); list.add(12); // autoboxing int n = list.get(0); // unboxing a b 12 12 b är en referensvariabel som kan referera till ett Integer-objekt. EDAA20 (F13-15 programmering) HT 2015 13 / 52 EDAA20 (F13-15 programmering) HT 2015 14 / 52 Sökmetoder i ArrayList<E> Det finns färdiga metoder för att söka i en lista: /** Söker upp ett element som matchar obj. Returnerar true om sådant element element finns, annars false. */ boolean contains(object obj); /** Söker upp ett element som matchar obj. Returnerar index för elementet, -1 om elementet inte fanns. */ int indexof(e obj); Det ingår inte i kursen att använda dessa. Orsaken är att det i dessa metoder används en metod boolean equals(object obj) för att jämföra två element. Du kan inte använda dessa metoder för att söka i listan om du inte sett till att det finns en korrekt equals-metod i klassen som ersätter E. En sådan equals-metod finns i Javas typklasser samt i klassen String. Att t.ex. anropa contains på en lista av typen ArrayList<Integer> eller ArrayList<String> är alltid ok. EDAA20 (F13-15 programmering) HT 2015 15 / 52 Övning Sökning Lägg till följande metod i klassen Polygon: /** Undersöker om polygonen har någon hörnpunkt med koordinaterna x, y. */ boolean hasvertex(int x, int y) { EDAA20 (F13-15 programmering) HT 2015 16 / 52

Insättning i sorterad följd Insättning i sorterad följd Exempel: ArrayList<String> wordlist= new ArrayList<String>(); wordlist.add("apelsin"); wordlist.add("banan"); wordlist.add("druva"); wordlist.add("enbär"); Uppgift: Lägg till ordet word idenredansorteradelistan. Lösning: Sök efter platsen för word, dvs. sök efter det första ord som är större än eller lika med word. Lägg in word ilistan: int pos = 0; while (pos < wordlist.size() && wordlist.get(pos).compareto(word) < 0) { pos++; wordlist.add(pos, word); wordlist "apelsin" "banan" "druva" "enbär" word "citron" wordlist "apelsin" "banan" "citron" "druva" "enbär" EDAA20 (F13-15 programmering) HT 2015 17 / 52 EDAA20 (F13-15 programmering) HT 2015 18 / 52 Insättning i sorterad följd Alternativ Klassdiagram UML Lösning: Sök efter platsen för word, dvs. sök efter det första ord som är större än eller lika med word. Lägg in word ilistan: int pos; for (pos = 0; pos < wordlist.size(); pos++) { if (wordlist.get(pos).compareto(word) >= 0) { break; wordlist.add(pos, word); Unified Modelling Language kan användas för att beskriva klasser och relationer mellan klasser. används även vid design av databaser. Klassdiagram, exempel: En kortlek kan innehålla många kort. Ett kort ingår i en kortlek. Carddeck 1 * Card suit rank wordlist "apelsin" "banan" "citron" "druva" "enbär" EDAA20 (F13-15 programmering) HT 2015 19 / 52 EDAA20 (F13-15 programmering) HT 2015 20 / 52

Arv Exempel Problem Antag att vi i ett program hanterar olika slags fordon: public class Car { public class Bus { private String licensenbr; private String licensenbr; private Person owner; private Person owner; private int maxpassengers; private int maxpassengers; public class Truck { public class MotorCycle { private String licensenbr; private String licensenbr; private Person owner; private Person owner; private int maxload; De olika slagen fordon har olika egenskaper och beskrivs i var sin klass: Car, Truck, Bus och MotorCycle. Antag att vi vill simulera en kö framför ett trafikljus. Kön representeras av en lista eller en vektor med fordon. Hur ska vi deklarera en sådan lista eller vektor? Vilken typ har elementen? EDAA20 (F13-15 programmering) HT 2015 21 / 52 EDAA20 (F13-15 programmering) HT 2015 22 / 52 Lösning Arv Klassdiagram Vi behöver en klass som beskriver fordon: Vehicle Då kan vi skapa listor och vektorer som kan innehålla olika slags fordon: ArrayList<Vehicle> list = new ArrayList<Vehicle>(); Vehicle[] v = new Vehicle[100]; Vehicle superklass Men får vi sätta in t.ex. Car-objekt i list eller v? Ja, om Car ärver klassen Vehicle: Car Truck Bus MotorCycle public class Car extends Vehicle { subklass EDAA20 (F13-15 programmering) HT 2015 23 / 52 EDAA20 (F13-15 programmering) HT 2015 24 / 52

Referensvariabler och arv Superklass En referensvariabel som deklarerats med typen C får referera till objekt av klassen C och dessutom till objekt av alla subklasser till C. Exempel: En variabel med typen Vehicle får referera till objekt av alla subklasser till Vehicle. Vehicle avehicle; avehicle = new Car("ABC123", p1, 5); avehicle = new Bus("DEF789", p2, 56); Låt superklassen Vehicle innehålla de attribut och metoder som är gemensamma för alla fordon. Klasserna Car, Truck, Bus och MotorCycle får ärva dessa attribut och metoder från klassen Vehicle. public abstract class Vehicle { private String licensenbr; private Person owner; EDAA20 (F13-15 programmering) HT 2015 25 / 52 EDAA20 (F13-15 programmering) HT 2015 26 / 52 Abstrakta klasser Subklasser I program som använder våra fordonsklasser kommer vi inte att skapa objekt av klassen Vehicle, utan bara av klasserna Car, Truck, Bus och MotorCycle. I verkligheten finns bilar, bussar, lastbilar och motorcyklar, men på vägarna kör det inte omkring någonting som bara är fordon. Superklasser man inte ska skapa objekt av kallas abstrakta klasser. public abstract class Vehicle { Kvar i respektive subklass är de attribut och metoder som är specifika för just det fordonet. public class Car extends Vehicle { private int maxpassengers; public class Bus extends Vehicle { private int maxpassengers; public class Truck extends Vehicle { private int maxload; EDAA20 (F13-15 programmering) HT 2015 27 / 52 EDAA20 (F13-15 programmering) HT 2015 28 / 52

Arv Klassdiagram Objekt innehåller både ärvda och egna attribut Exempel: Car-objekt Car maxpassengers Vehicle licensenbr owner Bus maxpassengers Truck maxload MotorCycle Deklareras i superklassen Vehicle Deklareras i subklassen Car licensenbr owner maxpassengers "ABC123" 5 EDAA20 (F13-15 programmering) HT 2015 29 / 52 EDAA20 (F13-15 programmering) HT 2015 30 / 52 En klass kan vara både superklass och subklass Klassdiagram Vehicle licensenbr owner Konstruktorer i superklasser Vehicle har en konstruktor (fast vi inte ska skapa Vehicle-objekt.) Den kommer att anropas inuti subklassernas konstruktorer. Inuti konstruktorn ges startvärden till de attribut som är deklarerade i Vehicle. PassengerVehicle maxpassengers Car Bus Truck maxload MotorCycle public abstract class Vehicle { private String licensenbr; private Person owner; /** Initierar ett Vehicle-objekt med registreringsnumret licensenbr och ägaren owner. */ protected Vehicle(String licensenbr, Person owner) { this.licensenbr = licensenbr; this.owner = owner; EDAA20 (F13-15 programmering) HT 2015 31 / 52 EDAA20 (F13-15 programmering) HT 2015 32 / 52

public, private eller protected Konstruktorer i subklasser Genom att lägga till satsen super() först i konstruktorn ser man till att superklassens konstruktor utförs. I klassen måste man tala om vilka storheter som ska vara åtkomliga utanför klassen. public åtkomlig utanför klassen private endast åtkomlig inuti i klassen protected åtkomlig i klassen och i alla dess subklassser Ofta är attribut och konstruktorer i superklasser deklarerade protected. public class Truck extends Vehicle { private int maxload; /** Skapar ett Truck-objekt med registreringsnumret licensenbr, ägaren owner och maxlasten maxload. */ public Truck(String licensenbr, Person owner, int maxload) { super(licensenbr, owner); this.maxload = maxload; EDAA20 (F13-15 programmering) HT 2015 33 / 52 EDAA20 (F13-15 programmering) HT 2015 34 / 52 Fördelar med arv Klassen Object Modellen beskriver det verkliga systemet bättre. Gemensamma attribut och metoder behöver bara skrivas en gång i superklassen. Vi kan deklarera referensvariabler som får referera till objekt av alla de olika subklasserna. Exempel: ArrayList<Vehicle> list = new ArrayList<Vehicle>(); list.add(new Car("ABC123", p1, 5)); list.add(new Bus("DEF789", p2, 56)); I Java finns en klass Object som är superklass till alla andra klasser. En referensvariabel av typen Object kan alltså referera till objekt av alla typer. Exempel: Object obj = new Car("ABC123", p1, 5); I klassen Object finns det några metoder (t.ex. tostring och equals) som alla andra klasser ärver. EDAA20 (F13-15 programmering) HT 2015 35 / 52 EDAA20 (F13-15 programmering) HT 2015 36 / 52

Metoden tostring i klassen Object I klassen Object finns metoden: /** Skapar en "läsbar representation" av objektet. */ String tostring(); När man skriver ut ett objekt, t.ex: Car c = new Car("ABC123", p1, 5); System.out.println(c); så är det metoden tostring som används inuti println. Man kan definiera om (skugga) metoden tostring så att man får exakt den utskrift man vill ha. Man kan t.ex. lägga till följande metod i klassen Car: public String tostring() { return licensenbr; EDAA20 (F13-15 programmering) HT 2015 37 / 52 Metoden equals i klassen Object I klassen Object finns metoden: /** Undersöker om detta objekt är lika med obj. */ boolean equals(object obj); Metoden equals i Object fungerar likadant som ==, dvs. jämför referenser. I följande exempel returnerar equals därför värdet false trots att bägge bilarna har samma värden på attributen: Car c1 = new Car("ABC123", p1, 5); Car c2 = new Car("ABC123", p1, 5); c1.equals(c2) "ABC123" Man kan själv definiera om (skugga) metoden equals så att den jämför innehållet i objekten istället. Detta är gjort i Javas typklasser och i klassen String. c1 c2 "ABC123" EDAA20 (F13-15 programmering) HT 2015 38 / 52 Exempel: geometriska figurer När ska arv användas? I ett program ska geometriska figurer (kvadrater och cirklar) hanteras. Figurerna ska kunna flyttas och ritas upp på skärmen. Figurerna ska kunna ritas i ett SimpleWindow-fönster. Figurerna ska kunna flyttas. För att beskriva en figurs läge ska klassen Point användas. Arv passar bra när man har en är en -relation mellan klasser. En kvadrat är en slags figur. En cirkel är en slags figur. Vilka klasser behövs? Hur ska arv användas? EDAA20 (F13-15 programmering) HT 2015 39 / 52 EDAA20 (F13-15 programmering) HT 2015 40 / 52

Här ska arv inte användas public class Point { private int x, y; public Point(int x, int y) { this.x = x; this.y = y; public void move(int dx, int dy) { x = x + dx; y = y + dy; Ska klassen Point vara superklass till klassen Shape så att klassen Shape kan ärva attributen x, y och metoden move? Nej! En figur är inte en slags punkt. EDAA20 (F13-15 programmering) HT 2015 41 / 52 Superklassen Shape Sammansättning En figur har en punkt som anger figurens läge. public abstract class Shape { protected Point location; protected Shapes(int x, int y) { location = new Point(x, y); public void move(int dx, int dy) { location.move(dx, dy); // figurens läge EDAA20 (F13-15 programmering) HT 2015 42 / 52 Subklassen Square Subklassen Circle public class Square extends Shape { private int side; public Square(int x, int y, int side) { super(x, y); this.side = side; public int getside() { return side; public class Circle extends Shape { private int radius; public Circle(int x, int y, int radius) { super(x, y); this.radius = radius; public int getradius() { return radius; public void draw(simplewindow w) { // rita fyra linjer i en kvadrat public void draw(simplewindow w) { // rita många linjer i en cirkel EDAA20 (F13-15 programmering) HT 2015 43 / 52 EDAA20 (F13-15 programmering) HT 2015 44 / 52

Exempel på arv: geometriska figurer Typregler för arv Uppgift Shape location move(int, int) En referensvariabel som deklarerats med typen C får referera till objekt av klassen C och dessutom till objekt av alla subklasser till C. Shape s; Circle c; Square side draw(simplewindow) Circle radius draw(simplewindow) Vilka tilldelningssatser är korrekta? 1 c = new Circle(100, 100, 50); 2 s = new Circle(100, 100, 50); 3 c = new Square(100, 100, 50); 4 s = new Square(100, 100, 50); EDAA20 (F13-15 programmering) HT 2015 45 / 52 EDAA20 (F13-15 programmering) HT 2015 46 / 52 Flytta figurerna Rita figurerna Antag att det i en vektor shapes finns 100 figurer lagrade. Flytta alla figurerna 10 pixels i x-led och 20 pixels i y-led. Shape[] shapes = new Shape[100]; // 100 figurer av olika slag läggs in i vektorn for (int i = 0; i < shapes.length; i++) { shapes[i].move(10, 20); Alla figurer flyttas på samma sätt. Metoden move implementeras därför i superklassen Shape. Antag att det i en vektor shapes finns 100 figurer lagrade. Rita alla figurerna. Shape[] shapes = new Shape[100]; // 100 figurer av olika slag läggs in i vektorn for (int i = 0; i < shapes.length; i++) { shapes[i].draw(w); Kvadrater och cirklar ritas på olika sätt. Metoden draw måste därför implementeras i subklasserna Square respektive Circle. EDAA20 (F13-15 programmering) HT 2015 47 / 52 EDAA20 (F13-15 programmering) HT 2015 48 / 52

Problem med metoden draw Ok: Square sq = new Square(100, 100, 50); sq.draw(w); Ok: Shape s = new Square(100, 100, 50); s.move(10, 20); Borde fungera, men fungerar inte ännu: Shape s = new Square(100, 100, 50); s.draw(w); Eftersom s är deklarerad med typen Shape så söker kompilatorn i klassen Shape och uppåt i arvshierarkin efter draw. Men metoden draw finns inte där. Istället är draw implementerad i subklasserna Square och Circle. Lösning abstrakt metod För att vi ska kunna skriva s.draw() och shapes[i].draw() måste det finnas en metod draw i klassen Shape. Lösningen är att deklarera draw som en abstrakt metod. public abstract class Shape { protected Point location; protected Shapes(int x, int y) { location = new Point(x, y); public void move(int dx, int dy { x = x + dx; y = y + dy; public abstract void draw(simplewindow w); EDAA20 (F13-15 programmering) HT 2015 49 / 52 EDAA20 (F13-15 programmering) HT 2015 50 / 52 Dynamisk bindning Objektuttrycken this och super Java använder dynamisk bindning vid metodanrop. Det innebär att det är objektets typ som under exekveringen avgör vilken metod som ska anropas. När satsen shapes[i].draw(w) ska utföras undersöker Java-systemet objektet shapes[i]. Om det är ett Square-objekt så anropas draw i Square, om det är ett Circle-objekt så anropas draw i Circle. this Referens till det aktuella objekt. super Referens till det aktuella objekt, men har superklassens typ. EDAA20 (F13-15 programmering) HT 2015 51 / 52 EDAA20 (F13-15 programmering) HT 2015 52 / 52