INF1010 våren 2016. Arv og subklasser - del 2

Like dokumenter
INF1010 våren Arv og subklasser - del 2

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

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

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

INF1010 våren Arv og subklasser - del 2

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

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

INF1010 våren 2018 tirsdag 23. januar

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

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

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

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 4, 22. januar Arv og subklasser

INF1010 våren Arv og subklasser del I

INF1010 våren Arv og subklasser, del 2

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

INF1010 våren Arv og subklasser, del 2

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

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

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

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 våren Arv og subklasser del 1

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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 2007 Uke 6, 6. februar Arv og subklasser, del 2

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

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

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

Repetisjon. INF gruppe 13

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

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

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

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

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

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

INF1010 Arv. Marit Nybakken 2. februar 2004

Læringsmål for forelesningen

INF Løsning på seminaropppgaver til uke 8

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

Kapittel 7: Mer om arv

INF1000 Metoder. Marit Nybakken 16. februar 2004

2 Om statiske variable/konstanter og statiske metoder.

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

TOD063 Datastrukturer og algoritmer

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

Løse reelle problemer

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

INF Seminaroppgaver til uke 3

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

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

INF1010. Grensesnittet Comparable<T>

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Enkle generiske klasser i Java

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

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

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

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

Læringsmål for forelesningen

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

UNIVERSITETET I OSLO

INF1010 våren Grensesnitt

Oversikt. Array indeks utenfor sine grenser. Feil i programmet hva skjer?

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

UNIVERSITETET I OSLO

INF1000: Forelesning 7

Gjennomgang av eksamen H99

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

INF1000: Forelesning 7. Konstruktører Static

Kapittel 11: Unntakshåndtering. Java som første programmeringsspråk

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

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

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

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

Introduksjon til objektorientert programmering

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

INF1010 våren Grensesnitt

Del 3: Evaluere uttrykk

UNIVERSITETET I OSLO

Hva er en metode. Hva skjer når vi kaller en metode

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

Litt om pakker og mest om data inn og ut

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

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

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

IN1010 våren januar. Objektorientering i Java

INF Uke 10. Ukesoppgaver oktober 2012

INF Notater. Veronika Heimsbakk 10. juni 2012

Transkript:

INF1010 våren 2016 Onsdag 10. februar Arv og subklasser - del 2 pluss litt om feil og unntak hvis tid Stein Gjessing Institutt for informatikk

Dagens tema Virtuelle metoder som er det samme som Polymorfi Når bruker vi arv / når bruker vi komposisjon Konstruktører i subklasser Virtuelle Polymorfi - fine navn, men det er ikke så vanskelig 2

Klassehierarki: Personbil Bil Repetisjon: 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 3

