Abstrakte metoder og klasser

Like dokumenter
Abstrakte metoder og klasser. Abstrakte metoder og klasser. Uke 9 INF1010, 27. februar 2007, Abstrakte klasser og grensesnitt (interface)

Abstrakte metoder og klasser

Abstrakte metoder og klasser. Abstrakte metoder og klasser

Uke 6 INF1010, 5. februar 2008, Abstrakte klasser og grensesnitt (interface) Stein Gjessing Inst for Informatikk Univ. i Oslo

Institutt for informatikk. INF1010, 18. februar 2010, Inst for Informatikk

INF1010, 10. februar 2009, Konstruktører. Inst for Informatikk

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

INF1010, 8. mars Om klassehierarkier, grensesnitt (interface) og multippel arv. Konstruktører i subklasser. Unntak.

n / ($$ n 0$$/ $ " 1! <! ')! $ : ; $.+ $.5.+ .!)/!/ ) $.) 6$ 7$, $.5., $ 7$,

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

INF1010, 23. februar Parametriserte klasser Om å gå gjennom egne beholdere (subklasser og grensesnitt 3)

INF1010 våren Arv og subklasser - del 2

INF1010, 24. februar Stein Gjessing Inst for Informatikk Universitetet i Oslo

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF april 2017

INF1010 våren Arv og subklasser, del 2

INF1010 våren 2017 Torsdag 2. februar. Arv og subklasser - del 2

INF april 2016

INF1010 våren Arv og subklasser - del 2

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1010 oversikt med

INF1010 våren Arv og subklasser del 1

IN1010 våren 2018 Tirsdag 6. februar. Arv og subklasser - del 2

INF våren 2015

INF1010 våren Arv og subklasser del 1

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF1010 våren februar. Arv og subklasser, del 2

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

INF1010 våren Arv og subklasser - del 2

INF1010 våren Arv og subklasser, del 2

INF1010 våren 2007 Uke 6, 6. februar Arv og subklasser, del 2

INF1010 våren februar. Arv og subklasser, del 2. Repetisjon. Repetisjon - Biler. Repetisjon: Klasser - Subklasser

INF1010 våren Arv, subklasser og grensesnitt - del 2

Enkle generiske klasser i Java

INF1010 oversikt med

Løsningsforslag til eksamen i INF1000 våren 2006

INF1010 oversikt med. 23. mai Subklasser mm. Unntaksbehandling GUI Tråder. Stein Gjessing InsBtuC for informabkk Universitetet i Oslo

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

2 Om statiske variable/konstanter og statiske metoder.

INF1010. Grensesnittet Comparable<T>

INF1010. Stein Michael Storleer (michael) Lenkelister

IN1010 våren 2018 Tirsdag 13. februar. Interface - Grensesnitt

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

INF1010 våren 2008 Uke 5, 29. januar Arv og subklasser eksempler Litt om unntakshåndtering (40 og 41) Stein Gjessing Institutt for informatikk

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

IN1010 våren januar. Objektorientering i Java

Kapittel 7: Mer om arv

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Læringsmål for forelesningen

INF Løsning på seminaropppgaver til uke 8

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

INF1010 våren 2008 Uke 5, 29. januar Arv og subklasser eksempler Litt om unntakshåndtering (40 og 41)

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

INF1010 våren Grensesnitt

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010 Binære søketrær ++

En klasse som arver, eller selv deklarerer en abstrakt metode, må deklareres som abstrakt.

INF1010 våren Grensesnitt

UNIVERSITETET I OSLO

INF1010 oversikt med. 19. mai Subklasser mm Unntaksbehandling GUI Tråder. Stein Gjessing InsBtuC for informabkk Universitetet i Oslo

INF1000: Forelesning 6. Klasser og objekter del 1

INF1010 Arv. Marit Nybakken 2. februar 2004

Uke 5, 27. januar Arv og subklasser del I. Stein Gjessing Institutt for informatikk

INF1010 våren 2010 Torsdag 4. februar. Arv og subklasser del I. Emneoversikt subklasser (2 uker) Hva er en subklasse? Eksempel: Universitetsregister

INF Notater. Veronika Heimsbakk 10. juni 2012

INF Uke 10. Ukesoppgaver oktober 2012

Gjennomgang av eksamen H99

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Kapittel 9: Sortering og søking Kort versjon

Del 3: Evaluere uttrykk

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Runtimesystemer - II. Funksjoner som parametere. Virtuelle metoder

INF1010 våren 2018 tirsdag 23. januar

JAVA Oppsummering for IS-102. Even Åby Larsen

INF1010 våren Grensesnitt (interface)

Introduksjon til objektorientert programmering

INF1000: noen avsluttende ord

IN 211 Programmeringsspråk. Java. på 20 enkle ark. spesielt for de som kan. Simula. (og gjerne litt C) Ark 1 av 20

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

Post-it spørsmål fra timen (Arv og subklasser)

Læringsmål for forelesningen

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Transkript:

Abstrakte metoder og klasser INF1010, 10. februar 2009, Abstrakte klasser og grensesnitt (interface) Konstruktører Stein Gjessing Inst for Informatikk Univ. i Oslo Abstrakte metoder abstract før deklarasjonen av en metode betyr at metoden ikke inneholder noe program / kode ( ; istedenfor {... (eksempel neste side) ) Subklasser må da gi kode til denne metoden. Abstrakte klasser klasse med abstract før class kan (men må ikke) inneholde abstrakte metoder En klasse med en abstrakt metode må deklareres som en abstrakt klasse. Kan ikke lage objekter av abstrakte klasser (må vente til vi har en ikke-abstrakt subklasse) 2 Abstrakte metoder og klasser Ikke lov å si new Ansatt()! navn timelonn abstract class Ansatt { String navn; double timelonn; beregnbonus(); abstract double beregnbonus(); Subklassene arver på vanlig måte alle egenskapene fra den abstrakte superklassen Heltidsansatt objekt class Deltidsansatt extends Ansatt { double beregnbonus() { return 0; navn timelonn class Heltidsansatt extends Ansatt { int ansiennitetsfaktor; double beregnbonus() { return timelonn* ansiennitetsfaktor; beregnbonus(); ansiennitetsfaktor beregnbonus() Deltidsansatt objekt navn timelonn beregnbonus(); beregnbonus() return 0; Pekere av abstrakte typer (selv om det ikke finnes slike objekter) Ansatt[ ] allepersoner Deltidsansatt navn timelonn Heltidsansatt objekt beregnbonus(); ansiennitetsfaktor beregnbonus() Ellers helt som vanlige subklasser med polymorfi (virtuell metoder) 3 Heltidsansatt return timelonn* ansiennitetsfaktor 4

Når bruker vi abstrakte metoder og klasser? UML klassehierarki med abstrakt klasse Ansatt Abstrakte klasser En abstrakt klasse er en superklasse det ikke kan eller skal lages objekter av. Det er ikke lov å si new A() på den abstrakte klassen A. Abstrakte metoder Er en metode uten innhold (i en abstrakt klasse) ; istedenfor { Fordi det ikke gir mening å lage et innhold ((Noen ganger har vi tomme metoder istedenfor abstrakte)) Må lag en subklasse som tvinges til å gi koden Abstrakte metoder er alltid polymorfe En subklasse til en abstrakt klasse kan selv være abstrakt. abstract 6 5 Arv I Java kan en klasse bare arve egenskapene til én annen klasse (en superklasse). Dette gjør språket sikrere å bruke Hva skal vi gjøre hvis vi ønsker at et objekt skal inneholde mange forskjellige egenskaper fra forskjellige superklasser? På de neste sidene: Begrepshierarkiet i et bibliotek Motivasjon for begrepet gresesnitt (interface): Analyse av bibliotek Bøker, tidsskrifter, CDer, videoer, mikrofilmet materiale, antikvariske bøker, flerbindsverk, oppslagsverk, upubliserte skrifter, En del felles egenskaper antall eksemplarer, hylleplass, identifikasjonskode () for det som kan lånes ut: Er utlånt?, navn på låner,... (TilUtlån) for det som er antikvarisk: Verdi, forskringssum,... (Antikvarisk) Spesielle egenskaper: Bok: Forfatter, tittel, forlag Tidsskriftnummer: Årgang, nummer, utgiver CD: Tittel, artist, komponist, musikkforlag 7 På de neste sidene betyr En klasse i et subklassehierarki (og ikke en klassedatastruktur) 8

Tvilsomt begrepshierarki Forslag til subklassehierarki Omrokkering uten suksess Utlånbart IkkeLånbart Bok CD Tidskrift BokU CDU UtlånbarBok IkkeLånbarBok UtlånbarCD IkkeLånbarCD Utlånbart IkkeLånbart Tidsskriftnr Tidsskriftnr TidsskriftnrUtl Bok CD Tidsskriftnr 9 interface TilUtlån Samle lik oppførsel: Interface (norsk: grensesnitt) class Bok class UtlånbarBok class CD class UtlånbarCD class class Tidskriftnr class Utlånbart t Tidsskriftnr En klasse kan også tilføres et interface (i tillegg til arveegenskapene i klassehierarkiet) k Dvs. en klasse kan spille to roller 11 Hva er et grensesnitt (interface)? En samling egenskaper (en rolle) som ikke naturlig hører hjemme i et arve-hierarki En samling egenskaper som mange forskjellige ting av forskjellige typer kan anta For eksempel Kan delta i konkurranse (startnummer, resultat,.. Mennesker, biler, hester kan delta i konk.) Svømmedyktig (mennesker, fugler er svømmed.) Her: Antikvarisk (møbler, bøker,. ) Kan lånes ut (biler, bøker, festklær, ) Sammenlignbar (Comparable) 12

Hva er et grensesnitt (interface)? Et interface likner en abstrakt klasse Alle metodene i en interface er abstrakte og polymorfe En interface inneholder ingen variable eller annen datastruktur (men kan ha konstanter) En klasse som arver egenskapene til et interface må selv putte inn kode i alle de abstrakte metodene (og deklarere passende variable som disse metodene bruker). En klasse kan arve egenskapene til mange grensesnitt (men bare en klasse) Å arve (en samling metoder) = å spille en rolle 13 interface TilUtlån UtlånbarBok Flere grensesnitt Verk Bok CD Video AntekvUtlånbrCD AntikvariskBok i kb k IkkeLånbarCD Utlånbart Tidsskriftnr Utlånbart, Antekvarisk Tidsskrift interface Antikvarisk Tidskriftnr En klasse kan tilføres et ubegrenset antall interface-er Dvs. en klasse kan spille et ubegrenset antall roller IkkeLånbartTids skriftnr Antikvarisk tidsskriftnr 14 Nytt eksempel Hvis vi ønsker at noen objekter også skal kunne spille rollene (ha egenskapene) Skatt og Miljø : Enkelt eksempel med bil-hierarkiet class Bil { String regnr; class Lastebil extends Bil { double lastevekt; Bil Skattbar interface Skattbar { double toll( ) ; int momssats() ; toll ( ); momssats( ); interface Skattbar { double toll( ) ; int momssats() ; Skattbar Lastebil interface Miljovennlig { int co2utslipp ( ); boolean svanemerket ( ) ; Miljovennlig co2utslipp( ); svanemerket( ); 15 interface Miljovennlig { int co2utslipp ( ); boolean svanemerket ( ) ; Miljovennlig 16

Tre nye klasser som kan spille mange roller Skattbar Miljovennlig Bil Lastebil Personbil Rerservert Java-ord: implements (1) rollen (i arv) fra klassehierarkiet class Personbil extends Bil implements Skattbar { int antpass; double momsgrunnlag = 150000; public double toll( ) { return momsgrunnlag * 0.5; public int momssats( ) {return 25; rollen Skatt bar MiljoBil class Bil {St String regnr; Skatt Bil LastebilMedSkattogMiljo Men metodene må (dessverre) skrives på nytt hver gang de brukes 17 interface Skattbar { double toll( ) ; int momssats() ; Personbil 18 Nytt Java-ord: implements (2) class MiljoBil extends Personbil implements Miljovennlig { int utslipp = 200; public int co2utslipp pp(){ {return utslipp; pp; public boolean svanemerket () { return false; Rollene i (arv fra) klassehierarkiet rollen Miljovannlig class LastebilMedSkattogMiljo extends Lastebil implements Skattbar, Miljovennlig { double innkjopspris = 200000; int utslipp = 400; public double toll( ) { return innkjopspris * 0.1; rollen Skattbar public int momssats( ) {return 20; public int co2utslipp ( ) {return utslipp; rollen Miljovennlig public boolean svanemerket () { return false; Den rød-grønne regjeringen g vil kanskje gjøre MiljoBil arver rollen Skatt fra Personbil noe med det 19 En litt annen definisjon av MiljøBil Rollene Skattbar i (arv fra) klassehierarkiet class MiljoBil extends Personbil implements Miljovennlig { int utslipp = 200; public int co2utslipp pp(){ {return utslipp; pp; ny roll Miljovennlig public boolean svanemerket () { return false; public double toll( ) { return momsgrunnlag * 0.2; rollen Skattbar public int momssats( ) {return 10; forandres her Her arver MiljoBil rollen Skattbar fra Personbil, men redefinerer virkningen av toll og momssats 20

Bil minbil; Lastebil minlast; LastebilMedSkattogMiljø denne; Skattbar skatteobjekt; Miljovennlig miljoting; Hva kan vi se gjennom de forskjellige pekerene? Et objekt og noen pekere new LastebilMedSkattogMiljø() regnr lastevekt toll ( ); momssats( ); co2utslipp( ); svanemerket( ); Object obj; Bil Lastebil rollen Skattbar rollen Miljovennlig Legg til metoder for å skrive ut på skjerm: class Bil { String regnr; void skriv(){ System.out.println( Registreringsnummer: " + regnr); class Lastebil extends Bil { double lastevekt; void skriv (){ super.skriv(); System.out.println("Lastevekt: "+lastevekt); Det er sant: Vi kan ha pekere av interface-type utslipp innkjopspris egne ting (og egen rolle) 21 22 Skriv i LastebilMedSkattOgMiljo class LastebilMedSkattOgMiljo extends Lastebil implements Skattbar, Miljovennlig { double innkjopspris = 200000; int utslipp = 400; public double toll( ) { return innkjopspris * 0.1; public int momssats( ) {return 20; public void skrivskatt( ) { System.out.println("Innkjøpspris " + innkjopspris); public int co2utslipp ( ) {return utslipp; public boolean svanemerket () { return false; public void skrivmiljo( (){S System.out.println("Utslipp t tl li "+ utslipp); tli public void skriv( ) { System.out.println( Lastebil t tl t med skatt og miljø: "); super.skriv( ); skrivskatt(); skrivmiljo(); (Skattbar og Miljovennligli som før) Det er ikke naturlig at Skatt og Miljo skal kreve en skriv -metode (Som fø ør) 23 Bil minbil; Skriv i LastebilMedSkattogMiljo Lastebil minlast; LastebilMedSkattogMiljø denne; Skattbar skatteobjekt; Miljøvennlig miljøting; public void skriv( ) { System.out.println ( Lastebil med skatt og miljø: "); super.skriv( ); skrivskatt(); skrivmiljo(); LastebilMedSkattogMiljø-objekt regnr lastevekt toll ( ); skriv() skriv() momssats( ); co2utslipp( ); svanemerket( ); utslipp innkjopspris skrivmiljo() skrivskatt() skriv() Object obj; (egne ting og) egen rolle 24

Tilbake til biblioteket Klassehierarki, forenklet bibliotek interface TilUtlån Bk Bok CD BokTilUtlaan BokIkkeUtlaan CDTilUtlaan CDIkkeUtlaan 25 Forenklet bibliotek abstract class { String tittel; interface TilUtlån abstract class Bok extends { Bk Bok String forlag; int trykningsår; BokTilUtlaan BokIkkeUtlaan Ordet abstract kan interface TilUtlaan { abstract void låne(string låner) ; abstract void levere() ; abstract boolean utlånt() ; static final String ingen = "ingen"; // Slutt interface TilUtlaan sløyfes før metodenavnet i et interface (det er jo helt opplagt) 26 interface TilUtlaan Bok BokTilUtlaan BokTilUtlaan BokIkkeUtlaan Bare disse to klassene kan vi lage objekter av BokTilUtlaan har både egenskapene til Bok og egenskapene til TilUtlaan. Objekter av denne klassen kan spille begge rollene! class BokTilUtlaan extends Bok implements TilUtlaan { String låner = ingen; public void låne (String l) { låner = l; public void levere() { låner = ingen; public boolean utlånt() { return låner!= ingen; // Slutt class BokTilUtlaan class BokIkkeUtlaan extends Bok { 27 Se på implementasjonen igjen: interface TilUtlaan { abstract void låne(string låner) ; abstract void levere() ; abstract boolean utlånt() ; static final String ingen = ingen"; Metodene i et interface er veldig polymorfe class BokTilUtlaan extends Bok implements TilUtlaan { String låner = ingen; public void låne (String l) { låner = l; public void levere() { låner = ingen; Dette er de tre metodene som vi public boolean utlånt() { må love å return låner!= ingen; implementere 28

interface TilUtlaan { abstract void låne(string låner) ; abstract void levere() ; abstract boolean utlånt() ; static final String ingen = ingen"; interface TilUtlån CD abstract class CD extends { String komponist, artist, musikkforlag; CDTilUtlaan CDIkkeUtlaan class CDTilUtlaan extends CD implements TilUtlaan { String låner = ingen; public void låne(string l) { låner = l; Her er public void levere() { låner = ingen; de tre public boolean utlånt() { return låner!= ingen; metodene igjen // Slutt class CDTilUtlaan class CDIkkeUtlaan extends CD { 29 Mer om grensesnitt (interface) Navnet på et Interface (grensesnitt) kan brukes som klassenavn når vi lager pekere (så vi på side 21) Vitsen med et grensesnitt er å spesifisere hva som skal gjøres (ikke hvordan) Det kan godt være flere implementasjoner av et grensesnitt (flere klasser kan implementere det). Vi vet: En klasse kan implementerer (flere) grensesnitt samtidig som klassen også er subklasse av (bare) en annen klasse. En implementasjon (av et grensesnitt) skal kunne endres uten at resten av programmet behøver å endres. Men selv om et grensesnitt skal spesifisere hva (og ikke hvordan), spesifiseres bare syntaksen (signaturen) og ikke hva som gjøres (semantikken) 30 Anta at vi skal lage et register i et bibliotek Filformat: 4 BI JavaGently Addison-Wesley 1998 CU Favoritter Grieg Kyrkjebø Musikkforlaget ingen BU JustJava Sun 1998 Kari CI Favourites Wonder,Stevie Dion,Celine BMG Først antall poster på filen For hver post: - dokumenttypen (BU, BI, CU eller CI) - tittel - Hvis Bok: forlag år - Hvis BokTilUtlån: Også låner - Hi Hvis CD: CDkomponist / artist / musikkforlag - Hvis CDTilUtlån: Også låner 31 innfil register Innlesning Register - objekt antdok alleer void lesfrafil() d = null; String dokumenttype; In innfil = new In( dokumentfil.txt ); antdok = innfil.inint( ); for (int i=1; i<=antdok; i++){ dokumenttype = innfil.inword( ); if (dokumenttype.equals("bu")) d = new BokTilUtlaan(); else if (dokumenttype.equals("bi")) d = new BokIkkeUtlaan(); else if (dokumenttype.equals("cu")) d = new CDTilUtlaan(); else if (dokumenttype.equals("ci")) d = new CDIkkeUtlaan(); d.lesfra(innfil); alleer.put(d.tittel,d); // Slutt for Bok TilUtlaan BokTilUtlaan CD TilUtlaan CDTilUtlaan 32

utfil void skrivtilfil() td = null; String dokumenttype; Out utfil = new Out( dokumentfil.txt ); utfil.outln(alledokumenter.size( )); register Utskrift Register - objekt for ( d: alleer.values()) { d.skrivtilfil(fil); HashMap<String,> alleer; alleer = new HashMap<String,er> ( ); alleer d alleer.values() Bok TilUtlaan BokTilUtlaan CD TilUtlaan CDTilUtlaan 33 Metoden låne i Register void låne() void låne() throws IOException { boolean utlånt() d = null; String h; void levere() System.out.print( Tittel: "); h = in.readstring( ); d = alleer.get(h); if (d==null) System.out.println("Beklager, denne har vi ikke"); else if (d instanceof TilUtlaan) { TilUtlaan t = (TilUtlaan) d; Navn: t if (t.utlånt()) { System.out.println("Beklager, utlånt"); else { Type: TilUtlån System.out.print( Låners navn: "); String n = in.readstring( ); t.låne(n); // slutt kan lånes ut // Slutt if (d instanceof TilUtlaan) else System.out.println("Beklager, denne låner vi ikke ut"); // Slutt låne 34 Klasse- og interface-tilhørighet (igjen) Test med operatoren instanceof if (d instanceof TilUtlaan) p instanceof C Gir TRUE dersom p peker på et objekt av klassen C eller en subklasse av C, eller dersom p peker på en klasse som implementerer interfacet C Endring med casting d Bok d = alleer.get(h); TilUtlaan t = (TilUtlaan) d; t ser bare TilUtlån-egenskapene! OK, dersom d spiller rollen TilUtlaan, dvs. er et objekt av en av klassene BokTilUtlaan eller CDTilUtlaan Object TilUtlaan BokTilUtlaan 35 leveretilbake i Register void leveretilbake() { void låne() d = null; boolean utlånt() String h; System.out.print( Tittel: "); void levere() h = in.readstring( i (); d = alleer.get(h); if (d==null) System.out.println("Beklager, t tl feil tittel"); else if (d instanceof TilUtlaan) { TilUtlaan t=(tilutlaan) d; Navn: t if (t.utlånt()) { t.levere(); Type: TilUtlån System.out.println( println("takk"); Takk); else System.out.println("Beklager, denne er ikke utlånt"); // Slutt if (d instanceof TilUtlaan) 36

Indre klasser Klasser i Java kan defineres inni hverandre. Objekter i den indre klassen kan referere til metoder og variable i sitt omsluttende objekt! * + Lettvint + Skjuler implementasjon Flere feilmuligheter Du må altså opprette et objekt av den ytre klassen før du får lov til å lage objekter av den indre klassen (*hvis ikke den indre klassen er static ) class Register { HashMap<String,Person> liste; class Person { String navn; void registrer() {... liste.put(navn,this); this);... // Slutt class Person // Slutt class Register Ikke viktig i inf1010 37 Et utvalg fra Javas klassehierarki class Object { // Alle objekters mor boolean equals(object obj)... Object clone()... public final class String extends Object { public final class Math extends Object { public class Date extends Object { public abstract class Calendar extends Object { public interface Map<K,V> { public interface Collection<E> { public interface Iterator<E> { public abstract class AbstractMap<K,V> extends Object implements Map<K,V> { Alle klasser er subklasser av class Object. Hvis klassedeklarasjonen ikke har med extends, tolker kompilatoren det som extends Object public class HashMap <K,V> extends AbstractMap <K,V> implements Map <K,V>, Cloneable, Serializable { V get(object key) { void put (K key, V value) { K: Key, E: Element, V: Value 38 class HashMap<K,V> class HashMap class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>,, Cloneable, Serializable { // Hemmelig datastruktur public void put(k key, V value) { public V remove(object key) { public V get(object key) { Java har etter hvert mange klasser som kan brukes til å ta vare på objekter (Containers): Vector, ArrayList, Collection, HashMap HashSet, LinkedList, Stack, TreeSet, TreeMap, ) class HashMap extends AbstractMap implements Map, Cloneable, Serializable { // Hemmelig datastruktur public void put(object key, Object value) { public Object remove(object key) { public Object get(object key) { public boolean containskey(object key) { public boolean containskey(object key) { public boolean containsvalue(object value) { public boolean containsvalue(object value) { public int size( ) { public Collection<V> values( (){ public int size( ) { public Collection values( (){ Uten typer, bare med Object, blir det slik // slutt class HashMap 39 // slutt class HashMap 40

public interface Collection{ public int size(); class HashMap<K,V> { <Hemmelig datastruktur> class Ukjent<V> implements Collection<V> { public void put(k nokkel, V verdi ){ public Collection<V> values( ) { Ukjent<V> u = new Ukjent<V> ( ) ; return u;... HashMap og grensesnittet t Collection HashMap har altså sine egne implementasjoner av Collection som er hemmelig for oss utenfor, men siden alle metodene er kjent kan vi kalle på ådisse (på neste side) 41 Implementasjon av Collection void visalleer() alleer d For ( d: alleer.values()) { d.vispaaskjerm(); // slutt for objekt av class Ukjent implements Collection Iterator iterator( ) Collection values() hasnext( ) next( ) objekt av class Ukjent2 implements Iterator -objekt 42 Grensesnitt (interface) enda en gang g Et grensesnitt (interface) har bare metodenavn med parametre, men ikke kode (husk ;) konstanter (static final - eks static final int ANTALL = 4;) Bruker interface i steden for class før navnet Gir en type / rolle som andre må implementere class ABC implements ButikkSystem {...her gis kode for alle metodene i ButikkSystem... Meget nyttig, brukes mye ved distribuerte systemer og generelle programbiblioteker som Javas eget Ulempe: Koden/implementasjonen må gjøres mange ganger g Mer generelt kjent under navnet ADT =Abstrakt DataType, Vi definerer hva en ny datatype skal gjøre, ikke hvordan dette gjøres. Det kan være mange mulige implementasjoner (=måter å skrive kode på) som lager en slik datatype. Hva som er beste implementasjon e må avgjøres etter hvilken bruk vi har. 43 Objektifisering og av-objektifisering (Boxing and un-boxing) For alle de primitive typene finnes det en tilsvarende klasse: Double klassedatastruktur Boolean boolean Double valueof ( ) Short short double parsedouble ( ) Integer int Long long Type: Double Character char Double double Navn: pipek double doublevalue( ) Float float Byte byte 3.1415 Double klassedobjekt I tillegg til at vi kan lage objekter av klassene og legge primitive verdier inn i disse objektene, inneholder klassene (static) metoder som kan Type: double hjelpe til med å manipulere verdier av de forskjellige 3.1415 typene. For eksempel (linje er en String): Navn: pitall double tall = Double.parseDouble(linje); Se i pakken java.lang 44

put og get i Map (Java api) Dette trenger vi i programmene på de neste sidene Eksempel: Uten Automatisk ti objektifisering i V put(k key, V value) Associates the specified value with the specified key in this map. If the map previously contained a mapping for the key, the old value is replaced... Returns: the previous value associated with key, or null if there was no mapping for key. (A null return can also indicate that the map previously associated null with key.) V get(object key) Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key... Slik skal programmene virke: Lett modifisert fra eksempel på java.sun.com import java.util.*; // Prints a frequency table of the words on the command line public class Boks { public static void main(string [ ] args) { Map<String, Integer> m = new HashMap<String, Integer>(); // trenger bare Map-egenskapene til HashMap-en // m er tom til å begynne med! for (String word : args) { // for-each-løkken går gjennom hele tabellen Integer freq = m.get(word); if (freq == null) // da er ikke ordet sett før m.put(word, new Integer(1) ); // fekvensen er 1 første gang else m.put (word, new Integer (freq.intvalue() + 1) ); // øker frekv. med 1 System.out.println(m); Type int 2 Integer objekt Integer(int i) int intvalue( ) String tostring (int i) 2 freq Type Integer String tobinarystring (int i) 45 Integer klassedatastruktur 46 Eksempel: Med Automatisk ti objektifisering i Lett modifisert fra eksempel på java.sun.com import java.util.*; // Prints a frequency table of the words on the command line public class AutoBoks { public static void main(string [ ] args) { Map<String, Integer> m = new HashMap<String, Integer>(); // trenger bare Map-egenskapene til HashMap-en // m er tom til å begynne med! for (String word : args) { // for-each-løkken går gjennom hele tabellen Integer freq = m.get(word); if (freq == null) // da er ikke ordet sett før m.put(word, 1 ); // fekvensen er 1 første gang else m.put (word, freq + 1) ); // øker frekv. med 1 Type int 2 objekt av klassen Integer Integer(int i) int intvalue( ) 2 freq Type Integer class SortertLenketListeAvBiler { Bil forste; settinn (Bil pek) { int verdi = forste.sammenlign(pek); class Bil { Bil taut( ) { Objekt av class SortertLenketListeAvBiler Bil forste settinn(bil pek) Bil taut( ) neste sammenlign(bil b) Bil neste; <mer datastruktur> int sammenlign (Bil b) { neste sammenlign(bil b) neste sammenlign(bil b) System.out.println(m); String tostring (int i) String tobinarystring (int i) Integer klassedatastruktur 47 neste sammenlign(bil b)

class SortertGenLenketListe<T> { T forste; settinn (T pek) { int verdi = forste.compareto(pek); Men hvordan skal vi vite at T inneholder metoden T taut( ) { compareto (T p)? En ikke helt riktig skisse av en datastruktur (Vi må gi T en verdi før vi kan lage en liste) T forste settinn(t pek ) TtaUt( ) T compareto(t p) T compareto(t p) T compareto(t p) T compareto(t p) class SortertGenLenketListe<T T implements Comparable <T>> { T forste; Svar: La T settinn (T pek) { T denne; implementere int verdi = forste.compareto(pek); Comparable class Bil implements Comparable<Bil> Ttaut( ){ { Bil nestebil; <mer datastruktur> int tcompareto paeo( (Bil b){ SortertGenLenketListe <Bil> listen = new SortertGenLenketListe <Bil> (); Bil forste settinn(bil pek ) Bil taut( ) nestebil compareto(bil b) nestebil compareto(bil b) nestebil compareto(bil b) nestebil interface Comparable <T> { compareto(bil b) int compareto (T p); Konstruktører Konstruktører og arv Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver Punkt p = new Punkt(3,4); class Punkt { skjer følgende: int x, y; 1. Det settes av plass i intern-minnet Punkt(int x0, int y0) { til et objekt av klassen Punkt og til x = x0; referansen p. navn: p y = y0; 2. Variablene x og y blir deklarert. 3. Konstruktør-metoden blir kalt med type: Punkt x0=3 og y0=4. x=3 navn: x navn: y 4. Etter at konstruktøren har satt og y=4, settes høyresiden i 3 4 tilordningen type: int type: int Punkt(int x0, int y0) Punkt p = new Punkt(3,4) lik adressen (referansen) til det navn: x0 navn: y0 nye objektet. 3 4 5. Tilordningen Punkt p = utføres, type: int type: int dvs p settes lik adressen til x=x0; x0; y=y0; y0; objektet. 51 Det blir noe mer komplisert når vi opererer med arv: Anta at vi har definert en subklasse class B extends A { Hvilken konstruktør kt utføres hvis vi skriver B bpeker = new B(); Konstruktøren i klassen A? Konstruktøren i klassen B? Begge? 52

Konstruktører og arv (forts.) Kall på super-konstruktøren Anta at vi har deklarert tre klasser: class A { class B extends A { class C extends B { Når vi skriver new C() skjer følgende: 1. Konstruktøren til C kalles (som vanlig) 2. Konstruktøren til C starter med å kalle på B sin konstruktør 3. Konstruktøren til B starter med å kalle på A sin konstruktør 4. Så utføres A sin konstruktør 5. Kontrollen kommer tilbake til B sin konstruktør, som utføres 6. Kontrollen kommer tilbake til C sin konstruktør, som utføres 53 Superklassens konstruktør kan kalles fra en subklasse ved å si: - vil kalle på en konstruktør uten parametre super(5, test ); - om vi vil kalle på en konstruktør med to parametre (int og String) Et kall på super må legges helt i begynnelsen av konstruktøren. Kaller man ikke super eksplisitt, vil Java selv legge inn kall på super( ) helt først i konstruktøren når programmet kompileres. Hvis en klasse ikke har noen konstruktør, legger Java inn en tom konstruktør med kallet 54 Eksempel 1 Her er fire forslag til Eksempel 2 konstruktører: k Student() { studid = 0; Anta at vi har følgende klasser: class Person { String fødselsnr; Person() { fødselsnr = ""; class Student extends Person { int studid; Student() {... Anta to konstruktører: Student() { studid = 0; Student() { studid = 0; Disse to er helt ekvivalente! Hva skjer hvis Student ikke har noen konstruktør :? class Student extends Person { int studid = 0; Svar: det går bra 55 Anta at vi har følgende klasser: class Person { String fødselsnr; Person(String fnr) { fødselsnr = fnr; class Student extends Person { int studid; Student() {... Student() { super( 12345"); studid = 0; Student(String nr){ super(nr); studid = 17; Student(String nr, int id){ super(nr); studid = id; Hvilke virker? Diskuter! 56

Eksempel 3 Når programmet kompileres class Bygning { Bygning() { System.out.println("Bygning"); class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); Hva blir utskriften fra dette programmet? 57 class Bygning { Bygning() { System.out.println("Bygning"); // class Bygning g class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); // class Bolighus class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk Java føyer selv på super() i disse tre konstruktørene kt før programmet utføres 58 Når programmet utføres Når programmet utføres (forts.) 4. 2. class Bygning { 5. Bygning() { System.out.println("Bygning"); // class Bygning g class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); // class Bolighus 3. class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk Til Object sin konstruktør Her starter eksekveringen 1. 59 class Bygning { 6. Tilbake fra Object Bygning() { sin konstruktør System.out.println("Bygning"); 7. // class Bygning g Nå er class Bolighus extends Bygning { Bygning Bolighus() { skrevet ut System.out.println("Bolighus"); 8. // class Bolighus Nå er Bolighus class Blokk extends Bolighus { Blokk() { skrevet ut System.out.println("Blokk"); 9. public static void main(string[] args) { Nå er Blokk new Blokk(); skrevet ut // class Blokk 60

Eksempel 4 Når programmet kompileres class Bygning { Bygning() { System.out.println("Bygning"); Hva skjer i dette eksempelet? class Bolighus extends Bygning { Bolighus(int i) { System.out.println("Bolighus nr " + i); Merk: Konstruktøren i class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); klassen Bolighus har nå en parameter. 61 class Bygning { Bygning() { System.out.println("Bygning"); // class Bygning Java legger igjen til kall på super() i alle konstruktørene. kt class Bolighus extends Bygning { Men: Kallet matcher ikke Bolighus(int i) { metoden i antall parametre! System.out.println("Bolighus"); Mulige løsninger: // class Bolighus 1. Selv legge til kall på super, med argument, class Blokk extends Bolighus { i kontruktøren Blokk. Blokk() { 2. Legge til en tom konstruktør kt System.out.println("Blokk"); i Bolighus. public static void main(string[] args) { new Blokk(); 62 // class Blokk