F7: Rekursiv till iterativ, sammanfattning, genomgång av omtentan Carl Nettelblad

Relevanta dokument
Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Länkade strukturer, parametriserade typer och undantag

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

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Sökning och sortering

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Datastrukturer. föreläsning 3. Stacks 1

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Tentamen, Algoritmer och datastrukturer

Föreläsning 14 Innehåll

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Programmeringsteknik II

Föreläsning 9 Innehåll

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

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

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

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

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

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

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

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

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Tentamen i Algoritmer & Datastrukturer i Java

Teoretisk del. Facit Tentamen TDDC (6)

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Grafik, grafiska användargränssnitt och rörliga bilder

Lösningsförslag till tentamen Datastrukturer, DAT037,

Rekursion och induktion för algoritmkonstruktion

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

Föreläsning 9 Innehåll

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

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Seminarium 13 Innehåll

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning Datastrukturer (DAT036)

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 9 Datastrukturer (DAT037)

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Föreläsning 2 Datastrukturer (DAT037)

Repetition av OOP- och Javabegrepp

DAT043 - föreläsning 8

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Tentamen Datastrukturer, DAT037 (DAT036)

TDDC Terminologi Uppdaterad Fö #1

Kopiering av objekt i Java

Tentamen Datastrukturer för D2 DAT 035

Observera. Tentamen Programmeringsteknik II Skrivtid:

Repetition av OOP- och Javabegrepp

Tentamen Datastrukturer (DAT036)

Träd Hierarkiska strukturer

Föreläsning 4 Datastrukturer (DAT037)

F4: Mer om OU1, OU2, listor och träd. Carl Nettelblad

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Föreläsning 7. Träd och binära sökträd

Lösningar Datastrukturer TDA

Föreläsning 4 Innehåll

Tentamen Datastrukturer (DAT037)

Föreläsning 7. Träd och binära sökträd

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

Tentamen Datastrukturer (DAT036)

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

EDAA01 Programmeringsteknik - fördjupningskurs

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037)

Programmering fortsättningskurs

Programkonstruktion och Datastrukturer

Datastrukturer. föreläsning 6. Maps 1

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

Trädstrukturer och grafer

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

F3: Recursive descent, tokenisering, avbildningar och undantag. Carl Nettelblad

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

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

F7: Användargränssnitt, interaktivitet och grafik. Carl Nettelblad

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning 13 Datastrukturer (DAT037)

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

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

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 13. Rekursion

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

DAI2 (TIDAL) + I2 (TKIEK)

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

Lösningsförslag till exempeltenta 1

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

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Transkript:

F7: Rekursiv till iterativ, sammanfattning, genomgång av omtentan 2018-08-24 Carl Nettelblad 2018-05-21

Lite administrativt Jättevälkomna att redovisa OU5 före deadline Ni får bättre och mer feedback när det är mindre kö och slipper vänta. Kursvärdering finns uppe i Studentportalen. Vi försökte justera bland annat deadlines för uppgifterna och delar i föreläsningsupplägget utifrån förra årets kommentarer. Tar dem verkligen på allvar! Uppsamlingstillfällen 7 juni 10-12 och 12 juni 13-15, 2510. Möjligt att redovisa alla kursens uppgifter, framför allt rester. Men ingen given möjlighet att komplettera igen om ni får rest då. Se till att kolla automattesterna, kodstil, korrekthet och att ni själva minns vad koden gör! ANMÄL ER i gruppindelning i Studentportalen, så vi kan bemanna utifrån det. Anmälan öppen åtminstone till 1 juni.

Iterera i ett träd Träd passar väldigt bra för rekursion Vi kan vilja gå igenom ett träd iterativt Kanske för att det är del av en större rekursion samecontents ett exempel

Stack Rekursion bygger på en stack Anropsstacken Variabelvärden och var i metoden vi står lagras automatiskt i Java Push metodanrop Pop metod returnerar Kasta undantag kan leda till flera pop i följd Anropsstacken visas i felutskriften Men aldrig börja titta mitt i stacken

