INF1010 våren Arv og subklasser - del 2

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

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

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

INF1010 våren Arv og subklasser, del 2

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

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

INF1010 våren Arv og subklasser, del 2

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

INF1010 våren Arv og subklasser del I

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

INF1010 våren Grensesnitt

INF1010 våren 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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

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

INF1010 våren Grensesnitt (interface)

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

INF1010 våren Interface (Grensesnitt)

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

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. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

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

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

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

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

INF1010 våren januar. Objektorientering i Java

IN1010 våren januar. Objektorientering i Java

Enkle generiske klasser i Java

INF1010 våren 2005 Uke 3, 25. januar Arv og subklasser del I

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) 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; }

INF1010. Grensesnittet Comparable<T>

INF1000: Forelesning 7

INF1000: Forelesning 7. Konstruktører Static

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

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

Kapittel 7: Mer om arv

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

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

2 Om statiske variable/konstanter og statiske metoder.

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

INF1010 oversikt med

INF1010 Arv. Marit Nybakken 2. februar 2004

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

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

INF Notater. Veronika Heimsbakk 10. juni 2012

Obligatorisk oppgave 4: Lege/Resept

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

INF1010 våren 2018 tirsdag 23. januar

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

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

INF1000: Forelesning 6. Klasser og objekter del 1

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

TDT4100 Objektorientert programmering

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 %

UNIVERSITETET I OSLO

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Introduksjon til objektorientert programmering

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

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

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

INF Løsning på seminaropppgaver til uke 8

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

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

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

Generiske mekanismer i statisk typede programmeringsspråk

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

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

Læringsmål for forelesningen

Gjennomgang av eksamen H99

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

INF Seminaroppgaver til uke 3

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

Del 3: Evaluere uttrykk

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

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

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

Forelesning inf Java 5

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

2 Om statiske variable/konstanter og statiske metoder.

Forelesning inf Java 5

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

UNIVERSITETET I OSLO

Transkript:

INF1010 våren 2013 Torsdag 14. februar Arv og subklasser - del 2 Stein Gjessing Institutt for informatikk

Dagens tema Virtuelle metoder som er det samme som Polymorfi Mer om arv / interface Mer om pekertilordninger og briller / roller Typekonvertering (casting) Test på klassetilhørighet Fine navn, men det er ikke så vanskelig" Det som står igjen etter dette er konstruktører i subklasser (om to uker). 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 { private int pris; public int skatt( ) {return pris; Polymorfi: eksempel Klassehierarki: Bil class Personbil extends Bil { private int antallpassasjer; public int skatt( ) {return pris * 2; Personbil class Lastebil extends Bil { private double lastevekt; public int skatt ( ) {return pris / 2; Lastebil class Drosje extends Personbil { private String loyveid; public int skatt ( ) {return pris / 4; Drosje 4

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

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

