INF1010 våren Arv og subklasser, del 2

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

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

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

INF1010 våren Arv og subklasser, del 2

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

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 2008 Uke 5, 29. januar Arv og subklasser eksempler Litt om unntakshåndtering (40 og 41)

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

INF1010 våren Arv og subklasser - del 2

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

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

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

INF1010 våren Arv og subklasser - del 2

INF1010 våren Arv og subklasser - del 2

INF1010 våren Arv og subklasser del 1

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

INF1010 våren Arv og subklasser del 1

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

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

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

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1010 våren Arv og subklasser del 1 pluss (hvis vi har tid) litt om Unntak, IO og Scanner-klassen

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

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

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

INF1010 våren Arv og subklasser del 1 (pluss litt I/O og unntaksbehandling)

Enkle generiske klasser i Java

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

INF1010 våren 2018 tirsdag 23. januar

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF 1010, vår 2005 Løsningsforslag uke 11

INF1010 Arv. Marit Nybakken 2. februar 2004

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

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; }

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

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

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

IN1010 våren januar. Objektorientering i Java

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

Inf1010 Våren Feilsituasjoner og unntak i Java. Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

Oversikt. Feil i programmet hva skjer? Array indeks utenfor sine grenser. Inf1010 Våren Feilsituasjoner og unntak i Java

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

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

INF1010 oversikt med

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

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

INF Løsning på seminaropppgaver til uke 8

INF1000: Forelesning 7. Konstruktører Static

Kapittel 7: Mer om arv

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

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

UNIVERSITETET I OSLO

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

INF1000: Forelesning 7

UNIVERSITETET I OSLO

Forelesning inf Java 5

Forelesning inf Java 5

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

2 Om statiske variable/konstanter og statiske metoder.

INF1010. Stein Michael Storleer (michael) Lenkelister

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

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

Obligatorisk oppgave 4: Lege/Resept

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

Kapittel 9: Sortering og søking Kort versjon

INF1000: noen avsluttende ord

INF1000 HashMap. Marit Nybakken 2. november 2003

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

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

Del 3: Evaluere uttrykk

Læringsmål for forelesningen

Generiske mekanismer i statisk typede programmeringsspråk

Jentetreff INF1000 Debugging i Java

UNIVERSITETET I OSLO

INF Notater. Veronika Heimsbakk 10. juni 2012

Introduksjon til objektorientert programmering

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Dagens tema: Mer av det dere trenger til del 1

Velkommen til. INF våren 2016

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF Seminaroppgaver til uke 3

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

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

INF Innleveringsoppgave 6

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

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

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

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

Obligatorisk oppgave 2: Bilhierarki

2 Om statiske variable/konstanter og statiske metoder.

IN1010 våren 2019 Onsdag 6. februar. Arv og subklasser - del 2

Transkript:

INF1010 våren 2010 Torsdag 4. februar Arv og subklasser, del 2 Stein Gjessing Institutt for informatikk

