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

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

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

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

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Objektorienterad Programmering (TDDC77)

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

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

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

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

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

DAT043 - föreläsning 8

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

DAT043 - Föreläsning 7

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

Klasshierarkier - repetition

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

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

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

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

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

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

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

Kopiering av objekt i Java

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

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. 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

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

F4. programmeringsteknik och Matlab

Outline. Objektorienterad Programmering (TDDC77) Laborationsserie del två. Vad händer under HT2. Introduktion HT2 UML.

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Länkade strukturer, parametriserade typer och undantag

Objektorienterad Programmering (TDDC77)

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

DAT043 Objektorienterad Programmering

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

Generisk klass med typparameter Inre klass - ListIterator

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

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

Tentamen ID1004 Objektorienterad programmering May 29, 2012

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

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

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

Classes och Interfaces, Objects och References, Initialization

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

Föreläsning 4 Innehåll

Föreläsning 10. ADT:er och datastrukturer

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

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

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

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

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Repetition av OOP- och Javabegrepp

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Repetition av OOP- och Javabegrepp

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

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

Tentamen Programmering fortsättningskurs DIT950

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

Arrayer. results

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Objektorienterad Programmering (TDDC77)

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Objektorienterad programmering med Java, Generics

Föreläsning 9 Innehåll

Objektorienterad Programmering (TDDC77)

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

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

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

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

Lösningar för tenta 2 DAT043,

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

TDDC Terminologi Uppdaterad Fö #1

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

TENTAMEN: Objektorienterad programmering. Läs detta! Börja varje hel uppgift på ett nytt blad. Skriv inte i tesen.

OOP Objekt-orienterad programmering

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

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

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

OOP Objekt-orienterad programmering

TDDC76 Programmering och datastrukturer

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

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Föreläsning 15: Repetition DVGA02

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

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

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

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Konstruktion av klasser med klasser

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

Programmering A. Johan Eliasson

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

Transkript:

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning Generiska klasser Undantag Interface Nästlade klasser 1

