Föreläsning 1-2. Språkkonstruktioner i Java. Introduktion till delar av Javas klassbibliotek

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

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

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

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

Föreläsning 2 Innehåll

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

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

Föreläsning 3 Innehåll

Diskutera Sortera objekt

EDAA01 Programmeringsteknik - fördjupningskurs

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

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

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

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

Föreläsning 4 Innehåll

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

Föreläsning 9 Innehåll

DAT043 - föreläsning 8

Föreläsning 3-4 Innehåll

Programmering fortsättningskurs

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

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

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

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

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

Arrayer. results

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

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

Länkade strukturer. (del 2)

Interfacen Set och Map, hashtabeller

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Mål Förklaring av termer

Mål Förklaring av termer

DAT043 Objektorienterad Programmering

Föreläsning 10 Innehåll

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

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

Länkade strukturer, parametriserade typer och undantag

Föreläsning 2. Länkad lista och iterator

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Föreläsning 2. Länkad lista och iterator

Föreläsning REPETITION & EXTENTA

Sammansatta datatyper Generics: Parametrisk polymorfism

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

Diskutera. Hashfunktion

Föreläsning 1 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta ska du lära dig... Kursens mål. Detta kan du...

Föreläsning 14 Innehåll

Samlingar Collection classes

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Inlämningsuppgift och handledning

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

Föreläsning 3-4 Innehåll

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

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

Föreläsnings 9 - Exceptions, I/O

Objektorienterad programmering med Java, Generics

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Programmering, minneshjälp för den glömske

TDDD78 Viktiga begrepp, del 2

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

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

Stackar, köer, iteratorer och paket

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

1 Comparator & Comparable

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

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

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Programmeringsteknik - fördjupningskurs

Föreläsning 11 Innehåll

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

LUNDS TEKNISKA HÖGSKOLA EDAA01 Programmeringsteknik fördjupningskurs Institutionen för datavetenskap HT 2015

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

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

EDAA30 Programmering i Java - fortsättningskurs

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 Datastrukturer (DAT037)

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Testning av program. Verklig modell för programutveckling

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Generiska konstruktioner. Kursbokens kapitel 13

OOP Objekt-orienterad programmering

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

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

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Transkript:

Föreläsning 1-2 Innehåll Språkkonstruktioner i Java Interface Exceptions Introduktion till generik Autoboxing - och unboxing Introduktion till delar av Javas klassbibliotek Java Collections Framework interface och klasser för samlingar av element interfacen Iterator och Iterable och foreach-sats i Java - används för att traversera genom en samling element Jämföra objekt metoden equals, interfacet Comparable EDA690 (Föreläsning 1-2) HT 2013 1 / 83

Språkkonstruktioner i Java, Javas klassbibliotek - mål Undervisningsmoment: föreläsning 1-2 övning 1 laboration 1 Avsnitt i läroboken: 1.1-1.6, 2.1, Appendix A6, A11, A12 I gamla upplagan: 1.1-1.3, 2.1-2.4, 4.1 Exempel på vad du ska kunna Förklara begreppen: abstraktion, abstrakt datatyp, specikation, implementation, interface, pre- och post-conditions deklarera interface i Java Skriva klasser som implementerar interface Skriva programkod för att fånga exception EDA690 (Föreläsning 1-2) HT 2013 2 / 83

Språkkonstruktioner i Java, Javas klassbibliotek - mål, forts Exempel på vad du ska kunna, forts Skriva metoder som genererar exception Förklara begreppen: generik, typparameter, autoboxing och unboxing Använda generiska klasser Implementera generiska klasser Använda en iterator för att traversera en samling element Implementera iteratorer för enkla datastrukturer som listor och vektorer Förklara interfacet Comparable och kunna implementera detta interface Formulera testfall och använda JUnit för att testa klasser. Förklara begreppen: skuggning, överlagring, polymorsm På övning 1 repeteras viktiga begrepp från grundkursen: arv, parameteröverföring, statiska attribut och metoder. EDA690 (Föreläsning 1-2) HT 2013 3 / 83

Objektorienterad design Man utgår från de data programmet ska arbeta med, alltså de verkliga saker (objekt) som nns i problemet. Objekten har egenskaper (attribut) operationer som kan utföras på objektet (motsvaras av metoder) Objekten beskrivs i en klass. Klassen fungerar alltså som mall för objekten. Vi gör en abstrakt modell av verkligheten. Endast egenskaper som är väsentliga för problemet nns med. Att abstrahera betyder att bortse från oväsentliga detaljer för att istället framhäva det som är relevant. EDA690 (Föreläsning 1-2) HT 2013 4 / 83