Repetisjon Vi har sett to former for gjenbruk av klasser: Gammel: Ved sammensetning (komposisjon) Modellerer relasjoner som består av/har en Ny: Ved arv (bruk av subklasser) Modellerer relasjoner som er en/er et En subklasse deklareres ved bruk av nøkkelordet extends: class B extends A { deklarerer B som en subklasse (utvidelse) av A. 2

Repetisjon - Biler Klassehierarki: Bil class Bil {... Lastebil Personbil Drosje class Personbil extends Bil {... class Lastebil extends Bil {... class Drosje extends Personbil {... 3

Klassehierarki: Personbil Bil Repetisjon: Klasser - Subklasser class Bil { <lys beige egenskaper> class Personbil extends Bil { <røde egenskaper> class Lastebil extends Bil { < grønne egenskaper> class Drosje extends Personbil { < gule egenskaper> Alle lastebiler Lastebil Drosje Alle biler Alle drosjer Alle personbiler 46 objekter 46 new 4

Dyreriket (utdrag) Klassehierarki Animalia Leddyr Ryggstrengdyr Bløtdyr Tusenbein Insekter Kappedyr Virveldyr Blekksprut Snegler Fugler Pattedyr Slanger og øgler Hovdyr Klovdyr Rovdyr Rovdyr r; Hjort Kveg Kattedyr Hundedyr Storfe Geit Sau Rev Hund Ulv new Geit(); Hentet fra http://www.miljolare.no/data/ut/art/ 5

Repetisjon - dyreriket Pattedyr Klovdyr Kveg Geit Sau Siden Geit er et Kvegdyr, kan vi gjøre klassen Geit til en subklasse av klassen Kveg: class Geit extends Kveg { Klassen Geit arver da alle egenskaper (variable/ metoder) til klassen Kveg, i tillegg til å ha sine egne egenskaper. Objekter av klassen Geit vil utgjøre en delmengde av alle objekter av klassen Kveg, de er spesialiserte. Siden Geit er et Kveg, og Kveg er et Klovdyr, vil også Geit være et Klovdyr. Dermed arver Geit også alle egenskapene til klassen Klovdyr (via klassen Kveg), osv. 6

Repetisjon - dyreriket Pattedyr Kattedyr Rovdyr Hundedyr Rev Hund Ulv Siden en Hund er et Rovdyr, kan vi bruke en Hund hver gang vi har behov for et Rovdyr. Altså kan en Rovdyr-peker også peke på objekter av klassen Hund: Rovdyr r = new Hund(); Hva skjer nå hvis vi prøver metodekallet r.m()? Ved kompilering: Kallet r.m() godkjennes dersom det finnes en metode m() i klassen Rovdyr eller en superklasse til denne. Ved kjøring: Hvis det finnes en metode m() i klassen Hund, er det denne som brukes. Hvis ikke, leter vi oppover i klasse-hierarkiet til vi finner den. Abstrakte klasser kommer neste gang. I dette eksemplet finnes det f.eks. bare objekter av blad-klassene 7

Tilordning av pekere (del 1) class LagFrukt { public static void main(string[] args) { Frukt f; Eple e; Appelsin a; e = new Eple(); f = e; a =??? class Frukt {.. class Eple extends Frukt {.. class Appelsin extends Frukt {.. 8

Hva slags objekt har jeg? Den boolske operatoren instanceof hjelper oss å finne ut hvilken klasse et gitt objekt er basert på, noe som er nyttig i mange tilfeller: class TestFrukt { public static void main(string[] args) { Eple e = new Eple(); skrivut(e); static void skrivut(frukt f) { if (f instanceof Eple) System.out.println("Dette er et eple!"); else if (f instanceof Appelsin) System.out.println("Dette er en appelsin!"); class Frukt {.. class Eple extends Frukt {.. class Appelsin extends Frukt {.. 9

Men husk: Prøv å unngå instanceof Istedenfor å teste hvilken klasse objektet er av, be objektet gjøre jobben selv: class TestFrukt2 { class Frukt2 { void skrivut( ) { Bedre program: public static voidmain(string[] args) { Fruk2 f = new Eple2(); f.skrivut( ); class Eple2 extends Frukt2 { void skrivut( ) { System.out.println("Dette er et eple!"); class Appelsin2 extends Frukt2 { void skrivut( ) { System.out.println("Dette er en appelsin!"); 10

Biler og mer bruk av instanceof HashMap <String, Bil> h; h = new HashMap <String, Bil> ( );... for (Bil b: h.values()) { String nr = b.regnr; // kall på virtuell metode: b.skatt( ); if (b instanceof Pesonbil) { Personbil pb = (Personbil) b; int pas = pb.antpass; else { if (b instanceof Lastebil) { Lastebil ls = (Lastebil) b; double lv = ls.lastevekt; (og litt casting ) class Bil { String regnr; void b(){... class Personbil extends Bil { int antpass; void b(){... class Lastebil extends Bil { double lastevekt; void b(){... class Drosje extends Personbil { int LøyveNr; void b(){... 11

Konvertering av referanser (pekere) Anta at vi har: class Student extends Person { Student stud = new Student(); Ved tilordningen Person pers; pers = stud; har vi en implisitt konvertering fra Student- til Personreferanse. Hvis vi nå ønsker å få tak i de spesielle Studentegenskapene, må vi foreta en eksplisitt konvertering tilbake til Student igjen: Student stud2 = (Student) pers; Dette kalles casting (class-cast) på engelsk, typekonvertering på norsk. Medfører kjøretidstest. 12

Konvertering av referanser (forts.) Hva hvis vi istedenfor hadde hatt: Person pers = new Person(); Student stud = (Student) pers; Dette godkjennes av kompilatoren, men ved kjøring går det galt, og vi får feilmeldingen java.lang.classcastexception (fordi pers ikke peker på et objekt med alle Student egenskapene) For å unngå denne feilen, bør instanceof brukes: if (pers instanceof Student) { Student stud = (Student) pers; (Har det objektet pers peker på alle Student -egenskapene?) 13

Konvertering mellom flere nivåer MasterStudent master = new MasterStudent(); Konvertering oppover: Student stud = master; Person pers = master; Person pers Konvertering nedover: Student stud stud = (Student) pers master = (MasterStudent) pers (fordi dette krever kontroll under kjøring) MasterStudent master Regel: Alle pekere har lov til å peke bortover og nedover (men ikke oppover ) 14

Oppgave Brev Anta at vi har deklarasjonene class Brev { Soknad class Soknad extends Brev { class Kjaerlighetsbrev extends Brev { Avgjør hvilke av følgende uttrykk som er lovlige: Kjaerli Soknad s1 = new Soknad(); Soknad s2 = new Brev(); Brev b1 = new Soknad(); Brev b2 = (Brev) new Soknad(); Soknad s3 = new Kjaerlighetsbrev(); Soknad s4 = (Soknad) new Kjaerlighetsbrev(); Brev b3 = (Soknad) new Brev(); Lovlig Ulovlig 15

Konvertering til klassen Object Alle klasser i Java er subklasser av klassen Object. Når vi skriver class Person { så tolker Java dette som class Person extends Object { Dermed kan vi alltid konvertere en referanse oppover til klassen Object: Person pers = new Person(); Object obj = pers; For å snakke om egenskapene til Person-objektet må vi konvertere nedover igjen: (Person) obj 16

En liten beholder Hva slags objekter får jeg lov til å lagre? void legginn (Object en) Object hent ( ) Type: Object Navn: denne Hva er ulempen(e) med dette? Objekt av klassen Object eller en subklasse av Object

public class BeholderTilEn { private Object denne; public void legginn(object en) { denne = en; public Object hent() { return denne; class Bil { class Person { public class EnkelDemo { public static void main(string[] args) { BeholderTilEn bilbeholder = new BeholderTilEn(); Bil bilen = new Bil(); bilbeholder.legginn(bilen) Object noe; Bil bilto; noe = bilbeholder.hent(); bilto = (Bil) noe; Person personen = new Person(); bilbeholder.legginn(personen); Bil biltre = new Bil(); bilbeholder.legginn(biltre); Bil bilfire = (bil) bilbeholder.hent();

Dette ønsker vi oss: void legginn (Bil en) Bil hent( ) Type: Bil Navn: denne Objekt av klassen Bil eller en subklasse av Bil void legginn (Person en) Person hent( ) Type: Person Navn: denne Objekt av klassen Person eller en subklasse av Person

Generisk versjon av den enkle beholderen (T er et navn vi velger selv (T for Type )) public class GenBeholderTilEn <T> { private T denne; public void legginn (T en) { denne= en; public T hent ( ) { return denne; Vi gir klassen en parameter Da kan vi tenke oss at vi har et mønster objekt : NB! slike objekt finnes ikke!! void legginn (T en) T hent( ) Type: T Navn: denne Objekt av klassen T eller en subklasse av T Erstatt T med din favoritt-klasse

Bruk av class GenBeholderTilEn <T> GenBeholderTilEn <Bil> bilbeholder = new GenBeholderTilEn <Bil> ( ); Type: GenBeholderTilEn <Bil> Navn: bilbeholder Bil bilen = new Bil(); bilbeholder.legginn(bilen); bilen = bilbeholder.hent( ); Slike objekter finnes void legginn (Bil en) Type: Bil Bil hent( ) Navn: denne Objekt av klassn Bil eller en subklasse av Bil

public class GenBeholderTilEn <T> { private T denne; public void legginn (T en) { denne= en; public T hent () { return denne; class Bil { public class EnkelGenDemo { public static void main(string[] args) { GenBeholderTilEn <Bil> bilbeholder = new GenBeholderTilEn <Bil> (); Bil bilen = new Bil(); bilbeholder.legginn(bilen); Bil bilto = bilbeholder.hent(); I dette objektet kan vi bare legge inn biler! og vi slipper å typekonvertere ( caste ) når vi tar dem ut 22

Eksempel: HashMap uten type-spesifikasjon En HashMap (uten typespesifikasjon) kan brukes til å lagre objekter av en hvilken som helst klasse "trikset" er å tenke på dem alle som objekter av klassen Object. HashMap tabell = new HashMap(); Student stud = new Student(); stud.lesfraterminal(); tabell.put("kari", stud); stud = (Student) tabell.get("kari"); Disse blir implisitt konvertert oppover til Object, siden metoden put i HashMap har formalparametre put(object key, Object value). Dette gir en referanse til et objekt av klassen Object, og vi må eksplisitt konvertere nedover til Student for å snakke om objektets Student-egenskaper. 23

HashMap med typespesifikasjon class Bil { String regnr; class Personbil extends Bil { int antpass; class Lastebil extends Bil { double lastevekt; class Drosje extends Personbil { int LøyveNr; DE25132 HashMap <String, Bil> h; h = new HashMap <String,Bil> ( ); Bil bl; Personbil minbil; Personbil persb = new Personbil(); h.put ( DE25132, persb); bl = h.get( DE25132 ); minbil= (Personbil) bl; //tryggere med: if (bl instanceof Personbil) minbil = (Personbil) bl; Denne blir implisitt konvertert oppover til Bil, siden metoden put i denne HashMapen har formalparametre put(string key, Bil value). Dette gir en referanse til et objekt av klassen Bil, og vi må eksplisitt konvertere nedover til Personbil for å snakke om objektets Personbil-egenskaper. 24

ArrayList En annen nyttig klasse i java.util, er ArrayList <E>, hvor E er et klassenavn En ArrayList fungerer mye på samme måten som en array, men uten fast størrelse. Elementene i listen er alltid numerert fra 0. De viktigste metodene i ArrayList er: add(e obj): legger til objektet obj sist (ny, høyest index) i arrayen add(int i, E obj): legger til objektet obj på indeks i, ved å skyve de resterende elementene oppover. i må være mellom 0 og lengden av listen size(): gir antall elementer i arrayen (lengden av listen) Men husk at array er en basal konstruksjon i selve språket Java, mens ArrayList er en klasse i Java-biblioteket (som antagelig bruker array (eller en lenket liste) i sin implementasjon) 25

ArrayList (forts.) get(int i): returner objektet på plass i remove(int i): fjerner (og returnerer) objektet på plass i, og skyver resterende elementer nedover (slik at det ikke blir huller i arrayen) På samme måte som for en HashMap, returnerer get og remove referanser til den deklarerte objekt-typen. Denne må vi så eventuelt konvertere nedover til riktig type. Eksempel på bruk: ArrayList<Bil> liste = new ArrayList<Bil>(); liste.add(new Personbil( DE47398")); liste.add(new Personbil( BP83657")); Hva blir b2 her? liste.add(1, new Personbil( PC76549")); Personbil b = (Personbil) liste.remove(0); liste.add(1, b); Personbil b2 = (Personbil) liste.get(liste.size()-1); 26

Object: tostring og equals Klassen Object inneholder bl.a. tre viktige metoder: String tostring() returnerer en String-representasjon av objektet boolean equals(object o) sjekker om to objekter er like (i Object det samme som pekerlikhet) int hashcode( ) returnerer en hash-verdi av objektet Disse metodene kan man så selv redefinere til å gjøre noe mer fornuftig. Poenget er at en bruker av en klasse vet at disse metodene alltid vil være definert (jfr. Polymorfi) 27

Eksempel på tostring og equals class Punkt { int x, y; Punkt(int x0, int y0) { x = x0; y = y0; Anta: class Punkt2 { int x, y; Punkt2(int x0, int y0) { x = x0; y = y0; public String tostring() { return ("x = "+x+" y = "+y); Punkt p1 = new Punkt(3,4); Punkt p2 = new Punkt(3,4); Punkt2 q1 = new Punkt2(3,4); Punkt2 q2 = new Punkt2(3,4); Hva blir nå: public boolean equals(object o) { if (!(o instanceof Punkt2)) return false; Punkt2 p = (Punkt2) o; return x == p.x && y == p.y; p1.tostring(); Punkt@f5da06 q1.tostring(); p1.equals(p2); q1.equals(q2); false x = 3 y = 4 true 28

Konstruktører Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver Punkt p = new Punkt(3,4); skjer følgende: class Punkt { int x, y; 1. Det settes av plass i intern-minnet til et objekt av klassen Punkt og til referansen p. 2. Variablene x og y blir opprettet inne i objektet. 3. Konstruktør-metoden blir kalt med x0=3 og y0=4. 4. Etter at konstruktøren har satt x=3 og y=4, settes høyresiden i tilordningen Punkt p = new Punkt(3,4) lik adressen (referansen) til det nye objektet. 5. Tilordningen Punkt p = utføres, dvs p settes lik adressen til objektet. navn: p type: Punkt Punkt(int x0, int y0) { x = x0; y = y0; Punkt(int x0, int y0) navn: x0 3 type: int navn: x x = x0; y = y0; type: int navn: y0 4 type: int navn: y 3 4 type: int 29

Konstruktører og arv 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 utføres hvis vi skriver B bpeker = new B(); Konstruktøren i klassen A? Konstruktøren i klassen B? Begge? 30

Konstruktører og arv (forts.) 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 31

Kall på super-konstruktøren Superklassens konstruktør kan kalles fra en subklasse ved å si: super(); - 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 super(); 32

Eksempel 1 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() { super(); 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 33

Eksempel 2 Her er fire forslag til konstruktører: Student() { studid = 0; 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! 34

Eksempel 3 class Bygning { Bygning() { System.out.println("Bygning"); class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); Hva blir utskriften fra dette programmet? class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); 35

Når programmet kompileres class Bygning { Bygning() { super(); System.out.println("Bygning"); // class Bygning class Bolighus extends Bygning { Bolighus() { super(); System.out.println("Bolighus"); // class Bolighus Java føyer selv på super() i disse tre konstruktørene før programmet utføres class Blokk extends Bolighus { Blokk() { super(); System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk 36

Når programmet utføres 4. class Bygning { Bygning() { super(); System.out.println("Bygning"); // class Bygning class Bolighus extends Bygning { Bolighus() { super(); System.out.println("Bolighus"); // class Bolighus 5. Til Object sin konstruktør 3. 2. class Blokk extends Bolighus { Blokk() { super(); System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk Her starter eksekveringen 1. 37

Når programmet utføres (forts.) 7. Nå er Bygning skrevet ut 8. Nå er Bolighus skrevet ut 9. Nå er Blokk skrevet ut class Bygning { Bygning() { super(); System.out.println("Bygning"); // class Bygning class Bolighus extends Bygning { Bolighus() { super(); System.out.println("Bolighus"); // class Bolighus class Blokk extends Bolighus { Blokk() { super(); System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk 6. Tilbake fra Object sin konstruktør 38

Eksempel 4 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); class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); Merk: Konstruktøren i klassen Bolighus har nå en parameter. public static void main(string[] args) { new Blokk(); 39

Når programmet kompileres class Bygning { Bygning() { super(); System.out.println("Bygning"); // class Bygning Java legger igjen til kall på super() i alle konstruktørene. class Bolighus extends Bygning { Bolighus(int i) { super(); System.out.println("Bolighus"); // class Bolighus class Blokk extends Bolighus { Blokk() { super(); System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk Men: Kallet matcher ikke metoden i antall parametre! Mulige løsninger: 1. Selv legge til kall på super, med argument, i kontruktøren Blokk. 2. Legge til en tom konstruktør i Bolighus. 40

Til slutt i dag litt om Unntak / feil, behandling i Java Kode som kan feile Feiler koden blir denne blokken kalt med feilobjektet e som parameter 41

Fem reserverte Java ord try - Står foran en blokk som er usikker dvs. der det kan oppstå et unntak catch - Står foran en blokk som behandler et unntak. Har en peker til et unntaksobjekt som parameter finally - blir alltid utført throw - Starter å kaste et unntak throw <en peker til et unntaksobjekt> f.eks throw new Unntak(); throws - Kaster et unntak videre Brukes i overskriften på en metode som ikke selv vil behandle et unntak Bruk: try { <usikker kode> catch (Unntaksklasse u) { <behandle unntaket, u peker på et objekt som beskriver unntaket> finally { rydd opp 42

Unntaksbehandling forts. try { <USIKKER KODE> <Når det skjer noe galt:> throw new Unntaksklasse( );.... catch (Unntaksklasse unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt/galt har hendt > finally { hit kommer programmet alltid, også om unntaket ikke ble fanget < her fortsetter programmet både etter normal utføring og etter behandling av eventuelle unntak, men ikke når et unntak er kastet uten at det er fanget> Enkleste form for unntaksbehandling. På forhånd har vi deklarert: class Unntaksklasse extends Exception {... 43

A a x = b ( ); Når unntak oppstår i en annen metode (og ikke behandles der) a kaller b int b( ) throws Unntaksklassen { b oppdager en feil: throw new Unntaksklassen ( ) ; Normal retur fra b til a: return 17; Metoden b feiler kanskje fordi kontrakten for kall på metoden ikke ble oppfylt. Unntaksklassen er en klasse som vi på forhånd har deklarert som en subklasse av klassen Exception.