class Bil { protected int pris; public int skatt( ) {return pris; Polymorfi: eksempel Klassehierarki: Bil class Personbil extends Bil { protected int antallpassasjer; public int skatt( ) {return pris * 2; Personbil class Lastebil extends Bil { protected double lastevekt; public int skatt ( ) {return pris / 2; Lastebil class Drosje extends Personbil { protected String loyveid; public int skatt ( ) {return pris / 4; Drosje 4

Polymorfi: eksempel class Bil { protected int pris; public int skatt( ) {return pris; class Personbil extends Bil { protected int antallpassasjer; public int skatt( ) {return pris * 2; protected int pris public int skatt( ) { return pris; protected int pris public int skatt( ) { return pris; protected int antpassasjer public int skatt( ) { return pris * 2; Bilobjekt Personbilobjekt class Lastebil extends Bil { protected double lastevekt; public int skatt ( ) {return pris / 2; protected int pris public int skatt( ) { return pris; private double lastevekt public int skatt( ) { return pris / 2; Lastebilobjekt class Drosje extends Personbil { protected String loyveid; public int skatt ( ) {return pris / 4; protected int pris public int skatt( ) { return pris; protected int antpassasjer public int skatt( ) { return pris * 2; protected String loyveid public int skatt( ) { return pris / 4; Drosjeobjekt 5

Polymorfi: eksempel Bil Bil Personbil Bil Lastebil protected int pris public int skatt( ) { return pris; protected int pris public int skatt( ) { return pris; protected int antpassasjer public int skatt( ) { return pris * 2; protected int pris public int skatt( ) { return pris; protected double lastevekt public int skatt( ) { return pris / 2; Bilobjekt Personbilobjekt Lastebilobjekt Bil Personbil Drosje protected int pris public int skatt( ) { return pris; protected int antpassasjer public int skatt( ) { return pris * 2; protected String loyveid public int skatt( ) { return pris / 4; Drosjeobjekt 6

Bil Bil Personbil Bil Lastebil Polymorfi: eksempel b1 protected int pris 100 b2 public int skatt( ) { return pris; p1 protected int pris 200 public int skatt( ) { return pris; b3 protected int antpassasjer last public int skatt( ) { return pris * 2; Bilobjekt Personbilobjekt protected int pris 300 Hva blir: Bil Personbil Drosje b4 p2 d1 public int skatt( ) { return pris; protected double lastevekt public int skatt( ) { return pris / 2; Lastebilobjekt b1.skatt() b2.skatt() p1.skatt() b3.skatt() last.skatt() b4.skatt() p2.skatt() d1.skatt() 100 400 400 150 150 100 100 100 protected int pris 400 public int skatt( ) { return pris; protected int antpassasjer public int skatt( ) { return pris * 2; protected String loyveid public int skatt( ) { return pris / 4; Drosjeobjekt 7

Omdefinering av metoder - polymorfi Vi har sett at med subklasser kan vi utvide en eksisterende klasse med nye metoder (og nye variable) En subklasse kan også definere en metode med samme signatur som en metode i superklassen, men med ulikt innhold. Den nye metoden vil omdefinere (erstatte) metoden som er definert i superklassen Metoder som kan omdefineres på denne måten kalles virtuelle metoder Alle metodene i et grensesnitt er virtuelle I Java er alle metoder virtuelle, så sant de ikke er deklarert med final Virtuelle metoder = polymorfi 8

interface KanBjeffe{ void bjeff(); Polymorfi: Nytt eksempel For objekter av typen VanligHund er det denne metoden som gjelder. class VanligHund implements KanBjeffe{ //... public void bjeff() { System.out.println("Vov-vov"); For objekter av typen class Rasehund extends VanligHund { Rasehund er det denne //... metoden som gjelder. public void bjeff() { System.out.println("Voff-voff"); KanBjeffe VanligHund Rasehund Og et grensesnitt! Gjør det noe forskjell?

Polymorfi: eksempel VanligHund v Rasehund r VanligHund g KanBjeffe k public void bjeff() { System.out.println("Vov-vov"); public void bjeff() { System.out.println("Vov-vov"); public void bjeff() { System.out.println("Voff-voff"); Anta dette programmet: Hva skrives ut ved hvert av kallene: VanligHund v = new VanligHund(); Rasehund r = new Rasehund(); VanligHund g = r; KanBjeffe k = r; v.bjeff(); r.bjeff(); g.bjeff(); k.bjeff(); Vov-vov Voff-voff Voff-voff Voff-voff 10

Eksempel: class Musikk Oppgave: Hva skrives ut når programmet Musikk.java kjøres? class Musikk { public static void main (String[] args) { Instrument inst = new Piano(); inst.skrivdefinisjon(); class Instrument { public void skrivdefinisjon () { System.out.println ("Et instrument er noe man kan spille på"); class Piano extends Instrument { public void skrivdefinisjon () { System.out.println ("Et piano er et strengeinstrument"); Instrument Piano 11

Instrument inst void skrivdefinisjon() { System.out.println( Et instr..."); Oppgave: Hva skrives ut når programmet Musikk.java kjøres? void skrivdefinisjon() { System.out.println( Et piano... "); class Musikk { public static void main (String[] args) { Instrument inst = new Piano(); inst.skrivdefinisjon(); class Instrument { public void skrivdefinisjon () { System.out.println ("Et instrument er noe man kan spille på"); class Piano extends Instrument { public void skrivdefinisjon () { System.out.println ("Et piano er et strengeinstrument"); Instrument Piano 12

Musikk versjon 2 Hva skjer i dette tilfellet? Instrument inst void skrivdefinisjon( ) { System.out.println( Et instrum..."); void skrivdefinisjon(string overskrift) { System.out.println(... ); System.out.println( "Et piano.. ); class Musikk { public static void main (String[] args) { Instrument inst = new Piano(); inst.skrivdefinisjon(); class Instrument { public void skrivdefinisjon () { System.out.println("Et instrument er noe man kan spille på"); class Piano extends Instrument { public void skrivdefinisjon (String overskrift) { System.out.println(overskrift); System.out.println("Et piano er et strengeinstrument"); 13

Instrument inst Musikk versjon 3 void skrivdefinisjon(string overskrift) { System.out.println(... ); System.out.println( "Et instrument.. ); void skrivdefinisjon( ) { System.out.println( Et piano..."); class Musikk { public static void main (String[] args) { Instrument inst = new Piano(); inst.skrivdefinisjon(); class Instrument { public void skrivdefinisjon(string overskrift) { System.out.println(overskrift); System.out.println("Et instrument er noe man kan spille på"); Hva skjer a? Programmet lar seg ikke oversette class Piano extends Instrument { public void skrivdefinisjon () { System.out.println("Et piano er et strengeinstrument"); 14

Musikk-eksemplene: Lærdom Når vi ser på et objekt via en superklasse-peker, mister vi vanligvis tilgang til metoder og variable som er definert i subklassen. Dersom en metode i subklassen også er definert (med samme signatur) i superklassen har vi likevel tilgang via superklasse-pekeren, fordi objektets dypeste metode brukes. Slike metoder kalles virtuelle metoder, og denne mekanismen kalles polymorfi. Det som er relevant er derfor hvilke metoder som finnes i superklassen (med hvilke parametre), men ikke nødvendigvis innholdet i metodene. Samme signatur = samme navn og nøyaktig samme parametre (inkl. returtype?) 15

Flere virtuelle metoder class Vare { protected int pris; public void setpris(int p){pris = p; protected int prisutenmoms() { return pris; Anta: Vare v = new Vare(); v.setpris(100); public int prismedmoms() { return (int) (1.25*prisUtenMoms()); SalgsVare s = new SalgsVare(); s.setpris(100); s.setrabatt(20); class SalgsVare extends Vare { protected int rabatt; // I prosent... public void setrabatt(int r){rabatt = r; Hva blir nå: protected int prisutenmoms() { return pris (pris*rabatt/100); v.prismedmoms() s.prismedmoms() 16

pris 100 Anta: Vare v = new Vare(); v.setpris(100); Vare v2 SalgsVare s = new SalgsVare(); s.setpris(100); s.setrabatt(20); Vare v2 = s; SalgsVare s Hva blir nå: v.prismedmoms(); s.prismedmoms(); v2.prismedmoms(); Vare v protected int prisutenmoms ( ) { return pris; public int prismedmoms { return (int) (1.25*prisUtenMoms ( ) ); pris protected int prisutenmoms ( ) { return pris; public int prismedmoms { return (int) (1.25*prisUtenMoms ( ) ); rabatt 100 20 protected int prisutenmoms ( ) { return pris (pris*rabatt/100); 17

Polymorfi: skrivdata I universitets-eksemplet så vi at klassene Student og Ansatt hadde nesten like skrivdata-metoder: // I klassen Student: public void skrivdata() { System.out.println("Navn: " + navn); System.out.println("Telefon: " + tlfnr); System.out.println("Studieprogram: " + program); // I klassen Ansatt: public void skrivdata() { System.out.println("Navn: " + navn); System.out.println("Telefon: " + tlfnr); System.out.println("Lønnstrinn: " + lønnstrinn); System.out.println("Timer: " + antalltimer); 18

Nøkkelordet super Nytt Nøkkelordet super brukes til å aksessere variable / metoder i objektets superklasse. Dette kan vi bruke til å la superklassen Person ha en generell skrivdata, som så kalles i subklassene: // I klassen Person: public void skrivdata() { System.out.println("Navn: " + navn); System.out.println("Telefon: " + tlfnr); // I klassen Student: public void skrivdata() { super.skrivdata(); System.out.println("Studieprogram: " + program); // Tilsvarende i klassen Ansatt: public void skrivdata() { super.skrivdata(); System.out.println("Lønnstrinn: " + lønnstrinn); System.out.println("Timer: " + antalltimer); 19

class StudentRegister { public static void main(string [] args) { Student stud = new Student(); Person pers = new Person(); stud.skrivdata(); pers.skrivdata(); // Her brukes definisjonen i Student // Her brukes definisjonen i Person Person pers2 = stud; pers2.skrivdata(); // Hvilken definisjon benyttes her? Person pers Student stud Person pers2 void skrivdata() { System.out.println("Navn: " + navn); System.out.println("Telefon: " + tlfnr); void skrivdata() { System.out.println("Navn: " + navn); System.out.println("Telefon: " + tlfnr); Regel: Det er objekttypen, ikke pekertypen, som avgjør hvilken definisjon som gjelder når en metode er virtuell. void skrivdata() { super.skrivdata(); System.out.println("Studprgm: " + prgm); 20

21 Omdefinering av variable En subklasse kan også omdefinere (skyggelegge) variable som er definert i superklassen. MEN: Dette bør IKKE brukes!!! Sjelden nødvendig Reduserer lesbarheten Kan føre til uventet oppførsel Og mer trenger dere ikke å vite om det

Klassehierarki: Et eksempel fra Java-biblioteket ArrayList AttributeListt RoleList RoleUnresolvedList Oppgave: Slå opp på ArrayList i Javabiblioteket og se at de tre klassene er direkte subklasser av ArrayList (direkte naboer i klassehierarkiet) ( Direct Known Subclasses )

Klassehierarki: Også fra Java-biblioteket: Feil-klasser Object Throwable Error Exception Virtual- Machine- Error IOError RuntimeException IOException Oppgave: Slå opp i Javabiblioteket AWTException... og ca. 60 andre

Repetisjon: Den boolske operatoren instanceof hjelper oss å finne ut av hvilken klasse et gitt objekt er, 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!"); Frukt class Frukt {.. class Eple extends Frukt {.. class Appelsin extends Frukt {.. Eple Appelsin 24

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

god Biler og mer bruk av instanceof HashMap <String, Bil> h; (og litt casting (typekonvertering)) 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.hentantpass(); else { if (b instanceof Lastebil) { Lastebil ls = (Lastebil) b; double lv = ls.hentlastevekt(); class Bil { String regnr; public void skatt(){... class Personbil extends Bil { int antpass; public void skatt(){... class Lastebil extends Bil { double lastevekt; p.. void skatt(){... class Drosje extends Personbil { int LøyveNr; p.. void skatt(){... 26

Oppgave Brev Anta at vi har deklarasjonene class Brev { class Soknad extends Brev { Soknad 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 27

Hvorfor bruker vi subklasser? 1. Klasser og subklasser avspeiler virkeligheten Bra når vi skal modellere virkeligheten i et datasystem 2. Klasser og subklasser avspeiler arkitekturen til datasystemet / dataprogrammet Bra når vi skal lage et oversiktlig stort program 3. Klasser og subklasser kan brukes til å forenkle og gjøre programmer mer forstålig, og spare arbeid: Gjenbruk av programdeler Bottom up programmering Lage verktøy Top down programmering Postulere verktøy Nå skal vi se litt på 3 28

Gjenbruk av deler av programmer Viktig å ikke måtte skrive ny kode hver gang man skal programmere noe nytt Gjenbruk mest mulig av kode du har skrevet før Lag kode med henblikk på et den skal brukes (til noe liknende) senere Lag biblioteker Bruk andres bibliotek Javas eget bibliotek Strukturering av kode ( gjenbruk i samme program) Inf1000: Gjenbruk av metoder og klasser 29

Gjenbruk ved hjelp av klasser / subklasser Ved sammensetning (komposisjon) (i inf1000): Deklarer pekere til objekter av klasser du har skrevet før Lag objekter av disse klassen Kall på metoder i disse klassene Ved arv (nytt i inf1010): Lag en ny klasse som utvider den eksisterende klassen (spesielt viktig ved litt større klasser) Føy til ekstra variable og metoder 30

Gjenbruk ved sammensetning / komposisjon Ikke noe nytt her. Eksempel: class Demoklasse { HashMap<String,Person> venner = new HashMap<String,Person>(); Husdyr h = new Hund( Passopp ); String navn = Ole-Morten"; venner, h og navn er /* + Diverse metoder */ deklarert som pekere til objekter av andre klasser som allerede eksisterer. h venner navn Ole-Morten 31

Gjenbruk ved arv Objekter av klassene class Bok { protected String tittel, forfatter; class Fagbok extends Bok { protected double dewey; class Skjønnlitterærbok extends Bok { protected String sjanger; class Bibliotek { Bok b1 = new Fagbok(); Bok b2 = new Skjønnlitterærbok(); Arv Komposisjon Gjenbrukes Gjenbrukes 32

Når skal vi bruke arv? Generelt: Ved er-en relasjon mellom objektene. En Student er en Person En Ansatt er en Person Hva med relasjonene roman bok? En roman er en bok (arv). kapittel bok? Et kapittel er ikke en bok, men et kapittel er en del av en bok, og en bok har/består av kapitler (sammensetning) Relasjoner som har-en og består-av skal ikke modelleres som subklasser, men ved hjelp av sammensetning (som datafelt (konstanter/variable)). Arv vs. delegering 33

Oppgave Hvor er det naturlig å bruke komposisjon og hvor er det naturlig med arv i disse tilfellene? Relasjon mellom Komposisjon Arv vare - varelager nyhetskanal - kanal person - personregister cd - spor (sanger) PC - datamaskin gaupe - rovdyr fly - transportmiddel motor - bil 34

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 (pga. polymorfi) 35

Eksempel på tostring og equals class Punkt { protected int x, y; Punkt(int x0, int y0) { x = x0; y = y0; Anta: class Punkt2 { protected 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); false q1.equals(q2); x = 3 y = 4 true 36

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); class Punkt { skjer følgende: protected int x, y; 1. Det settes av plass i intern-minnet til et objekt av klassen Punkt og til pekeren 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 (en peker) 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; navn: x navn: y 3 4 type: int type: int Punkt(int x0, int y0) navn: x0 3 type: int x = x0; y = y0; navn: y0 4 type: int 37

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? B A bpeker A() B() B 38

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 39

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(); 40

Eksempel 1 Anta at vi har følgende klasser: class Person { proteceted String fødselsnr; Person() { fødselsnr = 12034567890"; class Student extends Person { protected int studid; Student() {... Anta to konstruktører: Student() { super(); studid = 0; eller: 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 41

Eksempel 2 Her er fire forslag til konstruktører: Student() { studid = 0; Anta at vi har følgende klasser: class Person { protected String fødselsnr; Person(String fnr) { fødselsnr = fnr; class Student extends Person { protected 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! 42

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(); 43

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 44

Når programmet utføres 4. class Bygning { Bygning() { super(); System.out.println("Bygning"); // class Bygning 5. class Bolighus extends Bygning { Bolighus() { super(); System.out.println("Bolighus"); // class Bolighus 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. 45

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 46

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(); 47

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. 48

Nytt tema: Feilhåndtering og I/O (IO: Innlesing/Utskrift) En metode som kan komme til å gjøre en IO-feil på fil må enten behandle denne selv, eller kaste feilen videre (også i main): public void mittprogmedio( ) throws IOException { < kode som gjør fil-behandling> I Java-biblioteket: class IOException extends Exception {... Vi skal lære mer om unntak og feilbehandling etter hvert, bare litt her i dag throws er et Java nøkkelord 49

Innlesing av heltall fra fil utskrift på skjerm import java.io.*; import java.util.*; main filinn boolean hasnext() class LesFraFil { Objekt av klassen Scanner public static void main (String [ ] args) throws IOException { Scanner filinn = new Scanner (new File ("minfil.txt )); int tall; int nextint() while(filinn.hasnext()) { tall = filinn.nextint(); System.out.println(tall); Kaster IOunntak til runtimesystemet DETTE GÅR BRA HVIS FILEN BARE INNE- HOLDER HELTALL!! 50

Du kan behandle unntaket selv: main filut import java.io.*; try { PrintWriter filut = new PrintWriter ( minutfil.txt ); // Utskrift skjer som til skjerm: filut.println( utskrift + 17 ): // For at innholdet på den nye filen skal // bevares må vi til slutt si: Dette objektet skriver på filen minutfil.txt void println() minutfil.txt filut.close( ); catch (FileNotFoundException f) {... 51

Generelt om unntak / feil - behandling i Java Mye kode kan feile og feilaktige situasjoner (unntak) kan oppstå. Kode som kan feile kan - og som oftest må - vi legge følgende rundt: Feiler koden blir denne blokken utført med feilobjektet som e peker på som parameter try { <... Kode som kan feile > catch (Exception e) { <... Gjør noe med feilen, prøv å rett opp...> 52

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 (mer senere) 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 Viktigst bruk: try { <kode som kan feile> catch (Unntaksklasse u) { <behandle unntaket, u peker på et objekt som beskriver unntaket> 53

54 Unntak kan oppstå i egen kode try { <KODE SOM KAN FEILE> <Når det skjer noe galt f.eks. at en peker er null:> throw new Unntaksklasse( );........ catch (Unntaksklasse unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt/galt/feil har hendt > < her fortsetter programmet både etter normal utføring og etter behandling av eventuelle unntak > Enkleste form for unntaksbehandling. På forhånd har vi deklarert: class Unntaksklasse extends Exception {...

inne i metoden a: Når unntak oppstår i en annen metode (og ikke behandles der) try {.... kall på metoden b x = b ( );.... catch (Unntaksklasse unt) { < Unntaksbehandling. Dette hoppes over når intet unormalt har hendt > < her fortsetter programmet både etter normal utføring og etter behandling av eventuelle unntak> Metoden b feiler kanskje fordi kontrakten for kall på metoden ikke ble oppfylt. int b( ) throws Unntaksklassen { inne i metoden b: b oppdager en feil: throw new Unntaksklasse ( ) ; Normal retur fra b til a: return 17; Unntaksklasse er en klasse som på forhånd er deklarert (egendefinert eller definert i Java-biblioteket) som en subklasse av klassen Exception (se forrige side). 55

Java-bibliotekets klassehierarki for unntak Throwable Vanskelig å gjøre noe med Error RuntimeException Exception IOException VirtualMachineError IOError Må fanges NullPointerException ArithmeticException Unntak i dette subtreet bør fanges 56