Problem: Harry har implementerat en länkad lista för datatypen heltal. public class MyListNode { int data; MyListNode next; Han vill nu använda samma implementation igen, men den här gången för strängar. Hur löses uppgiften utan att kopiera all kod för varje framtida nytt behov? 2

En lösning: Använd arv och spara alla datatyper som en Object. public class MyListNode { Object data; MyListNode next; Alla klasser ärver ju från en Object Men de primitiva datatyperna (int, char, double) är ju inte klasser! Det finns det motsvarande klasser: Integer, Character, Double. (s.k. Wrapperklasser ). Fungerar, men kräver en explicit castning (typomvandling) varje gång ett element ska hämtas // Men tänk om datat inte är en sträng då? String data = (String) list.remove(); => Leder ofta till många specialfall 3

Generiska klasser Bättre lösning: Gör klassen generisk! Mall för klasser Exakta utseendet definieras först när klassen används Vi kan tänka på det som en parameter till klassen public class MyListNode<E> { E data; MyListNode<E> next;... Enligt kodkonventionerna skall dessa vara enskilda versaler. E står för element, K för key, V för value o.s.v. MyListNode<String> node = new MyListNode<String>();... String text = node.data; // Ingen typomvandling behövs 4

Generiska klasser(2) Fördelar: Explicit castning undviks Bättre möjlighet för kompilatorn att kontrollera typer -> Fler buggar upptäcks vid kompilering Tydligare kod Blir ett sätt att tvinga programmeraren att göra rätt Kompilatorn infererar (gissar) vilken datatyp som gäller. ArrayList<Human> myhumanarr = new ArrayList<Human>(); <>(); 5

Generiska klasser(3) Ibland uppstår behov av att begränsa vilka typer en generisk klass kan instansieras med (tydlighet, en viss sak måste göras med datan) public class MyListNode<E extends Animal> {... private E data; E kan här bara anta formen av Animal och dess subklasser Vi kan nu anropa Animal-specifika metoder på variabler av typen E t.ex. data.introduceyourself() MyListNode<Cat> node = new MyListNode<Cat>(); // Ok // Går ej, String är inte en subklass till Animal! MyListNode<String> node = new MyListNode<String>(); 6

Jokertecken (en. wildcards) Ibland vet man inte exakt typ, men behöver ändå ange en // Inte jättevackert kanske... public void printallanimals(list theanimals) { for (Object o : theanimals) { // Här måste o typomvandlas till Animal innan vi kan anropa metoden. ((Animal)o).introduceYourself(); // Mycket snyggare! public void printallanimals(list<? extends Animal> theanimals) { for (Animal a : theanimals) { a.introduceyourself(); 7

Undantag (en. Exception) Ett typiskt ohanterat undantag Detta kallas för en stack trace 9

Undantag (en. Exception)(2) public boolean lookup(string pnr) throws PnrNotFoundException { for (int i = 0; i < last; ++i) { if (contents[i].getkey().equals(key)) { return contents[i].getvalue(); throw new PnrNotFoundException( Hittade inte + key);... Dictionary dictionary = new MyDictionaryImpl(); try { boolean passed = dictionary.lookup( 880725-9505 ); catch (PnrNotFoundException e) { System.out.println(e.getMessage()); 10

Undantag (en. Exception) (3) Definiera undantag public class PnrNotFoundException extends Exception { private String pnr; public PnrNotFoundException(String pnr) { super( Could not find the person number + pnr); this.pnr = pnr; public String getpnr() { return pnr; 11

Undantag (en. Exception) (4) Anger något som hänt som ligger utanför normal körning Felaktig indata Körfel Hårdvarufel I Java är undantag objekt Notera: Undantag av typen RuntimeException kräver inte throws, try-catch Fundera noga över huruvida du vill ha Exception, eller RuntimeException som superklass... 12

Undantag (en. Exception) (5) Fånga undantag KiaCeedSW erikskia = new KiaCeedSW(Gray, 2010, KPY038 ); try { erikskia.drive(); catch (NoFuelException e) { erikskia.refill(); catch (EngineOverHeatedException e) { erikskia.stop(); throw e; finally { erikskia.getoutofthecar(); // Vi tar en sväng i bilen, vad kan gå fel? Körs oavsettt om undantag uppstått eller ej 13

Undantag (en. Exception) (5) Hur man inte bör göra KiaCeedSW erikskia = new KiaCeedSW(Gray, 2010, KPY038 ); try { erikskia.drive(); // Vi tar en sväng i bilen, vad kan gå fel? catch (Exception e) { Fångar precis alla // Låtsas som inget hände... undantag! (Med polymorfi) Fånga bara de undantag du förväntar dig! 14

Undantag (en. Exception) (6) När bör man använda exceptions? I undantagsfall! Finns några nackdelar med exceptions. Är dyrt för datorn (JVM:en). Skapar irreguljära hopp i koden 15

Abstrakta klasser (igen) Ett exempel. Säg att vi vill göra en klasshierarki för musikinstrument. public abstract interface class MusicalInstrument {... public MusicalInstrument() { public abstract void blowinto(); public abstract void strike(); public abstract void pushbuttons(); Varje gång vi vill göra en ny subklass av MusicalInstrument kommer vi alltså vara tvungna att implementera dessa tre metoder. Då blir det lätt att göra rätt! Hmm, en klass helt utan implementerade metoder blir ju bara ett gränssnitt. Finns det inte något elegantare sätt att visa det?

Interface Ett interface är i princip en klass, där allt är abstrakt. Alla metoder är public abstract Alla variabler är static final (konstanter) public interface PlayableObject { String playstring = Spela upp ; void play(); Andra klasser kan implemenetera interfacet, (motsvarar arv). public class Ipod implements PlayableObject { public void play() { // starts playing music public class VideoGame implements PlayableObject { public void play() { // starts playing the game public class Flute extend MusicalInstrument implements PlayableObject { public void play() { // starts playing the game public void blowinto() {.

Interface (2) Varför? Man kan bara ärva från en klass (i java) Men man kan implementera godtyckligt många interface public class Flute extend MusicalInstrument implements PlayableObject, MysticalObject, Purchaseable { public void play() { // starts playing the game public void blowinto() {. // implementation required by MusicalInstrument public void performritualwith() {. // implementation required by MysticalObject public void purchase(human buyer, Human seller) {. // implementation required by Purchaseable

Interface (3) Definition: Interface är en referenstyp, precis som klass, som endast kan innehålla konstanter och metoddeklarationer (och nästlade typer) Egenskaper för interfaces Samtliga metoder är per automatik public abstract -> Programmeraren slipper skriva detta -> Går ej att definiera som protected eller private Samtliga variabler är per automatik public static final (konstanter) En klass som implementerar ett interface måste implementera alla dess metoder (eller lämna dem abstract) En klass kan implementera flera olika interfaces samtidigt 19

Interface (4) Med andra ord: Ett interface X är att betrakta som ett certifikat. För att en klass skall få kalla sig för en X så måste den uppfylla alla krav i X. På detta sätt kan andra (klasser) med säkerhet räkna med att implementation existerar. 20

Interface (5) Exempel på andra interface: Iterator. För att få kalla sig för en iterator, måste man tillhandahålla metoderna hasnext(), next() och remove(). List. Ett gemensamt gränssnitt för olika implementationer av ADT:n lista. Collection. Ett gemensamt gränssnitt för samlingar, t.ex. List, Set, o.s.v. Commandable. Ett gemensamt gränssnitt för saker som kan göra docommand i lab 1. (Tips i del C) 21

Interface (6) Exempel: public interface CertifiedDiver { int maximumdepth = 30; void knowfactsaboutbends(); void emptymask(); void flushregulator(); public static final public abstract public class DivingStudent extends Student implements CertifiedDiver { public class CoastGuard implements CertifiedDiver, BoatDriver { CertifiedDiver billy = new DivingStudent(); CertifiedDiver emma = new CoastGuard(); emma.emptymask(); 22

Interface (6) <<interface>> CertifiedDiver. <<interface>> BoatDriver Student +study() +solveproblem() +knowfactsaboutbends() DivingStudent CoastGuard CertifiedDiver instructor = hireinstructorfromclub(); instructor.knowfactsaboutbends(); Polymorfi! Vi vet inte om vi hyrde in en dykarstudent eller kustbevakare. Det spelar dock ingen roll. 23

Nästlade Klasser Man kan lägga klasser inuti andra klasser. class KiaCeedSw { private int miles; private String plate; private GearBox g = new GearBox(); private class GearBox { private char[] symbols = new char[]{'n', '1', '2', '3', '4', '5', '6', 'R'; private int current = 0; public void putintogear(char newgear) { 24 GearBox är nu en medlem till KiaCeedSw-objektet och kan komma åt dess instansvariabler.

Nästlade Klasser (2) Kan deklareras public, private, protected eller package private. Kan deklareras static. Då får den inre klassen ej tillgång till den yttre instansens variabler. Icke-statiska nästlade klasser kallas också för inre klasser. class KiaCeedSw { private int miles; private String plate; private class GearBox { private char[] symbols = new char[]{'n', '1', '2', '3', '4', '5', '6', 'R'; private int current = 0; public void putintogear(char newgear) { Om man bara behöver en klass inuti en metod så kan man faktiskt deklarera en klass där. Då blir det en s.k. lokal klass. 25

Nästlade Klasser (3) Skuggning Om samma namn fins i både inre och yttre klassen så kommer endast det inre namnet finnas tillgängligt när man står där inne. T.ex. kommer this referera till den inre instansen. Man kan då använda syntaxen: OuterClass.this 26

Nästlade Klasser (4) Varför vill man göra detta? Logiskt sätt att gruppera objekt som (starkt) hör ihop. Ytterligare ett sätt att få inkapsling. Kan leda till bättre läslighet och lättare underhåll. class KiaCeedSw { private int miles; private String plate; private class GearBox { private char[] symbols = new char[]{'n', '1', '2', '3', '4', '5', '6', 'R'; private int current = 0; public void putintogear(char newgear) { https://docs.oracle.com/javase/tutorial/java/javaoo/nested.html 27