INF1010 Arv. Marit Nybakken marnybak@ifi.uio.no 2. februar 2004



Like dokumenter
Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

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

INF1000 Metoder. Marit Nybakken 16. februar 2004

Læringsmål for forelesningen

Kapittel 7: Mer om arv

Enkle generiske klasser i Java

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

INF Seminaroppgaver til uke 3

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

INF1010 UML. Marit Nybakken 26. januar 2004

INF1000 HashMap. Marit Nybakken 2. november 2003

EKSAMEN. Objektorientert programmering

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

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

Klasser, objekter, pekere og UML. INF gruppe 13

INF1010 våren Arv og subklasser - del 2

INF1010 våren Arv og subklasser del 1

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

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

INF1000: Forelesning 7

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

INF1010 våren Arv og subklasser del 1

INF1000: Forelesning 7. Konstruktører Static

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

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

INF1010. Grensesnittet Comparable<T>

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

INF1010 våren Arv og subklasser - del 2

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

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

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

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

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

To måter å programmere på. Java 12. Programmering med objekter. Statisk programmering

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

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

Utførelse av programmer, metoder og synlighet av variabler i JSP

Læringsmål for forelesningen

Dagens tema: Mer av det dere trenger til del 1

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

UNIVERSITETET I OSLO

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

LC191D/LO191D Videregående programmering mai 2010

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

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

OO-eksempel. Modellen ser slik ut: Studenter + antstudenter : int = 0

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

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

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

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

LO191D/LC191D Videregående programmering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Generiske mekanismer i statisk typede programmeringsspråk

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

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

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

Klasser. Webprogrammering høsten Objekter. Eksempelklasser og -objekter. 2 of :56. 1 of :56

INF1010 våren Arv og subklasser - del 2

Runtimesystemer - II. Funksjoner som parametere. Virtuelle metoder

2 Om statiske variable/konstanter og statiske metoder.

INF Notater. Veronika Heimsbakk 10. juni 2012

Repetisjon. INF gruppe 13

Introduksjon til objektorientert programmering

