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

Like dokumenter
INF1010 våren februar. 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 Arv og subklasser, del 2

INF1010 våren Arv og subklasser - del 2

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

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

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

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

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

INF1010 våren Arv og subklasser del 1

INF1010 våren Arv og subklasser - del 2

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

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

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1010 våren Arv og subklasser - del 2

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

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

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

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

UNIVERSITETET I OSLO

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

Enkle generiske klasser i Java

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

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

INF1010. Stein Michael Storleer (michael) Lenkelister

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

INF1010 Arv. Marit Nybakken 2. februar 2004

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

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

IN1010 våren januar. Objektorientering i Java

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

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

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

INF1010. Grensesnittet Comparable<T>

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

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

Kapittel 9: Sortering og søking Kort versjon

INF Seminaroppgaver til uke 3

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

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

Obligatorisk oppgave 4: Lege/Resept

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

UNIVERSITETET I OSLO

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

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

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

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

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

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

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

INF1000: Forelesning 7. Konstruktører Static

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

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

Kapittel 7: Mer om arv

INF1000 HashMap. Marit Nybakken 2. november 2003

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

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

Introduksjon til objektorientert programmering

Læringsmål for forelesningen

INF1000: Forelesning 7

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

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

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

INF Notater. Veronika Heimsbakk 10. juni 2012

INF Innleveringsoppgave 6

Kapittel 9: Sortering og søking Kort versjon

INF1010 våren Grensesnitt

TDT4100 Objektorientert programmering

INF1010 våren Grensesnitt

Kapittel 8: Sortering og søking INF100

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

INF Løsning på seminaropppgaver til uke 8

Forelesning inf Java 5

Generiske mekanismer i statisk typede programmeringsspråk

Forelesning inf Java 5

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

UNIVERSITETET I OSLO

INF1000 Prøveeksamen Oppgave 7 og 9

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

Kapittel 8: Sortering og søking INF100

Læringsmål for forelesningen

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

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Del 3: Evaluere uttrykk

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

Obligatorisk oppgave 2: Bilhierarki

INF1010 våren 2017 Torsdag 26. januar. Arv og subklasser del 1. Stein Gjessing Institutt for informatikk Universitetet i Oslo

Gjennomgang av eksamen H99

INF1010 siste begreper før oblig 2

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Transkript:

INF1010 våren 2009 3. februar Arv og subklasser, del 2 En forsmak på interface (grensesnitt) Stein Gjessing 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 Klassehierarki: Repetisjon - Biler Klassehierarki: Bil Personbil 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 bil{ < gule egenskaper> Bil class Bil {... class Personbil extends Bil {... Personbil class Lastebil extends Bil {... Lastebil Alle lastebiler Drosje Alle biler Alle drosjer Alle personbiler Lastebil Drosje class Drosje extends Personbil {... 3 46 objekter 46 new 4

Dyreriket (utdrag) Klassehierarki Repetisjon - dyreriket Animalia Leddyr Ryggstrengdyr Bløtdyr Tusenbein Insekter Kappedyr Virveldyr Blekksprut Snegler Fugler Pattedyr Slanger og øgler Rovdyr r; Hovdyr Klovdyr Rovdyr Hjort Kveg Kattedyr Hundedyr Storfe Geit Sau Rev Hund Ulv new Geit(); Hentet fra http://www.miljolare.no/data/ut/art/ 5 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 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). 6 Repetisjon - dyreriket Tilordning av pekere (del 1) 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 Pattedyr av klassen Hund: Rovdyr r = new Hund(); Hva skjer nå hvis vi prøver metodekallet r.m()? Rovdyr Ved kompilering: Kallet r.m() godkjennes dersom det finnes en Kattedyr Hundedyr metode m() i klassen Rovdyr eller en superklasse til denne. Rev Hund Ulv 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. class LagFrukt { Frukt f; Eple e; Appelsin a; e = new Eple(); f = e; a =??? class Frukt {.. class Eple extends Frukt {.. class Appelsin extends Frukt {.. Hvorfor er dette lov? 7 8

Hva slags objekt har jeg? Men husk: Prøv å unngå instanceof 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 { Eple e = new Eple(); skrivut(e); Hva skjer under kjøring? static void skrivut(frukt f) { if (f instanceof Eple) System.out.println( 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 Istedenfor å teste hvilken klasse objektet er av, be objektet t gjøre jobben selv: Bedre program class TestFrukt2 { Fruk2 f = new Eple2(); f.skrivut( (); class Frukt2 { void skrivut( ) { class Eple2 extends Frukt2 { void skrivut( ) { System.out.println("Dette t tl tt er et eple!"); class Appelsin2 extends Frukt2 { void skrivut( ) { System.out.println("Dette er en appelsin!");.. Blir det skrevet ut noe? 10 Tilbake til det første frukt-eksemplet: pe La oss utvide metoden i skrivut til også å teste på frukt: class TestFrukt { Eple e = new Eple(); skrivut(e); static void skrivut(frukt f) { if (f insanceof Frukt) System.out.println( En frukt!"); else if (f instanceof Eple) System.out.println( Et eple!"); else if (f instanceof Appelsin) System.out.println( Appelsin!"); class Frukt {.. class Eple extends Frukt {.. class Appelsin extends Frukt {.. Hva blir resultatet av dette programmet? Lærdom: Et objekt vil alltid være en instans av sine superklasser i tillegg til sin egen klasse. 11 Biler og mer bruk av instanceof class Bil { String regnr;... class Personbil extends Bil { int antpass;... class Lastebil extends Bil il{ double lastevekt;... class Drosje extends Personbil { int LøyveNr;... HashMap <String, Bil> h; h = new HashMap <String, Bil> ( );... for ( Bil b: h.values ()){ ) String nr = b.regnr; // eventuelt 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 ) 12

Konvertering av referanser (pekere) Konvertering av referanser (forts.) 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. 13 Hva hvis vi istedenfor hadde hatt: Person pers = new Person(); Student stud = (Student) pers; Dette godkjennes av kompilatoren, men ved kjøring får vi 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?) 14 Konvertering mellom flere nivåer Oppgave Brev Person Student MasterStudent MasterStudent master = new MasterStudent(); Konvertering oppover: Person pers Student stud = master; Person pers = master; 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 ) 15 Anta at vi har deklarasjonene Soknad Kjaerli class Brev { class Soknad extends Brev { class Kjaerlighetsbrev extends Brev { Avgjør hvilke av følgende uttrykk som er lovlige: 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 Ulovligli 16

Konvertering til klassen Object En liten beholder 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 ikonvertere nedover igjen: (Person) obj 17 Hva slags objekter får jeg lov til å lagre? void legginn (Object en) Object hent ( ) Hva er ulempen(e) med dette? Type: Object 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; void legginn (Bil en) Dette ønsker vi oss: Type: Bil class Bil { class Person { public class EnkelDemo { BeholderTilEn bilbeholder = new BeholderTilEn(); Bil bilen = new Bil(); bilbeholder.legginn(bilen) Person personen = new Person(); Object noe; Bil bilto; bilbeholder.legginn(personen); noe = bilbeholder.hent(); bilto = (Bil) noe; Bil hent( ) void legginn (Person en) Type: Person Objekt av klassen Bil eller en subklasse av Bil Bil biltre = new Bil(); bilbeholder.legginn(biltre); Bil bilfire = (bil) bilbeholder.hent(); Person hent( ) 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 GenBeholderTilEn <Bil> bilbeholder = new GenBeholderTilEn <Bil> ( ); Type: GenBeholderTilEn <Bil> Navn: bilbeholder Bil bilen = new Bil(); bilbeholder.legginn(bilen); bilen = bilbeholder.hent( hent(); Slike objekter finnes Da kan vi tenke oss at vi har et mønster objekt : NB! slike objekt finnes ikke!! void legginn (T en) Thent( ) Type: T Erstatt T med din favoritt-klasse Objekt av klassen T eller en subklasse av T void legginn (Bil en) Bil hent( ) Type: Bil 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 { GenBeholderTilEn <Bil> bilbeholder = new GenBeholderTilEn <Bil> (); Bil bilen = new Bil(); bilbeholder.legginn(bilen); ld l Bil bilto = bilbeholder.hent(); I dette objektet kan vi bare legge inn biler! og vi slipper å typekonvertere ( caste ) når vi tar dem ut 23 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 t stud = new Student(); t(); 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. 24

HashMap med typespesifikasjon ArrayList class Bil { String regnr; class Personbil extends Bil { int antpass; class Lastebil extends Bil { double lastevekt; class Drosje extends Personbil { int LøyveNr; HashMap <String, Bil> h; h = new HashMap <String,Bil> ( ); Bil bl; Personbil minbil; Personbil persb = new Personbil(); h.put ( DE25132,p persb); bl = h.get( DE25132 ); minbil= (Personbil) bl; //tryggere med: if (bl instanceof Personbil) minbil = (Personbil) bl; DE25132 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. 25 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) 26 ArrayList (forts.) Object: tostring og equals 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); 27 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) 28

Eksempel på tostring og equals class Punkt { class Punkt2 { int x, y; int x, y; Punkt(int x0, int y0) { Punkt2(int x0, int y0) { x = x0; x = x0; y = y0; y = y0; public String tostring() { return ("x = "+x+" y = "+y); Anta: Punkt p1 = new Punkt(3,4); public boolean equals(object o) { Punkt p2 = new Punkt(3,4); if (!(o instanceof Punkt2)) return false; Punkt2 q1 = new Punkt2(3,4); Punkt2 p = (Punkt2) o; Punkt2 q2 = new Punkt2(3,4); return x == p.x && y == p.y; Hva blir nå: Et eksempel på et objekt som spiller mange roller: Hva er et interface (grensesnitt)? Superklasser og grensesnitt gir roller som objekter kan spille / være Object-rollen Person-rollen Ansatt-rollen KonkurranseDeltager-rollen Manne-rollen Comparable -rollen p1.tostring(); Punkt@f5da06 q1.tostring(); x = 3 y = 4 p1.equals(p2); false q1.equals(q2); true 29 public metoder pluss hemmelig datastruktur 30 Hva er et interface (grensesnitt)? Bruk av interface KonkurranseDeltager En maratonløper deltar i konkurranse En slags klasse uten kode. En oppførsel sett utenifra. interface KonkurranseDeltager { int startnummer( t (); int plassering( ) ; finnvekt setplassering setvekt hentfodselsar Tre eksempler på grensesnitt: interface KonkurranseDeltager { public int startnummer( ); public int plassering( ) ; interface Comparable{ public int compareto (Object hva); interface Comparable <T>{ public int compareto (T hva); Fra Java-biblioteket startnummert class MaratonLoper implements KonkurranseDeltager { plassering final private int fodselsar; private double vekt; protected int startnr; private int plass; public MaratonLoper (int f, double vekt) {fodselsar = f; this.vekt= vekt; public double finnvekt ( ) { return vekt; public void settvekt ( double vekt ){ this. vekt = vekt; public int hentfodselsar ( ) { return fodslesar; public void setplassering (int plass) {this.plass = plass; public int startnummer ( ) { return startnr; public int plassering( ) {return plass; private vs. protected 32

Biler som kan sammenlignes - 1 Biler som kan sammenlignes - 2 interface Comparable { int compareto (Object hva); interface Comparable <T>{ int compareto ( T hva); class Bil implements Comparable { final private String regnr; private double vekt; public Bil(String r, double vekt) {regnr = r; this.vekt= vekt; public double finnvekt ( ) { return vekt; public void settvekt ( double vekt ) { this. vekt = vekt; public String finnregnr( ) {return regnr; public int compareto(object hva) { Bil b; b = (Bil) hva; return regnr.compareto(b.regnr); 33 class Bil implements Comparable <Bil> { final private String regnr; private double vekt; public Bil(String r, double vekt) {regnr = r; this.vekt= vekt; public double finnvekt ( ) { return vekt; public void settvekt ( double vekt ) { this. vekt = vekt; public String finnregnr( ) {return regnr; public int compareto( Bil hva) { return regnr.compareto(hva.regnr); Om vi deklareren en generisk klasse kan den også brukes uten parameter. Da brukes Object som parameter, jfr. forrige side. 34