Bil Bil Personbil Bil Lastebil Polymorfi: eksempel b1 private int pris 100 b2 public int skatt( ) { return pris; p1 private int pris 200 public int skatt( ) { return pris; b3 private int antpassasjer last public int skatt( ) { return pris * 2; Bilobjekt Personbilobjekt private int pris 300 Hva blir: Bil Personbil Drosje b4 p2 d1 public int skatt( ) { return pris; private 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 private int pris 400 public int skatt( ) { return pris; private int antpassasjer public int skatt( ) { return pris * 2; private 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 void bjeff() { System.out.println("Vov-vov"); void bjeff() { System.out.println("Vov-vov"); 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 { void skrivdefinisjon () { System.out.println ("Et instrument er noe man kan spille på"); class Piano extends Instrument { 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 { void skrivdefinisjon () { System.out.println ("Et instrument er noe man kan spille på"); class Piano extends Instrument { 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 { void skrivdefinisjon () { System.out.println("Et instrument er noe man kan spille på"); class Piano extends Instrument { 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 { 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 { 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 { int pris; int prisutenmoms() { return pris; Anta: Vare v = new Vare(); v.pris = 100; int prismedmoms() { return (int) (1.25*prisUtenMoms()); SalgsVare s = new SalgsVare(); s.pris = 100; s.rabatt = 25; class SalgsVare extends Vare { int rabatt; // I prosent... Hva blir nå: int prisutenmoms() { return pris (pris*rabatt/100); v.prismedmoms() s.prismedmoms() 16

pris 100 Anta: Vare v = new Vare(); v.pris = 100; Vare v2 SalgsVare s = new SalgsVare(); s.pris = 100; s.rabatt = 20; Vare v2 = s; SalgsVare s Hva blir nå: v.prismedmoms(); s.prismedmoms(); v2.prismedmoms(); Vare v int prisutenmoms ( ) { return pris; int prismedmoms { return (int) (1.25*prisUtenMoms ( ) ); pris int prisutenmoms ( ) { return pris; int prismedmoms { return (int) (1.25*prisUtenMoms ( ) ); rabatt 100 20 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: void skrivdata() { System.out.println("Navn: " + navn); System.out.println("Telefon: " + tlfnr); System.out.println("Studieprogram: " + program); // I klassen Ansatt: 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: void skrivdata() { System.out.println("Navn: " + navn); System.out.println("Telefon: " + tlfnr); // I klassen Student: void skrivdata() { super.skrivdata(); System.out.println("Studieprogram: " + program); // Tilsvarende i klassen Ansatt: 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

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 21

Repetisjon: interface / grensesnitt interface Heltallsbeholder { public void settinn(int tall); public int taut( ); public void settinn(int tall) public int taut( ) En tankemodel for gresesnittet Heltallsbeholder Metoden settinn gjør at objektet tar vare på tallet som er parameter til metoden. Metoden taut sletter fra objektet et av de tallene som tidligere er satt inn. Metoden returnerer det tallet som er slettet. Et grensesnitt beskriver en rolle som alle objektene som implementerer dette grensesnittet må kunne spille" public void settinn(int tall) public int taut( )... Et objekt av en klasse som implementerer grensesnittet Heltallsbeholder kan også inneholde andre offentlige metoder. 22

Interface: Klassehierarki og Java-kode Heltallsbeholder interface Heltallsbeholder { public void settinn(int tall); public int taut( ); EnkelHeltallsbeholder class EnkelHeltallsbeholder implements Heltallsbeholder { int [ ] tallene = new int [100]; int antall; public void settinn(int tall) {... public int taut( ) {... Når en klasse implementerer et gresesnitt (interface) tegner vi det nesten på samme måte som en superklasse / subklasse. For å markere at superklassen ikke er det, men et grensesnitt, kan vi enten skrive interface i boksen, og/eller vi kan gjøre navnet på grensesnittet (og boksen?) kursiv. Norsk: Grensesnitt Engelsk: Interface 23

Arv fra grensesnitt til grensesnitt Nytt interface KanBjeffe{ void bjeff(); interface Svigermor extends KanBjeffe { boolean okpaabesok(); class NorskSvigermor implements Svigermor { boolean hyggelig = false; public void bjeff( ) { System.out.println( Uff uff ); public boolean okpaabesok() { return hyggelig; KanBjeffe Svigermor NorskSvigermor 24

To (eller flere) grensesnitt = to (eller flere) roller KanBjeffe Utkledd Karnevalshund Denne figuren avspeiler interface -ene og class -en på neste siden Ikke noe nytt her 25

interface KanBjeffe{ void bjeff(); interface Utkledd { int antallfarger(); Foto: AP class Karnevalshund implements KanBjeffe, Utkledd { private boolean farger; Karnevalshund (int frg) { farger = frg; public void bjeff( ) { System.out.printl( Voff - voff ); public boolean antallfarger() { return farger; Ikke noe nytt her 26

Eller bedre: KanBjeffe VanligHund Utkledd Karnevalshund Nytt (kanskje bedre hierarki) Denne figuren avspeiler interface -ene og class -ene på neste siden 27 27

interface KanBjeffe{ void bjeff(); interface Utkledd { int antallfarger(); class VanligHund implements KanBjeffe { public void bjeff() { System.out.println("Vov-vov"); Foto: AP class Karnevalshund extends VanligHund implements Utkledd { private boolean farger; Karnevallshund (int frg) { farger = frg; public boolean antallfarger() { return farger; 28

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 Exception Exception Virtual- Machine- Error IOError RuntimeException IOException Oppgave: Slå opp i Javabiblioteket AWTException... og ca. 60 andre

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

Hva slags objekt er dette? Nytt 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 32

Men: Prøv å unngå instanceof Istedenfor å teste hvilken klasse objektet er av, be objektet gjøre jobben selv: Bedre program: Bruk heller polymorfi class TestFrukt2 { public static void main(string[] args) { Fruk2 f = new Eple2(); f.skrivut( ); class Frukt2 { void 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!"); 33

god Biler og mer bruk av instanceof HashMap <String, Bil> h; (og litt casting ) 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; Nytt class Bil { String regnr; void skatt(){... class Personbil extends Bil { int antpass; void skatt(){... class Lastebil extends Bil { double lastevekt; void skatt(){... class Drosje extends Personbil { int LøyveNr; void skatt(){... 34

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

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?) 36

Konvertering mellom flere nivåer MasterStudent master = new MasterStudent(); Person Konvertering oppover: Student stud = master; Person pers Person pers = master; Student MasterStudent Konvertering nedover: stud = (Student) pers Student stud 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 ) 37

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 38

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 Object obj Person pers class Object er alle klassers mor 39

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

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); false q1.equals(q2); x = 3 y = 4 true 41

En lenket liste med noder settinn(object x) Object taut( ) forste Element Navn: neste Type: Element Navn: neste Type: Element... Navn: denne Type: Object Navn: denne Type: Object Object-del Subklasse del(er) Hva som helst, siden alle klasser er subklasse av class Object Objekter av class Object (++) 42