Abstrakt datatyp (ADT) Denition En abstrakt modell tillsammans med de operationer man kan utföra på den. Exempel: Abstrakt modell: komplexa tal Operationer på modellen: hämta realdel, hämta imaginärdel, addera... En ADT motsvaras av en specikation av en klass eller av ett interface En klass är en implementering av en ADT EDA690 (Föreläsning 1-2) HT 2013 5 / 83

Abstrakta datatyper Fördelar Man får en väldenierad utvidgning av programspråket (ett klassbibliotek). Utvidgningen gör det enklare för användaren att lösa sitt problem. implementeringen kan ändras utan att det påverkar resten av programmet. En ADT kan utnyttjas för era problem (component reuse). En ADT kan testas separat. EDA690 (Föreläsning 1-2) HT 2013 6 / 83

Interface Interface i Java Betyder gränssnitt Innehåller ingen implementering Alla metoder är implicit publika Kan användas för att specicera en ADT public interface ComplexNumber { /** returns real part */ double getre(); /** returns imaginary part */ double getim(); /** adds this number and rhs and returns result as a new complex number */ ComplexNumber add(complexnumber rhs); EDA690 (Föreläsning 1-2) HT 2013 7 / 83

Interface Implementera ett interface Ett interface kan implementeras av en eller era klasser. public class MyComplexNumber implements ComplexNumber { private double re; private double im; public MyComplexNumber(double re, double im) { this.re = re; this.im = im; public double getre() { return re;... EDA690 (Föreläsning 1-2) HT 2013 8 / 83

Interface Implementera ett interface, forts... public double getim() { return im; public ComplexNumber add(complexnumber rhs) { return new MyComplexNumber(re+rhs.getRe(),im+rhs.getIm()); EDA690 (Föreläsning 1-2) HT 2013 9 / 83

Interface Implementera era interface En klass kan implementera era interface men bara ärva från en klass. public class MyComplexNumber2 implements ComplexNumber, Cloneable { // implementering av alla metoder i interfacen // ComplexNumber och Cloneable EDA690 (Föreläsning 1-2) HT 2013 10 / 83

Interface Interface som typnamn Interface kan användas som typnamn. ComplexNumber c; public void p(complexnumber c) {... Fördel: man binder sig inte till en speciell implementering c = x; är ok när x är en instans av en klass som implementerar interfacet ComplexNumber anrop p(x) är ok när x är en instans av en klass som implementerar interfacet ComplexNumber EDA690 (Föreläsning 1-2) HT 2013 11 / 83

Interface Kontrakt Interfacet fungerar som kontrakt. Flera implementeringar (klasser) kan uppfylla kontraktet. Användare har tillgång till alla operationer i ett interface innan de är implementerade. Det är bara när man skapar instanser som man behöver tillgång till en implementerande klass. Man kan enkelt byta en implementerande klass mot en annan. ComplexNumber c1 = new MyComplexNumber(1,2); ComplexNumber c2 = c1; c2 = c2.add(c1); p(c2); EDA690 (Föreläsning 1-2) HT 2013 12 / 83

Interface Övning Övning Deniera ett interface med namnet Resizable med en metod resize som är void och har en parameter scalefactor av typen double. Övning Ändra i klassen Square så att den implementerar interfacet Resizable. public class Square { private double side; public Square(double side) { this.side = side;... EDA690 (Föreläsning 1-2) HT 2013 13 / 83

Pre- och postconditions Kontrakt på metodnivå Preconditions är villkor som måste vara uppfyllda för att en metod ska kunna utföra sin uppgift. Ibland nns inga preconditions. När de nns, är de ofta villkor som parametrarna ska uppfylla. Postconditions beskriver hur exekvering av metoden förändrar tillståndet hos objektet. Behöver bara anges om metoden förändrar tillståndet (oftast void-metoder). För metoder som inte är void bör man i stället ge en kommentar om vad som returneras. EDA690 (Föreläsning 1-2) HT 2013 14 / 83

Pre- och postconditions Exempel public class BankAccount { private int balance;... /** * Deposits the specified amount. * pre: The specified amount is >= 0 * post: The specified amount is added to balance * @param n The amount to deposit */ public void deposit(int n) { balance = balance + n;... EDA690 (Föreläsning 1-2) HT 2013 15 / 83

Fel i program (buggar) Olika slags fel Syntaxfel bryter mot språkets grammatik (syntax). Exempel: glömt ett {, glömt deklarera en variabel innan den används... Exekveringsfel (Runtime errors eller Exceptions) upptäcks vid exekvering. Exempel: ArrayIndexOutOfBoundException, NullPointerException,... Logiska fel Programmet kan köras men ger fel resultat. EDA690 (Föreläsning 1-2) HT 2013 16 / 83

Exekveringsfel Vad händer vid ett exekveringsfel? Ett objekt (exception) skapas som beskriver typen av fel. Programmet avbryts. Ett felmeddelande skrivs ut där framgår. typ av fel stacktrace (sekvensen av metodanrop) EDA690 (Föreläsning 1-2) HT 2013 17 / 83

Exception Sammanfattning Betyder undantag Exception genereras (throws) vid exekveringsfel. Man kan fånga (catch) exception och då själv avgöra hur felsituationen ska hanteras. Man kan skriva kod som genererar exception inuti en metod. (Används om det uppstår en situation som gör det omöjligt för metoden att utföra sin uppgift.) EDA690 (Föreläsning 1-2) HT 2013 18 / 83

Exception Olika typer av fel beskrivs av olika subklasser till klassen Exception. Exception RuntimeException IOException... ArrayIndexOutOfBoundException FileNotFoundException NullPointerException... NoSuchElementException... EDA690 (Föreläsning 1-2) HT 2013 19 / 83

Exceptions Unchecked och checked Det nns två slag av Exceptions: Unchecked Exceptions Subklass till RuntimeException. Behöver inte fångas. Exempel: ArrayIndexOutOfBoundException, NullPointerException Checked Exceptions Måste fångas någonstans i anropskedjan, annars kompileringsfel. Metoder som genererar sådana måste ange det i sin metodrubrik. Exempel: public Scanner createscanner(string filename) throws FileNotFoundException {... EDA690 (Föreläsning 1-2) HT 2013 20 / 83

Exceptions Unchecked och checked, forts Unchecked Exceptions används då felet beror på programmeraren Ex: NullPointerException eller ArrayIndexOutOfBoundsException Checked Exceptions används då felet inte beror på programmeraren Ex: FileNotFoundException om man försöker öppna en l som inte nns EDA690 (Föreläsning 1-2) HT 2013 21 / 83

Fånga checked Exceptions Exempel När man anropar en metod som genererar en checked exception måste man ta hand om det. Normalt fångar man det i en try-catch-sats: Scanner scan = null; try { // försöker öppna en fil med namnet filename scan = new Scanner(new File(fileName)); catch (FileNotFoundException e) { System.err.println("Couldn't open file " + filename); System.exit(1);... använd scan... Om exception inträar, avbryts exekveringen av satserna i try-blocket och satserna i catch-blocket exekveras. EDA690 (Föreläsning 1-2) HT 2013 22 / 83

Fånga checked Exceptions Forts I satsen catch(exception e) kan t.ex. följande metoder användas för att få mer information: Exempel: e.printstacktrace(); som skriver ut information om raden där felet inträat och den/de metodanrop som lett till denna rad. e.getmessage(); som returnerar en sträng med meddelande om felets art. Scanner scan = null; try { scan = new Scanner(new File(fileName)); catch (FileNotFoundException e) { e.printstacktrace(); System.exit(1);... använd scan... EDA690 (Föreläsning 1-2) HT 2013 23 / 83

Fånga exception Mönster try { // kod som kan generera exception catch (ExceptionClass e) { // kod för att hantera exception try { // kod som kan generera exception catch (ExceptionClass1 e1) { // kod för att hantera exception av typen ExceptionClass1 catch (ExceptionClass2 e2) { // kod för att hantera exception av typen ExceptionClass2 finally { // kod som utförs efter try-blocket eller efter catch-blocket EDA690 (Föreläsning 1-2) HT 2013 24 / 83

Ignorera checked Exceptions Man kan ignorera en checked Exception och kasta det vidare till den anropande metoden. I så fall måste man ange det i metodrubriken i den metod där exception genereras: public Scanner createscanner(string filename) throws FileNotFoundException { // Här genereras exception om filen inte går att öppna Scanner scan = new Scanner(new File(fileName)); return scan; I den metod som anropar createscanner måste man ta hand om detta exception och kan korrigera felet på valfritt sätt. EDA690 (Föreläsning 1-2) HT 2013 25 / 83

Hantera unchecked exceptions Metod som genererar unchecked exception behöver inte ange det i sin rubrik Kan anges i kommentar Den som anropar en metod som kan generera en unchecked exception behöver inte (men kan) fånga den i en try-catch-sats Leder till exekveringsfel om de inte fångas. EDA690 (Föreläsning 1-2) HT 2013 26 / 83

Generera exception Exempel: throw new IllegalArgumentException("amount to deposit < 0"); Mönster: throw new ExceptionClass(); throw new ExceptionClass(message); Eekt: Ett nytt exception-objekt skapas. Exekveringen av metoden avbryts. Javasystemet letar efter fångande catch-block. EDA690 (Föreläsning 1-2) HT 2013 27 / 83

Generera exception Exempel /** * Deposits the specified amount. * pre: The specified amount is >= 0 * post: The specified amount is added to balance * @param n The amount to deposit * @throws IllegalArgumentException if the specified amount is < 0 */ public void deposit(int n) { if (n < 0) { throw new IllegalArgumentException("amount to deposit < 0"); balance = balance + n; EDA690 (Föreläsning 1-2) HT 2013 28 / 83

Egna exceptionklasser Om man vill kan man implementera en egen exceptionklass (behövs sällan, det nns färdiga exceptionklasser i Javas bibliotek för de esta situationer). Om den ska vara checked: public class SpellException extends Exception {... Om den ska vara unchecked: public class SomeSortOfException extends RuntimeException {... EDA690 (Föreläsning 1-2) HT 2013 29 / 83

Exceptions Övning Övning 1. Ändra följande metod så att exception genereras i de fall det är lämpligt. /** * Withdraws the specified amount. * pre: The specified amount is >= 0 and <= balance * post: Balance is decreased by the specified amount * @param n The amount to withdraw */ public void withdraw(int n) { balance = balance - n; 2. Antag att variabeln acc refererar till ett bankkonto-objekt och att metoden withdraw nns i bankkonto-klassen. Anropa withdraw och skriv ut en lämplig felutskrift på System.out om exception genereras. EDA690 (Föreläsning 1-2) HT 2013 30 / 83

Autoboxing unboxing Primitiva typer - wraperklasser Primitiva typer i Java: Motsvarande wrapper-klasser: boolean short int long char byte float double Boolean Short Integer Long Character Byte Float Double EDA690 (Föreläsning 1-2) HT 2013 31 / 83

Autoboxing unboxing Exempel: Integer i = new Integer(2); Fr o m Java 5.0 kan vi skriva: i = i + 1; Detta var inte tillåtet i i tidigare versioner av Java. Där måste man skriva: i = new Integer(i.intValue() + 1); EDA690 (Föreläsning 1-2) HT 2013 32 / 83

Autoboxing unboxing Autoboxing automatisk konvertering från primitiv typ till objekt av motsvarande wrapper-klass Unboxing automatisk konvertering av objekt av wrapperklass till motsvarande primitiva typ Exempel: Integer k = 3; // autoboxing int j = k; // unboxing Integer i = new Integer(2); i = i + 1; // Unboxing av i för att beräkna i+1. // Därefter autoboxing av resultatet vid // tilldelningen. EDA690 (Föreläsning 1-2) HT 2013 33 / 83

Autoboxing unboxing i samband med collection-klasser Praktiskt när man vill använda Javas collection-klasser för att lagra element av primitiv typ. Ex: ArrayList<Integer> mylist = new ArrayList<Integer>(); mylist.add(1); // Konvertering till Integer-objekt här.... int j = mylist.get(0); // Konvertering till int här. EDA690 (Föreläsning 1-2) HT 2013 34 / 83

Generik Introduktion till Generik i Java Här introduceras generiska klasser och interface. Mer om generik nns att läsa på OH-bilderna Mer om generik som nns på kursens hemsida: generik och arv wildcards vektorer och generik generiska metoder Vissa av dessa moment dyker upp och förklaras i samband med laborationer. EDA690 (Föreläsning 1-2) HT 2013 35 / 83

Generik Bakgrund Klasser bör implementeras så att de blir generella d.v.s. går att använda i många olika sammanhang. En klass som hanterar en lista av element ska inte skrivas så att den bara kan hantera listor med heltal. Lösningen har i tidigare javaversioner varit att ge parametrar i metoderna den mest generella typen Object. Ex: add-operationen i en lista kunde ha signaturen public boolean add(object x); EDA690 (Föreläsning 1-2) HT 2013 36 / 83

Generik Bakgrund forts Typosäkerhet utan generik! I den gamla modellen kunde man skriva: mylist.add(new Integer(1)); mylist.add(new Integer(2)); mylist.add(new Person(Kalle)); Om avsikten är att listan ska innehålla tal, har vi gjort fel på rad 3. Kompilatorn kan inte upptäcka detta koden är korrekt, både Integer och Person är subklasser till Object. EDA690 (Föreläsning 1-2) HT 2013 37 / 83

Generik i Java Ger oss möjlighet att abstrahera över typer Vi kan använda typparametrar när vi denierar en klass. Ex: public class ArrayList<E> {... Vid användning av en generisk klass anges ett aktuellt typargument. Ex: ArrayList<Integer> mylist = new ArrayList<Integer>(); EDA690 (Föreläsning 1-2) HT 2013 38 / 83

Generik i Java Kompilatorn kommer att upptäcka typfel. Ex: ArrayList<Integer> mylist = new ArrayList<Integer>(); mylist.add(new Person("Kalle")); ger nu kompileringsfel, mylist får enligt sin deklaration endast innehålla objekt av typen Integer. EDA690 (Föreläsning 1-2) HT 2013 39 / 83

Exempel på en generisk klass java.util.arraylist Utdrag ur den generiska klassen java.util.arraylist: public class ArrayList<E> { public ArrayList() {... public boolean add(e x) {... public void add(int index, E x) {... public E get(int index) {...... Alla add-metoder har inparameter av typen E. Därför kan enbart objekt av klassen E (eller subklasser till denna) sättas in i listan. EDA690 (Föreläsning 1-2) HT 2013 40 / 83

Exempel på en generisk klass java.util.arraylist, forts Observera att inte alla operationer i ArrayList<E> har E som typparameter. T.ex. har contains och remove följande signaturer: public boolean contains(object x); public boolean remove(object x); Användare som inte känner till den exakta typen av ett element x ska kunna anropa metoderna. Dock kommer man att få resultat true om och endast om x nns i listan (och alltså även är av rätt typ). EDA690 (Föreläsning 1-2) HT 2013 41 / 83

Användning av en generisk klass java.util.arraylist Exempel: ArrayList<String> list = new ArrayList<String>(); list.add("lisa"); list.add("per");... String s = list.get(0); System.out.println(s);... EDA690 (Föreläsning 1-2) HT 2013 42 / 83

Implementering av generisk klass Java 1.4 public class Container { private Object item; public Container(Object x) { item = x; public Object get() { return item; Fr o m Java 5.0 generisk klass public class Container<E> { private E item; public Container(E x) { item = x; public E getitem() { return item; public void set(object x) { item = x; public void setitem(e x) { item = x; EDA690 (Föreläsning 1-2) HT 2013 43 / 83

Generisk klass med era typparametrar Implementering public class Pair<K, V> { private K key; private V value; public Pair(K key, V value) { this.key = key; this.value = value; public V getvalue() { return value; public void setvalue(v val) { value = val;... EDA690 (Föreläsning 1-2) HT 2013 44 / 83

Generisk klass med era typparametrar Användning Exempel: Pair<String, Integer> pair = new Pair<String, Integer>("June", 30); int nbrdays = pair.getvalue(); EDA690 (Föreläsning 1-2) HT 2013 45 / 83

Generiska interface Även interface kan vara generiska. Ex: public interface Set<E> { boolean add(e x); int size(); boolean contains(object x);... EDA690 (Föreläsning 1-2) HT 2013 46 / 83

Generik syntax Deklaration av parametriserade (generiska) klasser/interface: public class Set<E> {... public interface Comparable<T>... public class Pair<K,V>... Klassen/interfacet har en parameterlista som omges av tecknen < och >. En parameter namnges med en typvariabel (markeras ovan) som kan vara en godtycklig identierare. Om det är era parametrar används komma som skiljetecken. EDA690 (Föreläsning 1-2) HT 2013 47 / 83

Generik syntax Generiska klasser/interface denierar en samling av typer: en typ för varje möjlig instansiering av typparametrarna. Deklarationen av Set<E> på föregående bild denierar t ex följande parametriserade typer: Set<Integer> Set<Character> Set<String> Set<Set<String>> // nästling tillåten... EDA690 (Föreläsning 1-2) HT 2013 48 / 83

Generik syntax Vi kan använda parametriserade typer i deklaration av attribut, variabler, metodparametrar,... Ex: ArrayList<Integer> mylist; Pair<Integer, String> apair; public static printset(set<integer> s) {... När vi skapar instanser av generiska klasser anges typargumenten inom tecknen < och > Ex: ArrayList<Integer> mylist = new ArrayList<Integer>(); Pair<Integer, String> apair = new Pair<Integer, String>(); EDA690 (Föreläsning 1-2) HT 2013 49 / 83

Generik syntax I generiska klasser/interface kan typparametrarna användas för att deklarera attribut, variabler,... Ex: public class Container<E> { private E item; public Container(E x){ this.item = x; public E getitem()){ returnh item;... Man kallar ofta E för typvariabel när den används så här. EDA690 (Föreläsning 1-2) HT 2013 50 / 83

Restriktioner för typparametrar och typvariabler Parameter till generisk klass kan inte vara primitiv typ: SomeClass<int> c =... // Går inte! Typvariabler kan inte användas för att skapa objekt: public class SomeClass<E> { public void p() { E x = new E(); // Fel!... Typparametrar kan inte användas för att överlagra metoder: public class MyClass<T,U> { public void p(t x) {... public void p(u x) {... // Fel!... EDA690 (Föreläsning 1-2) HT 2013 51 / 83

Introduktion till delar av Javas klassbibliotek Java Collections Framework interface och klasser för samlingar av element interfacen Iterator och Iterable och foreach-sats i Java - används för att traversera genom en samling element interfacet Comparable Läsanvisningar Interfacet List och Klassen ArrayList behandlas i avsnitt 2.1. Fler interface och klasser behandlas senare i kursen/läroboken. Dokumentation På Javas hemsida (länk nns på kursens hemsida) nns dokumentation av Javas standardklasser. Där nns även tuturials, bl.a. om Javas Collection-klasser. EDA690 (Föreläsning 1-2) HT 2013 52 / 83

JCF Java Collections Framework Är en hierarki av interface, abstrakta klasser och konkreta klasser för samlingar av element. Finns i paketet java.util. Basen i hierarkin är ett interface Collection: interface Collection<E> { boolean add(e x); boolean contains(object x); boolean remove(object x); boolean isempty(); int size();... EDA690 (Föreläsning 1-2) HT 2013 53 / 83

JCF interface hierarki <<Interface>> Collection <<Interface>> Map <<Interface>> Queue <<Interface>> List <<Interface>> Set <<Interface>> SortedMap <<Interface>> SortedSet EDA690 (Föreläsning 1-2) HT 2013 54 / 83

JCF interface hierarki Collection en samling av element, där dubbletter tillåts Queue en samling av element som utgör en kö List en samling element där dubbletter tillåts och där positionering är möjlig (första, sista, element på plats i,...) Set en samling element där dubbletter är förbjudna SortedSet som Set men med krav att elementen går att jämföra Map en samling av element, där varje element har en en nyckel och ett värde (jfr. lexikon) SortedMap som Map men med krav att nycklarna går att jämföra EDA690 (Föreläsning 1-2) HT 2013 55 / 83

JCF några klasser Interface Queue List Set SortedSet Map SortedMap Implementering LinkedList, PriorityQueue ArrayList, LinkedList HashSet TreeSet HahsMap TreeMap EDA690 (Föreläsning 1-2) HT 2013 56 / 83

Iteratorer Antag att vi lagrar ett antal personer i en lista (eller i någon annan samlingsklass): ArrayList<Person> plist = new ArrayList<Person>(); // här sätts Person-objekt in i samligen Hur ska vi göra för iterera genom samligen och behandla alla personerna (t.ex. skriva ut alla personernas namn)? EDA690 (Föreläsning 1-2) HT 2013 57 / 83

Interfacet Iterator<E> En instans av en klass som implementerar interfacet Iterator används för att iterera över alla element i en samling. public interface Iterator<E> { /** Returns true if the iteration has more elements. */ boolean hasnext(); /** Returns the next element in the iteration. */ E next(); /** Removes from the underlying collection the last element returned by the iterator (optional). */ void remove(); Hur får man tag på ett iterator-objekt? EDA690 (Föreläsning 1-2) HT 2013 58 / 83

Interfacet Iterable<E> I Java nns följande interface: public interface Iterable<E> { /** Returns an iterator over a set of elements of type E */ Iterator<E> iterator(); Interfacet Collection ärver interfacet Iterable: public interface Collection<E> extends Iterable<E>... Alla klasser som implementerar Collection måste alltså implementera metoden iterator(). EDA690 (Föreläsning 1-2) HT 2013 59 / 83

JCF interface hierarki med Iterable<E> och Iterator<E> <<Interface>> Iterable iterator() <<Interface>> Collection <<Interface>> Iterator <<Interface>> Map <<Interface>> Queue <<Interface>> List <<Interface>> Set hasnext() next() remove() <<Interface>> SortedMap <<Interface>> SortedSet EDA690 (Föreläsning 1-2) HT 2013 60 / 83

Användning av iterator Exempel ArrayList<Person> plist = new ArrayList<Person>(); // här sätts Person-objekt in i samlingen... Iterator<Person> itr = plist.iterator(); while (itr.hasnext()) { Person p = itr.next(); // behandla p... Lägg märke till hur man skaar sig en iterator genom att anropa metoden iterator. EDA690 (Föreläsning 1-2) HT 2013 61 / 83

Metoden iterator() Exempel på collection-klass med metoden iterator public class ArrayCollection<E> implements Collection<E> { private E[] thecollection; private int size;... impl av konstruktor, add,... public Iterator<E> iterator() { return new ArrayIterator(); private class ArrayIterator implements Iterator<E> {... implementering på nästa bild... EDA690 (Föreläsning 1-2) HT 2013 62 / 83

Implementering av interfacet Iterator<E> Exempel: Klassen ArrayIterator private class ArrayIterator implements Iterator<E> { private int pos; private ArrayIterator() { pos = 0; public boolean hasnext() { return pos < size;... EDA690 (Föreläsning 1-2) HT 2013 63 / 83

Implementering av interfacet Iterator<E> Exempel: Klassen ArrayIterator, forts... public E next() { if (hasnext()) { E item = thecollection[pos]; pos++; return item; else { throw new NoSuchElementException(); public void remove() { throw new UnsupportedOperationException(); EDA690 (Föreläsning 1-2) HT 2013 64 / 83

Implementering av interfacet Iterator<E> Inre klass Den klass som implementerar interfacet Iterator kan vara inre i den klass som representerar samlingen. klass En inre klass har tillgång till alla attribut i den omgivande klassen det utnyttjas t.ex. i operationen next. Den kan vara privat, och ha en en privat konstruktor, eftersom det bara är den omgivande klassen som skapar instanser. Metoderna hasnext,... måste däremot vara publika eftersom interfacet Iterator föreskriver detta. EDA690 (Föreläsning 1-2) HT 2013 65 / 83

Implementering av interfacet Iterator<E> Kommentar Implementeringen som visats här är förenklad: Iteratorer har enligt sitt kontrakt inte till uppgift att klara av att samlingen modieras mellan anrop av next(). En korrekt iterator-implementering måste upptäcka detta och generera en exception om samlingen modieras. EDA690 (Föreläsning 1-2) HT 2013 66 / 83

foreach-sats i Java Exempel ArrayList<Person> plist = new ArrayList<Person>(); // här sätts Person-objekt in samlingen... for (Person p : plist) { // behandla p Ett sätt att enkelt iterera över samlingar. Man slipper att explicit använda en iterator. for (Person p : plist)... kan läsas som för varje p i plist. Kan användas för objekt av klasser som implementerar Iterable och för vektorer. EDA690 (Föreläsning 1-2) HT 2013 67 / 83

foreach-sats Vektorer Kan också användas för att iterera över elementen i en vektor. Ex: En metod som skriver ut namn på personer som lagrats i en vektor av typ Person[]: public void print(person[] a) { for (Person p : a) { System.out.println(p.getName()); EDA690 (Föreläsning 1-2) HT 2013 68 / 83

Iterator foreach-sats Övning Övning Antag att vi har följande lista: LinkedList<Integer> list = new LinkedList<Integer>(); list.add(25); list.add(42);... Summera talen i list genom att använda iterator() resp. foreach-sats. EDA690 (Föreläsning 1-2) HT 2013 69 / 83

foreach-sats Begränsningar Foreach-sats kan inte iteratorn i koden. användas när man explicit behöver tillgång till Exempel: Tag bort alla personer som matchar x ur en ArrayList<Person> plist: Iterator<Person> itr = plist.iterator(); while (itr.hasnext()) { if (itr.next().equals(x)) { itr.remove(); Här behövs iteratorn för att kunna ta bort element. EDA690 (Föreläsning 1-2) HT 2013 70 / 83

foreach-sats Begränsningar Foreach-sats kan inte samlingar, motsvarande följande kod: användas för att iterera parallellt över era ArrayList<Person> list1, list2;... Iterator<Person> itr1 = list1.iterator(); Iterator<Person> itr2 = list2.iterator(); while(itr1.hasnext() && itr2.hasnext()) { System.out.println(itr1.next() + " " + itr2.next()); EDA690 (Föreläsning 1-2) HT 2013 71 / 83

Nästlad foreach-sats Däremot går det bra med nästlade loopar. Ex: Skriv ut alla kombinationer av strängar str1 str2 där str1 nns i vektorn first och str2 nns i vektorn second. first och second är av typen String[] : for (String f : first ) { for (String s : second) { System.out.println(f + " " + s); EDA690 (Föreläsning 1-2) HT 2013 72 / 83

Söka efter objekt i en lista Följande klass beskriver en person: public class Person { private String name; private int idnbr; public Person (String name, int idnbr) { this.name = name; this.idnbr = idnbr; Vad skrivs ut när följande rader exekveras? ArrayList<Person> list = new ArrayList<Person>(); list.add(new Person("Kalle", 1)); list.add(new Person("Kajsa", 2)); System.out.println(list.contains(new Person("Kalle", 1))); EDA690 (Föreläsning 1-2) HT 2013 73 / 83

Jämföra likhet Metoden equals Metoden equals används för att jämföra om två objekt är lika: Person p1 =...; Person p2 = ;... if (p1.equals(p2)) {... Metoden equals nns i superklassen Object. Den returnerar true om och endast om de jämförda objekten är identiska. Om man istället vill att innehållet inuti objekten ska jämföras måste man omdeniera (skugga) equals. Exempel: Om man vill att två personer ska anses lika när de har samma id-nummer måste man omdeniera equals i klassen Person. EDA690 (Föreläsning 1-2) HT 2013 74 / 83

Omdeniera equals Specikation public boolean equals(object obj); Ur equals specikation: x.equals(x) ska returnera true (reexivitet). Om x.equals(y) returnerar true så ska y.equals(x) returnera true (symmetri). Om x.equals(y) returnerar true och y.equals(z) returnerar true så ska x.equals(z) returnera true (transitivitet). x.equals(null) ska returnera false. EDA690 (Föreläsning 1-2) HT 2013 75 / 83

Omdeniera equals med instanceof public boolean equals(object obj) { if (obj instanceof Person) { return idnbr == ((Person) obj).idnbr; else { return false; Observera att parametern till equals måste vara av typ Object, annars blir det inte skuggning. Därför måste också typomvandling till Person ske när man ska använda obj:s idnbr. Uttrycket obj instanceof Person returnerar true om obj:s typ är Person eller någon subklass till Person. Uttrycket obj instanceof Person returnerar false om obj har värdet null. EDA690 (Föreläsning 1-2) HT 2013 76 / 83

Omdeniera (skugga) equals med instanceof Fördelar och nackdelar Uttrycket obj instanceof Person returnerar true om obj:s typ är Person eller någon subklass till Person. Lösningen tillåter alltså att subklasser ärver equals-metoden. Man kan använda equals i en arvshieariki och jämföra subklassobjekt och superklassobjekt. Kan leda till att equals inte uppfyller kraven i specikationen (om man t.e.x skuggar equals i subklassen). Detta undviks om man bara tillåter jämförelser mellan objekt av samma typ. Se nästa bild. EDA690 (Föreläsning 1-2) HT 2013 77 / 83

Omdeniera equals med getclass public boolean equals(object obj) { if (obj == this) { return true; if (obj == null) { return false; if (this.getclass()!= obj.getclass()) { return false; return idnbr == ((Person) obj).idnbr; Metoden getclass returnerar typen för det objekt obj refererar till under exekveringen. EDA690 (Föreläsning 1-2) HT 2013 78 / 83

Interfacet Comparable Specikation I Java nns ett generiskt interface, Comparable<T>: public interface Comparable<T> { /** * Compares this object with the specified object for order. * Returns a negative integer, zero, or a positive integer as * this object is less than, equal to, or greater than the * specified object. */ public int compareto(t x); Objekt av klasser som implementerar detta interface går att jämföra med varandra och kan t.ex. sorteras. EDA690 (Föreläsning 1-2) HT 2013 79 / 83

Implementering av interfacet Comparable Exempel public class Person implements Comparable<Person> { private String name; private int idnbr;... public int compareto(person x) { return idnbr - x.idnbr; public boolean equals(object obj) { if (obj instanceof Person) { return compareto((person) obj) == 0; else { return false; EDA690 (Föreläsning 1-2) HT 2013 80 / 83

Jämföra likhet Metoderna compareto och equals Interfacet Comparable innehåller bara metoden compareto. Men för klasser som implementerar interfacet Comparable nns det två sätt att jämföra avseende likhet: Person p1 =...; Person p2 = ;... if (p1.compareto(p2) == 0) {... if (p1.equals(p2)) {... Båda sätten att jämföra ska ge konsistenta resultat. Därför bör metoden equals omdenieras i klasser som implementerar Comparable. EDA690 (Föreläsning 1-2) HT 2013 81 / 83

Implementering av interfacet Comparable Övning Övning Ändra klassen Person så att den implementerar interfacet Comparable. Jämförelsen av Person-objekt ska göras med avseende på namnet. public class Person { private String name; private int idnbr;... EDA690 (Föreläsning 1-2) HT 2013 82 / 83

Typparametrar med begränsningar Ibland behöver man ange begränsning på typparmetern: public class ASortedCollection<E extends Comparable<E>> <E extends T> betyder: E måste vara subklass till T om T är en klass. Det är också tillåtet att E = T. E måste implementera interfacet T om T är ett interface. I exemplet ovan anger vi alltså att E måste vara en typ som implementerar interfacet Comparable<E>. Vi kan därmed använda metoden compareto på objekt av typen E i implementeringen av ASortedCollection. EDA690 (Föreläsning 1-2) HT 2013 83 / 83