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

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

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

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

Föreläsning 13 Innehåll

Föreläsning 9-10 Innehåll

Föreläsning 5-6 Innehåll

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

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.

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

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

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

Föreläsning 3-4 Innehåll

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

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

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

OOP Objekt-orienterad programmering

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

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

Föreläsning 2 Innehåll

Repetition av OOP- och Javabegrepp

1 Repetition av viktiga begrepp inom objektorienterad programmering

Repetition av OOP- och Javabegrepp

Repetition av viktiga begrepp inom objektorienterad programmering

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

Mål Förklaring av termer

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

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

Mål Förklaring av termer

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

TDDD78 Viktiga begrepp, del 2

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

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

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

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

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

Del A (obligatorisk för alla)

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Konstruktion av klasser med klasser

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

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

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

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

Föreläsning 2 Innehåll

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

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

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

Arrayer. results

Tentamen, EDAA20/EDA501 Programmering

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

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

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

Exempel på användning av arv: Geometriska figurer

Objekt som argument. Föreläsning 7-8 Innehåll. Hur komma åt den andra kvadratens attribut? Anropa metod på objektet självt

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

EDAA30 Programmering i Java - fortsättningskurs

Klasshierarkier - repetition

TENTAMEN OOP

Föreläsning 7-8 Innehåll

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

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

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

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

Grundläggande programmering med C# 7,5 högskolepoäng

TENTAMEN OOP

Objektorienterad programmering i Java

OOP Objekt-orienterad programmering

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning 9 Innehåll

F4. programmeringsteknik och Matlab

Del A (obligatorisk för alla)

OOP Objekt-orienterad programmering

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

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

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

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Laboration 1: Figurer i hierarki

Föreläsning 10 OM DELMÅLSKONTROLLEN ; VARIABLERS SYNLIGHET STRING OCH STRINGBUILDER

Tentamen OOP

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tvådimensionella fält

DAT043 - föreläsning 8

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

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

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

Transkript:

Föreläsning 13-15 Innehåll Klassen ArrayList<E> Klassen ArrayList<E> Inläsning från textfil, utskrift på textfil Arv Undervisningsmoment: föreläsning 13-15 övning 5 laboration 9-10 Avsnitt i läroboken: 12.1-3, 12.8, 7.8-7.9, 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. Klassen ArrayList<E> används för att lagra element i en lista ä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... EDAA20 (F13-15 programmering) HT 2016 1 / 60 EDAA20 (F13-15 programmering) HT 2016 2 / 60 Några metoder i klassen ArrayList<E> /** Skapar en tom lista. */ ArrayList(); /** 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(); Generisk klass ArrayList<E> är en generisk klass vilket innebär att den 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 String-objekt och sätter in tre teckensträngar i listan: ArrayList<String> words = new ArrayList<String>(); words.add("ett"); words.add("par"); words.add("ord"); EDAA20 (F13-15 programmering) HT 2016 3 / 60 EDAA20 (F13-15 programmering) HT 2016 4 / 60

ArrayList kan bara innehålla objekt Wrapperklasser Om man vill lagra heltal, reella tal etc. måste man använda motsvarande wrapperklass: 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 wrapperklasser: Boolean Short Integer Long Character Byte Float Double EDAA20 (F13-15 programmering) HT 2016 5 / 60 EDAA20 (F13-15 programmering) HT 2016 6 / 60 Autoboxing - unboxing int vs Integer Automatisk konvertering mellan primitiv datatyp och motsvarande wrapperklass. 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, därför samma resultat som // Integer b = new Integer(12); 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 Integer-objekt. EDAA20 (F13-15 programmering) HT 2016 7 / 60 EDAA20 (F13-15 programmering) HT 2016 8 / 60

Traversera elementen i en lista Mönster Behandla alla elementen i listan - for each Alternativ 1 Uppgift: Behandla alla elementen i en lista. Algoritm: för varje element i listan { använd elementet Det finns olika sätt att traversera listan: for each -sats använda metoderna get och size i en for-sats ArrayList<Integer> list = new ArrayList<Integer>(); list.add(53); list.add(-11); int sum = 0; for (int n : list) { sum = sum + n; // för varje heltal n i list Fungerar bra när man ska gå igenom listan från början. (Svårare om man inte ska starta från position 0.) Fungerar även för att traversera andra samlingar av element i Java. Man får inte ändra i listan med add eller remove inuti for-each-satsen. EDAA20 (F13-15 programmering) HT 2016 9 / 60 EDAA20 (F13-15 programmering) HT 2016 10 / 60 Behandla alla elementen i listan - for-sats med get och size Alternativ 2 ArrayList<Integer> list = new ArrayList<Integer>(); list.add(53); list.add(-11); Övning En lista nbrs av typen ArrayList<Double> innehåller ett antal tal. Räkna antal positiva tal. int sum = 0; for (int i = 0; i < list.size(); i++) { sum = sum + list.get(i); Fungerar bra med klassen ArrayList. Kan bli långsam i andra sammanhang. Metoden get finns inte i alla Javas samlingsklasser. Tänk på att list.size() levererar ett nytt värde om listans antal element ändras. EDAA20 (F13-15 programmering) HT 2016 11 / 60 EDAA20 (F13-15 programmering) HT 2016 12 / 60

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-objekt ä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, false, null etc. beroende på typ). EDAA20 (F13-15 programmering) HT 2016 13 / 60 Exempel: 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 (Point p : vertices) { p.move(dx, dy); EDAA20 (F13-15 programmering) HT 2016 14 / 60 Exempel: klassen Polygon Forts /** Ritar polygonen i fönstret w. */ public void draw(simplewindow w) { if (vertices.size() == 0) { return; Point start = vertices.get(0); w.moveto(start.getx(), start.gety()); for (int i = 1; i < vertices.size(); i++) { w.lineto(vertices.get(i).getx(), vertices.get(i).gety()); w.lineto(start.getx(), start.gety()); Sökmetoder i ArrayList<E> Det finns färdiga metoder för att söka i listan: /** 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 första förekomsten av elementet, -1 om elementet inte finns. */ int indexof(object obj); /** Tar bort första förekomsten av objektet obj, om det finns. Returnerar true om ett element togs bort. */ boolean remove(object obj); Klassen Object i Java kan användas som typ för alla slags objekt. Det ingår inte i kursen att använda dessa metoder. EDAA20 (F13-15 programmering) HT 2016 15 / 60 EDAA20 (F13-15 programmering) HT 2016 16 / 60

Sökmetoder i ArrayList<E> Forts. Inuti metoderna med en parameter av typen Object används en metod boolean equals(object obj) för att jämföra obj med elementen i listan. Om den inte är implementerad på rätt sätt i elementens klass fungerar inte sökningen. Använd alltså inte dessa metoder om du inte vet vad du gör. Men lär dig hur du ska göra om du fortsätter programmera i Java. Överkurs En equals-metod finns i Javas wrapperklasser samt i klassen String. Att t.ex. anropa contains på en lista av typen ArrayList<Integer> eller ArrayList<String> är alltid ok. Om du vill använda dessa sökmetoder för att lagra objekt av en typ C och vill att med likhet menas att värdena på ett eller flera attribut överensstämmer måste du skriva en egen equals-metod i klassen C. EDAA20 (F13-15 programmering) HT 2016 17 / 60 Sökmetoder i ArrayList<E> Överkurs, forts. Om du vill använda sökmetoderna på en lista vertices av typen ArrayList<Point> måste du implementera metoden på equals i klassen Point: public class Point { private int x; private int y; // konstruktor och metoder public boolean equals(object obj) { if (! obj instanceof Point) { return false; Point p = (Point) obj; return x == p.x && y == p.y; EDAA20 (F13-15 programmering) HT 2016 18 / 60 Övning Sökning Lägg till följande metod i klassen Polygon: /** Undersöker om punkten x,y ingår bland polygonens hörnpunkter. */ public boolean hasvertex(int x, int y) { 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. wordlist "apelsin" "banan" "druva" "enbär" word "citron" EDAA20 (F13-15 programmering) HT 2016 19 / 60 EDAA20 (F13-15 programmering) HT 2016 20 / 60

Insättning i sorterad följd Klassen Scanner Lösning: Sök efter positionen för word, dvs. sök efter det första ord som är större än eller lika med word. Sätt in word på rätt position i listan: int pos = 0; while (pos < wordlist.size() && wordlist.get(pos).compareto(word) < 0) { pos++; wordlist.add(pos, word); wordlist "apelsin" "banan" "citron" "druva" "enbär" Vi har tidigare i kursen skapat Scanner-objekt som läser från tangentbordet: Scanner scan = new Scanner(System.in); Man kan också skapa Scanner-objekt som läser från en fil (här från en fil med namnet indata.txt): Scanner scan = new Scanner(new File("indata.txt")); Det är inte säkert att den angivna filen finns. Då får man ett fel som man måste ta hand i en try catch-sats. Se nästa bild. EDAA20 (F13-15 programmering) HT 2016 21 / 60 EDAA20 (F13-15 programmering) HT 2016 22 / 60 try catch-sats Vissa fel, t.ex. att försöka öppna en fil som inte finns, måste man ta hand om i en try catch-sats. I exemplet nedan görs ett försök att öppna filen indata.txt. Om det inte går avbryts exekveringen av satserna i try-blocket och satserna i catch-blocket kommer att utföras. try { // Här försöker vi öppna filen indata.txt scan = new Scanner(new File("indata.txt")); catch (FileNotFoundException e) { // Här kan man skriva vad som ska hända om // filen inte kan öppnas. Läsa indata från fil Exempel public class SumNumbers { public static void main(string[] args) { Scanner scan = null; try { scan = new Scanner(new File("tal.txt")); catch (FileNotFoundException e) { System.out.println("Filen kunde inte öppnas"); System.exit(1); int sum = 0; while (scan.hasnextint()) { sum = sum + scan.nextint(); System.out.println("Summa: " + sum); scan.close(); EDAA20 (F13-15 programmering) HT 2016 23 / 60 EDAA20 (F13-15 programmering) HT 2016 24 / 60

Utskrift på fil Klassen PrintWriter Utskrift på fil Exempel public class PrintWriterExample { public static void main(string[] args) { PrintWriter out = null; try { out = new PrintWriter(new File("utdata.txt")); catch (FileNotFoundException e) { System.out.println("Filen kunde inte öppnas"); System.exit(1); utskrifter med out.print hamnar på filen out.close(); public class PrintSquareRoots { public static void main(string[] args) { PrintWriter out = null; try { out = new PrintWriter(new File("utdata.txt")); catch (FileNotFoundException e) { System.err.println("Filen kunde inte öppnas"); System.exit(1); for (int i = 1; i <= 100; i++) { out.println("kvadratroten av " + i + " = " + Math.sqrt(i)); out.close(); EDAA20 (F13-15 programmering) HT 2016 25 / 60 EDAA20 (F13-15 programmering) HT 2016 26 / 60 Klassdiagram UML Arv Exempel Unified Modelling Language kan användas för att beskriva klasser och samband 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. 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; Carddeck 1 * Card suit rank public class Truck { public class MotorCycle { private String licensenbr; private String licensenbr; private Person owner; private Person owner; private int maxload; EDAA20 (F13-15 programmering) HT 2016 27 / 60 EDAA20 (F13-15 programmering) HT 2016 28 / 60

Problem De olika slagen fordon har olika egenskaper och beskrivs i var sin klass: Car, Truck, Bus och MotorCycle. Problem 1: 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? Problem 2: Klasserna har en hel del likadan kod (attributen licensenbr och owner ). Onödigt att skriva samma kod flera gånger. Jobbigt om något behöver ändras. Gemensam typ för fordon Lösning på problem 1 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]; Men får vi sätta in t.ex. Car-objekt i list eller v? Ja, om Car ärver klassen Vehicle: public class Car extends Vehicle { EDAA20 (F13-15 programmering) HT 2016 29 / 60 EDAA20 (F13-15 programmering) HT 2016 30 / 60 Arv Klassdiagram Referensvariabler och arv Vehicle 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. Car Truck Bus MotorCycle Vehicle avehicle; avehicle = new Car("ABC123", p1, 5); avehicle = new Bus("DEF789", p2, 56); subklass EDAA20 (F13-15 programmering) HT 2016 31 / 60 EDAA20 (F13-15 programmering) HT 2016 32 / 60

Superklass Lösning på problem 2 Abstrakta klasser 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; 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 { EDAA20 (F13-15 programmering) HT 2016 33 / 60 EDAA20 (F13-15 programmering) HT 2016 34 / 60 Subklasser Arv Klassdiagram 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; Vehicle licensenbr owner public class Bus extends Vehicle { private int maxpassengers; Car maxpassengers Bus maxpassengers Truck maxload MotorCycle public class Truck extends Vehicle { private int maxload; EDAA20 (F13-15 programmering) HT 2016 35 / 60 EDAA20 (F13-15 programmering) HT 2016 36 / 60

Objekt innehåller både ärvda och egna attribut Exempel: Car-objekt En klass kan vara både superklass och subklass Klassdiagram Deklareras i superklassen Vehicle Deklareras i subklassen Car licensenbr owner maxpassengers "ABC123" 5 PassengerVehicle maxpassengers Vehicle licensenbr owner Truck maxload MotorCycle Car Bus EDAA20 (F13-15 programmering) HT 2016 37 / 60 EDAA20 (F13-15 programmering) HT 2016 38 / 60 Konstruktorer i superklasser public, private eller protected 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. 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; 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. EDAA20 (F13-15 programmering) HT 2016 39 / 60 EDAA20 (F13-15 programmering) HT 2016 40 / 60

Konstruktorer i subklasser Fördelar med arv Genom att lägga till satsen super() först i konstruktorn ser man till att superklassens konstruktor utförs. public class Truck extends Vehicle { private int maxload; Modellen beskriver det verkliga systemet bättre. Gemensamma attribut och metoder behöver bara skrivas en gång i superklassen. /** 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; 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)); EDAA20 (F13-15 programmering) HT 2016 41 / 60 EDAA20 (F13-15 programmering) HT 2016 42 / 60 Klassen Object Metoden tostring i klassen Object I klassen Object finns metoden: 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. /** 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 2016 43 / 60 EDAA20 (F13-15 programmering) HT 2016 44 / 60

Metoden equals i klassen Object Exempel: geometriska figurer 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) c1 c2 "ABC123" "ABC123" 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. Vilka klasser behövs? Hur ska arv användas? 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 wrapperklasser och i klassen String. EDAA20 (F13-15 programmering) HT 2016 45 / 60 EDAA20 (F13-15 programmering) HT 2016 46 / 60 När ska arv användas? Här ska arv inte användas public class Point { private int x, y; 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. 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 2016 47 / 60 EDAA20 (F13-15 programmering) HT 2016 48 / 60

Superklassen Shape Sammansättning Subklassen Square 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 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 void draw(simplewindow w) { // rita fyra linjer i en kvadrat EDAA20 (F13-15 programmering) HT 2016 49 / 60 EDAA20 (F13-15 programmering) HT 2016 50 / 60 Subklassen Circle Exempel på arv: geometriska figurer public class Circle extends Shape { private int radius; public Circle(int x, int y, int radius) { super(x, y); this.radius = radius; Shape location move(int, int) public int getradius() { return radius; public void draw(simplewindow w) { // rita många linjer i en cirkel Square side draw(simplewindow) Circle radius draw(simplewindow) EDAA20 (F13-15 programmering) HT 2016 51 / 60 EDAA20 (F13-15 programmering) HT 2016 52 / 60

Typregler för arv Uppgift Flytta figurerna 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; 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); 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. EDAA20 (F13-15 programmering) HT 2016 53 / 60 EDAA20 (F13-15 programmering) HT 2016 54 / 60 Rita figurerna Problem med metoden draw 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. 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. EDAA20 (F13-15 programmering) HT 2016 55 / 60 EDAA20 (F13-15 programmering) HT 2016 56 / 60

Lösning abstrakt metod Dynamisk bindning 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; 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. public abstract void draw(simplewindow w); EDAA20 (F13-15 programmering) HT 2016 57 / 60 EDAA20 (F13-15 programmering) HT 2016 58 / 60 Objektuttrycken this och super Checklista this Referens till det aktuella objekt. super Referens till det aktuella objekt, men har superklassens typ. Exempel på vad du ska kunna Förklara begreppet generisk klass. Använda klassen ArrayList<E>. Skriva ut data på en textfil Läsa in data från en textfil 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 2016 59 / 60 EDAA20 (F13-15 programmering) HT 2016 60 / 60