Göra rekursiv algoritm iterativ Skriv egen kod för stacken Styr när vi gör push och pop Kan behöva lagra både parametrar och tillstånd I vårt fall Node och int 0 vänster delträd, 1 höger delträd Antag att vi har en klass TraversalStack med metoder push, pop, getnode, getstate, isempty

Tankegång Vi väljer att gå igenom trädet in-order Upplägg: Se om det finns ett Node-objekt på stacken Läs av nod och lägestal Poppa Om status är 0 Lägg tillbaka samma nod med status 1 Lägg in vänster delträd med status 0 Om status är 1 Utför operationen för nyckeln Lägg in höger delträd med status 0

Pseudokod void traverse(node start) { Stack s = new Stack(); s.push(start, 0); while (!s.isempty()) { Node now = s.getnode(); int state = s.getstate(); s.pop(); if (now == null) continue;

Pseudokod switch (state) { case 0: // First visit to node s.push(node, 1); s.push(node.getleft(), 0); case 1: // Second visit to node System.out.println(node.getKey()); s.push(node.getright(), 0); default: throw new RuntimeException("Invalid state."); } } }

Kommentar Nullkontroll när vi läser från stacken Lite ineffektivt Annars hade vi behövt kontrollera null på tre ställen För noden själv i början För vänster delträd i state 0 För höger delträd i state 1 Objektet som ska besökas sist läggs på stacken först Störst nytta med en sådan här lösning om arbetet i state 1 vore mer komplext

Sen då? Hur skriver vi om den här till preorder? Postorder? Kan vi stryka state lätt i något fall? Bara Node-objekt på stacken Kan vilja skriva om som metod som ger nästa Node

Pseudokod Node getnodeinorder(stack s) { while (!s.isempty()) { Node now = s.getnode(); int state = s.getstate(); s.pop(); if (now == null) continue;

switch (state) { case 0: // First visit to node s.push(node, 1); s.push(node.getleft(), 0); case 1: // Second visit to node s.push(node.getright(), 0); return node; default: throw new RuntimeException( ); } } return null; } Pseudokod

Sammanfattning Efter godkänd kurs ska studenten kunna: använda programspråket Java, både skriva egen kod och förklara vad en given kod utför; redogöra för begreppen arv och polymorfi i ett objektorienterat språk och använda dessa begrepp i egen programutveckling; implementera rekursiva lösningar till olika problem; beskriva principen för analys av algoritmers effektivitet och utföra sådan analys av enklare algoritmer; beskriva, implementera och använda de grundläggande datastrukturerna array, länkad lista, hashtabell och binärt träd samt abstrakta datatyper som stackar, köer och avbildningar; beskriva hur felhantering med hjälp av undantag fungerar och kunna använda detta i egna program.

Avbryt direkt när ni har frågor! Då kör vi!

Rekursion Omformulera frågan till en fråga som successivt kan reduceras Med ett eller flera olika rekursionssteg Som vart och ett slutligen leder till basfall Inte alltid ett rekursivt anrop (size i BST) Inte alltid ett lika stort rekursionssteg (fibonacci), framför allt inte alltid n 1 Recursive descent exempel på en rekursiv approach till att lösa ett konkret problem (parsning)

Algoritmanalys Hur många grundläggande operationer utförs? I termer av problemets storlek Ignorera konstanta faktorer och termer, fokusera på dominerande term när problemets storlek växer asymptotiskt Typiska algoritmer kan vara Θ 1, Θ n, Θ n 2, Θ log n, Θ n log n, Θ c n Du kan förstås inte veta att en algoritm är något av detta, men det kan vara en bra hypotes. Går ofta att hitta en eller ett fåtal kodrader som kan köras flest gånger. Räkna dem.

Titta på rekursionsdjupet Algoritmanalys för rekursiva algoritmer Hur många reduktionssteg fram till basfallet? Titta på antal rekursiva anrop per nivå 1, 2, fler? Arbete per anrop Arbete för att dela upp problemet Arbete för att sammanställa de rekursiva anropen Ofta Θ 1, men inte alltid Totalt arbete är summan av alla anrops arbete, d.v.s. ofta arbete per anrop gånger antalet anrop

Träd och länkade listor Exempel på riktade grafer Utgå från ett ursprungselement (first eller root) Detta pekar vidare Lätt att formulera rekursiva algoritmer Listor väldigt enkla, träd mer flexibla Fokus på binära sökträd och enkellänkade listor, men finns fler varianter Sorterad eller osorterad lista Listvarianter där man snabbt kan nå sista elementet Allmänna (icke-binära) träd Ett filsystem med mappar och filer är ett icke-binärt träd

Hashtabell Binära sökträd gör binära jämförelser, större/mindre/lika För att göra sökning bland n element krävs log n operationer Arrayer är mycket snabbare Om vi vet index Hashning blir ett standardiserat sätt att säga hitta på ett bra index för ditt komplicerade objekt Om din hashningsfunktion snabbbt ger unika värden för de flesta objekt du använder Och hashtabellen inte är dåligt skriven Kan du lägga till, ta bort och söka i konstant tid i termer av totala antalet objekt!

Hashningsfunktioner Implementeras med hashcode i Java Referenslikhet ( == )som standard Viktig konvention: Objekt som är identiska enligt equals ska ha samma hashvärde Objekt som inte är identiska enligt equals bör ha olika hashvärden (men kollisioner finns allt)

Mängder och avbildningar Java har standardtyper för mängder (Set) och avbildningar (Map) baserade på både hashning och träd Kräver korrekt equals Träd kräver även interfacet Comparable (compareto) Hashning kräver hashcode Mängder lagrar förekomst av element, snabb sökning Finns elementet x? Jämför listor, där det kan finnas flera gånger Avbildningar par av nycklar och värden Variabelvärden i kalkylatorn Nyckeln ofta en sträng Vanligt sätt att lagra inställningar eller vad som helst där det inte på förhand går att säga vad som ska finnas Unika nycklar, samma värde kan förekomma för flera nycklar

Felhantering Det är bra att upptäcka att något går fel Det värsta som kan hända (som felsökande utvecklare) är att ett program fortsätter köras under felaktiga antaganden Undantag ger oss ett sätt att helt särkoppla att upptäcka felet och att hantera det Skikten emellan behöver inte befatta sig med felet Undantag kastas och fångas (och kan återkastas) Vilka undantag som fångas styrs av en klasshierarki Fånga subklass mer specifikt än att fånga basklassen

Felhantering Bra att skapa egna subklasser för undantag Fånga så specifikt som möjligt Hantera fel är mer än bara börja om eller skriv ut felmeddelande Läsa till slutet av raden i kalkylatorn Stänga öppna filer/nätverksanslutningar i andra program throws krävs i metodhuvudet för normala undantag

Arv och klasshierarkier Klasshierarkin i Java är ett träd Rotat i Object Alla objekt, av alla klasser är ett Object Gäller även för andra basklasser Alla RuntimeException är ett Exception, men inte tvärtom! Alla metoder i basklassen finns i subklassen Metoder kan överskuggas Sätt @Override för att markera tydligt att det är avsikten Även när du har ett Object är det varje enskild equals som används Klasser och metoder kan vara abstrakta Konkreta subklasser måste implementera alla abstrakta metoder

Interface Lite som en helt abstrakt klass Men ingår inte i klasshierarkiträdet Varje klass har exakt en direkt basklass, men varje klass kan implementera flera interface (direkt eller genom sina basklasser) extends för arv, implements för interface Exempel vi sett är Comparable, Set, Map, ActionListener

Grafik och händelsebaserad programmering Stort skifte att inte ha kontrollen över hela programmet I stället för att du anropar biblioteket för att göra saker är det biblioteket som anropar dig för att göra saker Användaren klickade på knappen, gör något! Fönstret måste ritas upp, gör något! Timern tickade, gör något! Men det är ofta du som i annan kod har sagt att det ska finnas en knapp och att du vill lyssna på den, att fönstret ibland måste ritas upp, eller att du vill ha en timer

Omtentan augusti 2017 I princip samma upplägg som er tenta Flervalsfrågor följda av enkla frågor med färdiga svarsrutor ( A-delen ) Godkänt betyg genom att bara svara på den delen I huvudsak ska allt vara rätt Men inte varje semikolon på rätt ställe Varje mål berörs flera gånger Störst risk för underkänt om vi ser konsekventa brister på ett eller flera av målen Det är mycket värre än spridda småfel

B-delen Mer komplicerade uppgifter, både skriva kod och resonemang Svara på separat blad B-delen rättas bara om A-delen är godkänd För 4 minst hälften i huvudsak rätt För 5 i princip allt En A-del som nätt och jämnt blev godkänd kan dra ned betyget även om B-delen ser mycket bra ut Upprepar inte facit här, kommenterar uppgifterna

I princip kunskapsfrågor från kursen. Flervalsfrågor

Flervalsfrågor Läs noga all information om ett eller flera svar är/kan vara rätt.

Flervalsfrågor Läs noga all information om ett eller flera svar är/kan vara rätt.

Flervalsfrågor En logaritmisk del är inte det samma sak som att den växer logaritmiskt. Läs noga även om alternativen på olika frågor liknar varandra.

A2 Javadockommentaren beskriver vad metoden gör, men säger inte vad den heter. Den säger inte returtyp, men säger vilken sorts värde som returneras. Den säger exakt vad argumenten heter. Här fick vi veta att den räknade ut upphöjt. I texten stod det att var decimaltal, men double som sådant nämndes inte. public static double pow(double base, int exponent)

A3 Standardrekursion för listor. Hjälpmetod som jämför varje nod tills den hittat rätt, returnerar ny efterföljare som sätt att utföra raderingen. Notera behovet att kasta undantag i basfallet. Att uppgiften ber dig att implementera en metod betyder inte att du BARA bör/kan/får skriva den metoden.

A4 Dokumentationen för String var bilaga. Parametrarna kan vara en char-array, ett index och en längd. Returtypen är en sträng. Alltså blir värdet här strängen (inte arrayen eller något annat) "bcd Viktigt att kunna läsa kod och skriva kod, men också viktigt att kunna läsa och skriva dokumentation Ju komplexare funktionalitet du använder, desto viktigare att inte behöva förstå hela koden du anropar för att kunna använda den

A4 Dokumentationen för String var bilaga. Parametrarna kan vara en char-array, ett index och en längd. Returtypen är en sträng. Alltså blir värdet här strängen (inte arrayen eller något annat) "bcd Viktigt att kunna läsa kod och skriva kod, men också viktigt att kunna läsa och skriva dokumentation Ju komplexare funktionalitet du använder, desto viktigare att inte behöva förstå hela koden du anropar för att kunna använda den

A5 Det är viktigt att kunna implementera standardmetoderna tostring, equals, hashcode korrekt för egna klasser. Vi har inte gjort equals så mycket. Men i kodbilagan fanns flera exempel på equals för andra klasser (t.ex. List)! equals jämför alltid med ett annat Object DU måste kolla att objektet inte är null och är av rätt typ (Student) innan du typomvandlar till Student och försöker komma åt dess fält

A6 Vi får en ledtråd i att String implementerar Comparable. Dokumentationen för Comparable fanns med i bilagan. 0 betyder likhet. Om och endast om surname.compareto(s.surname) är 0 behöver vi jämföra firstname, annars returnerar vi det vi fick för surname

A6 Vi får en ledtråd i att String implementerar Comparable. Dokumentationen för Comparable fanns med i bilagan. 0 betyder likhet. Om och endast om surname.compareto(s.surname) är 0 behöver vi jämföra firstname, annars returnerar vi det vi fick för surname

A7 Tidskomplexiteten tar vi reda på genom att förstå det rekursiva förloppet. Det här var en sorterad lista, så metoden stegar så länge elementet som ska läggas till kommer senare i sorteringsordningen än nuvarande element. Om vi inte vet något annat om elementet som läggs till bör det i medeltal hamna mitt i listan, så komplexiteten är proportionell mot längden.

A8 Borde ha stått höjden, men tydligt från uppgiften. Ni gjorde samma sak i OU3. Kruxet är att se att man måste följa alla grenar i trädet och ta max på varje nivå.

A9 Också väldigt lik OU3, men också en demonstration av en viktig teknik, där hjälpmetoden inte returnerar något utan har voidtyp. Resultatet syns i stället i att den förändrar en ArrayList som skickas in.

Hur kontrollera att en sträng är null eller tom? Hur göra det i rätt ordning för att undvika NullPointerException? A10

A11

A11 Hur fungerar arv? Om A extends B vad gäller då? Varje A är en B. Varje B är inte en A. En variabel av basklasstyp kan referera till ett objekt av subklasstyp.

A11 I Java tillämpas konsekvent dynamisk bindning. Det är objektets typ, inte variabelns typ, som styr vilken metod som anropas. Draw-metoden för en Rose anropas alltid för det objektet, även om det är en Plant-variabel som refererar till den.

Dags för högre betyg. Godkänd!

B1 Vi måste titta på List och övriga klasser, vad saknas vad gäller equals och hashcode? List.equals finns, Student.equals finns, Student.hashCode finns List.hashCode saknas! Kombinera hashvärdena för alla studenter genom addition och multiplikation med primtal Godtagbar trubbig strategi

B2 Rätt vanligt scenario, vi vill göra en traversering och någon typ av filtrering samtidigt. Och vi vill inte i onödan besöka delar av trädet som inte kan bidra till summan. Dock fel i facit, vänstergrenen måste följas även om now.data >= limit

B3 Vi ska generera en ArrayList, så vi har nog en hjälpmetod med void som returtyp Vad kan vi rekursera på? Början av ordet och hur många versaler vi har kvar att placera ut På varje nivå Lägg till gemen och rekursera med en bokstav till, samma count Lägg till versal och rekursera med en bokstav till, count 1 Basfall count blir negativt, bryt Vi uppnår mallsträngens längd, lägg till i listan

B4

B4 Rekursion i x- och y-koordinater Rekursionssteg prova x+-1, y +-1 Sätt färgen till newcolor Basfall Färgen är inte oldcolor För varje rekursionssteg som inte är basfallet kommer vi att ändra färg på minst en pixel Både rekursionsdjup och komplexitet är som värst linjära med antalet pixlar Se upp om gammal och ny färg är identiska i första anropet Annars, starta i angiven startpunkt

B5 Tänk på att ni kan använda en lämplig bas när konstanta faktorer är irrelevanta. I bas 10 är jämförelsen lätt att göra, man kan lösa ut konstanter för de olika algoritmerna och se vad som dominerar. Skriva en tabell över olika värden eller skissa kurvor kan vara en hjälp.

B6 Titta på att alla metoder som anropas faktiskt finns för de typer som är deklarerade. Om variabeln har typ A kan du bara anropa de metoder som finns i A, även om de versioner av metoderna som anropas är de i B. Tänk på effekterna av olika synlighet (private, protected, public) Tänk på att abstrakta metoder och metoder i interface måste implementeras i berörda konkreta klasser Tänk på skillnaden mellan extends och implements

Lycka till med tentan och OU5! Frågor?