81,9(56,7(7(7,26/2 'HWPDWHPDWLVNQDWXUYLWHQVNDSHOLJHIDNXOWHW

INF1000 Mer om objekter

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

UNIVERSITETET I OSLO

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

Del 3: Evaluere uttrykk

UNIVERSITETET I OSLO

Kanter, kanter, mange mangekanter

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

ANTDAGER = 358; I Ifra nyttår 08 til 08 1ed julaften

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

ADT og OO programmering

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

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

INF1010 våren Arv og subklasser, del 2

INF1010 Sortering. Marit Nybakken 1. mars 2004

GUI-programmering, del 3 Vinduslyttere Dialogvinduer GUI-komponenten JTable Egne datamodellklasser. En oversikt over kapittel 19 i boka

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

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

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

Oblig4 - forklaringer. Arne og Ole Christian

Gjennomgang av eksamen H99

Løsningsforslag til Eksamen i fag SIF8005 Programmering. Torsdag 10. mai 2001 kl

Dagens tema Kapittel 8: Objekter og klasser

TDT4100 Objektorientert programmering

Diverse eksamensgaver

INF Uke 10. Ukesoppgaver oktober 2012

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

Transkript:

INF1010 Arv Marit Nybakken marnybak@ifi.uio.no 2. februar 2004 Motivasjon Arv bruker vi så vi skal slippe å skrive oss i hjel. Når vi programmerer, prøver vi gjerne å modellere en del av verden ved hjelp av objekter. I verden er det mange ting som ligner på hverandre, men som ikke er helt like allikevel. De har noen felles egenskaper, og noen egenskaper som er unike. Dette skyldes ofte evolusjon, som ikke dekkes i dette kurset. Vi kan reflektere dette i programmene våre, ved å lage superklasser som samler de felles egenskapene, og subklasser som spesifiserer de spesielle egenskapene. Når vi snakker om egenskaper her, så mener vi både objektvariable og metoder. Hvis tingene også gjør noe på den samme måten, så kan metoden som representerer dette flyttes opp i superklassen. Vi lager oss en superklasse Kattedyr og samler de felles egenskapene vi kan komme på for alle kattedyr i denne klassen. Vi bestemmer også at alle katter kan male og fange dyr. class Kattedyr { protected double pelslengde; protected String levested; protected String [ ] diett; Kattedyr(double pelslengde, String levested, String [ ] diett) { this.pelslengde = pelslengde; this.levested = levested; 1

this.diett = diett; 10 void mal() { // mjau :D void fangetdyr(int nr) { fang og spis(diett[nr]); 20 Så spesialiserer vi litt og lager en Løve-klasse som arver fra Kattedyr-klassen. Vi kan få klasser til å arve fra andre klasser ved å skrive: class Subklassenavn extends Superklassenavn class Løve extends Kattedyr { private double brølevolum; Løve(String pelslengde, String levested, String [ ] diett, double brølevolum) { super(pelslengde, levested, diett); this.brølevolum = brølevolum; void brøl() { 10 Brøl b = new Brøl(brølevolum); b.start(); Nå får alle Løve-objekter både de variable og metoder som er definert i subklassen og de som er definert i superklassen. Løvene får alle de felles kattedyregenskapene i tillegg til at de kan brøle på et bestemt volum. Dette betyr at dette er mulig: Løve l = new Løve(13.2, "Namibia", {"gaselle", "spretthare"); // Lage løve l.brøl(); // Gjøre løveting l.fangetdyr(1); // Gjøre kattedyrting 2

super I konstruktøren i Løve står det super(pelslengde, levested, diett); super er et kall på konstruktøren i superklassen. Dette må gjøres helt først i konstruktøren i subklassen. Legger vi ikke inn noe kall på super, setter java inn en usynlig super(); øverst i subklasse-konstruktøren. Har vi ingen konstruktør som ikke tar parametre i superklassen, får vi da problemer. Konstruktøren i superklassen passer fint til å sette objektvariablene som hører til superklassen. Vi har også en super-peker. Denne peker på superklassen (altså superklassedelen av objektet), akkurat som this refererer til objektet vi er i akkurat nå. Vi finner på litt flere katter. class Kattunge extends Kattedyr { 3

private int kosefaktor; Kattunge(String pelslengde, String levested, String[ ]diett, int kosefaktor) { super(pelslengde, levested, diett); this.kosefaktor = kosefaktor; void kos() { 10 kosefaktor++; mal(); class SerbokroatiskStuekatt extends Kattedyr { SerbokroatiskStuekatt(String pelslengde, String levested, String[ ]diett) { super(pelslengde, levested, diett); void tapetser() { //... 10 Den serbokroatiske stuekatten har faktisk ingen egne objektvariable. Men det er fremdeles et poeng i å lage en egen klasse for denne, da den kan gjøre noe de andre kattene ikke kan. På tide å lage katter nå // Lager ett objekt av hver klasse Kattedyr k = new Kattedyr(1.2, "Sverige", {"fisk", "mus", "leverpostei"); Løve l = new Løve(6, "Namibia", {"pelikan", "gaselle", "vårhare", 100.2); Kattunge ku = new Kattunge(2, "Senga mi", {"whiskas", "melk", 10); SerbokroatiskStuekatt ss = new SerbokroatiskStuekatt(0.5, "Ikea", {"snadderflesk", "tannkrem"); Så kaller vi metodene som finnes i subklassene, og ber dermed kattene gjøre det bare de kan gjøre. 4

l.brøl(); ku.kos(); ss.tapetser(); Så kaller vi superklassemetoder og ber kattene gjøre det de alle får til: l.mal(); ku.fangetdyr(0); ss.mal(); Overlasting Subklassene kan, om de vil, definere sine egne versjoner av metodene i superklassen. class Løve extends Kattedyr { //... void brøl() { Brøl b = new Brøl(brølevolum); b.start(); void mal() { brøl(); super.mal(); // male littegranne også 10 Hvis vi nå kaller mal i et løveobjekt, vil versjonen i subklassen kalles i stedet, og løven vil brøle før den maler. Løver er uansett ikke veldig flinke til å male, de kan kun male på utpust. Merk bruken av super-pekeren, den eneste måten å få kalt malemetoden i superklassen på nå er å kalle den via superpekeren. Sier vi bare mal(), kaller vi på malemetoden i Løve-klassen. 5

Pekere Til nå har vi alltid skrevet MinKlasse mk = new MinKlasse(); når vi har laget et objekt. Står det MinKlasse på høyre side skal det stå det på venstre også, fordi pekeren skal være av samme type som objektet. Men vi kan faktisk også ha pekere av typen superklasse til subklasseobjekter. Kattedyr k1 = l; // løven Kattedyr k2 = ku; // kattungen Kattedyr k3 = ss; // stuekatten Hva betyr dette? Når vi har en superklassepeker til et subklasseobjekt, så får vi bare tak i metoder og variable i superklassen via denne pekeren. Vi ser altså på kattungen, løven og stuekatten som kattedyr, og glemmer at de kan tapetsere, kose og brøle. Vi får litt tunnelsyn når vi ser på objekter via superklassepekere. k3.fangetdyr(0); // ok k2.mal(); // ok k1.mal(); // ok, men hva skjer? k1.brøl(); // går ikke an lenger k2.kos(); // går ikke an lenger Løveklassen hadde overlastet metoden mal, og det har faktisk den effekten at når vi kaller på malemetoden, selv via en superklassepeker, så er det løvens egen malemetode som kalles. Hvis vi nå skal se på dem som spesielle kattedyr igjen, så må vi konvertere pekerne ned til subklassenivå. Når vi gjør det, må vi være sikre på at vi konverterer til riktig subklasse, det går ikke an å kalle en løve for en kattunge, da ber vi om bråk. Vi konverterer slik: Subklasse nypeker = (Subklasse) superklassepekeren; Løve l2 = (Løve) k1; // Nå ser vi på løven som en løve igjen, via l2-pekeren Kattunge ku2 = (Kattunge) k2; // Og kattungen er helt og fullt kattunge via ku2-pekeren SerbokroatiskStuekatt ss2 = (SerbokroatiskStuekatt) k3; 6

Kattunge ku2 = (Kattunge) k1; // Dette går veldig dårlig. En løve er ingen kattunge. //(Vi får ClassCastException) Nå får vi tak i subklassemetodene via de nye pekerne (i og for seg så fikk vi tak i dem via de opprinnelige pekerne også da). l2.brøl(); ku2.kos(); ss2.tapetser(); Abstrakte klasser Egentlig gir det kanskje ikke mening at det skal være lov til å lage objekter av superklassen Kattedyr, å lage kattedyr uten å si hva slags type kattedyr det er. Hvem vet hva slags uhyggelige beist som kan oppstå hvis vi ikke tar kontrollen? Vi kan faktisk spesifisere at en klasse ikke kan lages objekt av ved å gjøre den abstrakt. abstract class Kattedyr {... Et kattedyr blir nå et abstrakt konsept, og vi kan ikke si new Kattedyr() lenger. Vi må lage subklasser av Kattedyr for å kunne lage katter. Ellers fungerer alt som normalt. Abstrakte klasser kan ha abstrakte metoder. En abstrakt metode har ingen metodekropp, bare metodedeklarasjon: abstract returtype metodenavn(parametre); Når vi deklarerer en abstrakt metode i en superklasse, må alle subklasser implementere metoden. abstract class Kattedyr { public abstract void klorpådøra(); 7

class Løve extends Kattedyr { public void klorpådøra() { 10 rivdøraifiller(); Det er en måte å sikre at subklassene oppfører seg riktig på. Samtidig kan man nå ha Kattedyrpekere til Løveobjektene og fremdeles kunne kalle på klorpådøra(). Kattedyr pusekatt = new Løve(13, "Sverige", {"Kjøttboller", 29); pusekatt.klorpådøra(); instanceof Siden man kan ha så mange forskjellige pekere til objektene, trenger man en måte å sjekke hva slags objekt en peker faktisk peker på. Dette bruker man instanceof til: if(peker instanceof EnEllerAnnenKlasse) Dette er spesielt praktisk hvis man har puttet objekter av forskjellige klasser inn i en hashmap. Når man tar objekter ut av en hashmap, får man ut en peker av type Object, som er superklassen for alle klasser. Det er så vanlig å konvertere disse pekerne ned til riktig klasse: Elefant e = (Elefant) dyrene.get( Pellefant ); Har vi både elefanter og giraffer i hashmapen, må vi først ta ut pekeren og så teste den før vi konverterer ned: Object o = dyrene.get("pellefant"); if(o instanceof Elefant) { // Konverter pekeren ned til Elefant Elefant e = (Elefant) o; else if (o instanceof Giraff) { Giraff g = (Giraff) o; 8

else if(... 9