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

Like dokumenter
INF1010 våren Arv og subklasser del 1

INF1010 våren Arv og subklasser del 1

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

INF1010 våren Arv og subklasser - del 2

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

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

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

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

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

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

INF1010 våren Arv og subklasser del I

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

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

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

INF1010 våren Arv og subklasser, del 2

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1010 våren Arv og subklasser - del 2

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

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

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

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

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

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

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

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

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

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

Kapittel 7: Mer om arv

INF1010 Arv. Marit Nybakken 2. februar 2004

Enkle generiske klasser i Java

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

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

INF1010. Grensesnittet Comparable<T>

INF1000: Forelesning 6. Klasser og objekter del 1

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

INF1000: Forelesning 7. Konstruktører Static

INF1000: Forelesning 7

Kapittel 9: Sortering og søking Kort versjon

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

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

INF1000: noen avsluttende ord

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

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

Generiske mekanismer i statisk typede programmeringsspråk

2 Om statiske variable/konstanter og statiske metoder.

Introduksjon til objektorientert programmering

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

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

Klasser, objekter, pekere og UML. INF gruppe 13

INF Notater. Veronika Heimsbakk 10. juni 2012

UNIVERSITETET I OSLO

INF1010 oversikt med

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

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

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

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

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

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

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

Velkommen til. INF våren 2016

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

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

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

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

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

Gjennomgang av eksamen H99

Forelesning inf Java 5

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

Forelesning inf Java 5

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

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

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

INF1010 våren Grensesnitt

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

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

Kapittel 8: Sortering og søking INF100

INF1010 våren Grensesnitt

Læringsmål for forelesningen

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

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

Løsningsforslag ukeoppg. 7: okt (INF Høst 2010)

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

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

Kapittel 8: Sortering og søking INF100

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

Obligatorisk oppgave 4: Lege/Resept

Seminaroppgaver IN1010, uke 2

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

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

UNIVERSITETET I OSLO

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

INF våren 2017

Transkript:

Emneoversikt subklasser INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser Stein Gjessing Institutt for informatikk Mange flere eksempler på fellesøvelsene og neste forelesning 1 Generalisering - spesialisering Gjenbruk av klasser Ved sammensetning (komposisjon) Ved arv Referanser - pekere Klasse-hierarkier Virtuelle metoder Nøkkelordet super Konvertering av referanser Klassen Object Metoden equals() Nøkkelordet instanceof Konstruktører 2 Eksempel: Universitetsregister I et mini-system for universitetet i Oslo skal alle studenter registreres med og telefonnummer (åtte siffer), samt hvilket studie de er tatt opp til. Det skal være mulig for studenter å bytte. Systemet skal også inneholde informasjon om de ansatte ved universitetet, nemlig, telefonnummer, lønnstrinn og antall arbeidstimer per uke. Tekniskadministrativt ansatte har en arbeidsuke på 37.5 timer, mens vitenskapelig ansatte har 40-timers arbeidsuke. Klassen class { String ; int ; String ; System.out.println("Navn: " + ); System.out.println("Telefon: " + ); System.out.println("Studie: " + ); boolean { return >= 10000000 && <= 99999999; void byttprogram(string nytt) { = nytt; 3 4

Klassen Ansatt vs Ansatt class Ansatt { String ; int ; int lønnstrinn; int antalltimer; System.out.println("Navn: " + ); System.out.println("Telefon: " + ); System.out.println("Lønnstrinn: " + lønnstrinn); System.out.println("Timer: " + antalltimer); boolean { return >= 10000000 && <= 99999999; void lønnstillegg(int tillegg) { lønnstrinn += tillegg; 5 Felles variable:, Egne variable: : Ansatt: lønnstrinn, antalltimer Felles metoder: Lignende metoder: skrivdata() Egne metoder: : nyttprogram(string nytt) Ansatt: lønnstillegg(int tillegg) 6 Klassen Kan samle det som er felles i en egen, mer generell, klasse: class { String ; int ; boolean { return >= 10000000 && <= 99999999; og Ansatt som subklasser Kan nå gjøre og Ansatt til subklasser av : class extends { String ; void byttprogram(string nytt) { = nytt; class Ansatt extends { int lønnstrinn; int antalltimer; Angir at klassene og Ansatt er subklasser (= utvidelser) av klassen. void lønnstillegg(int tillegg) { lønnstrinn += tillegg; 7 Hva med skrivdata()? - Kommer tilbake til denne Nytt Java nøkkelord: extends 8

class { String ; int ; String ; boolean {... void byttprogram(string nytt) {... Eksempler på objekter av klassene class { String ; int ; boolean {... class extends { String ; void byttprogram(string nytt) {... 9 Bruk av en subklasse Vi kan bruke variable og metoder i en subklasse på samme måte som om vi hadde definert alt i én klasse: Uten bruk av subklasser (før): class { String ; int ; String ; boolean {... void byttprogram(string nytt) {... Navn: stud Type: eller stud = new (); stud.; String prog = stud.; Med bruk av subklasser (nå): class { String ; int ; boolean {... class extends { String ; void byttprogram(string nytt) {... Navn: stud Type: 10 UML-notasjon for subklassehierarki Hva er en subklasse? class { String ; int ; boolean {... class extends { String ; void byttprogram(string nytt) {... class Ansatt extends { int lønnstrinn; void lønnstillegg (int tillegg){ lønnstrinn += tillegg; Ansatt En subklasse er en klasse som bygger på en allerede spesifisert klasse, og som dermed arver dennes egenskaper i tillegg til å utvide med egne egenskaper (metoder/variable). En subklasse er altså en mer spesialisert utgave av klassen den bygger på. Klassen vi bygger på kalles en superklasse. 11 12

Generalisering spesialisering Mengden av alle er lønnstrinn antalltimer Ansatt Mengden av alle Ansatte Sub-klasse ~ Sub-mengde (del-mengde) Mengden av alle er 13 Klasse-hierarkier Det er mulig å definere subklasser av en subklasse: class { String ; int ; boolean {... class extends { String ; void byttprogram(string nytt){... class Master extends { String veileder; Obs: Her er Master en subklasse av både og, og arver egenskaper fra begge disse. Master veileder 14 Generalisering spesialisering Klasser - Subklasser Mengden av alle er Klassehierarki: Master Mengden av alle Masterer Mengden av alle er Lastebil Bil bil Drosje class Bil {... class bil extends Bil {... class Lastebil extends Bil {... class Drosje extends bil {... veileder 15 16

Klassehierarki: Alle lastebiler bil Lastebil Bil Klasser - Subklasser Drosje class Bil { <lys beige egenskaper> class bil extends Bil { <røde egenskaper> class Lastebil extends Bil { < grønne egenskaper> class Drosje extends bil { < gule egenskaper> Alle biler Alle drosjer Alle personbiler 17 Navn: stud Type: Ulike måter å se et objekt på Navn: pers Typen (klassen) til hele dette objektet er Type: Typen (klassen) til et objekt er uforanderlig. Et objekt kan likevel fremtre for oss på ulike måter. Et objekt av klassen class extends {... kan vi se på som et objekt av typen (klassen) : da er egenskapene som er spesielle for ikke synlige (men de er der fortsatt!). : da er både - og egenskapene synlige for oss. Det er referansens type som avgjør hvordan objektet fremtrer. (med untak av virtuelle metoder, som vi snart skal lære hva er) stud; pers; stud = new (); pers = stud; (Det er lov å skrive: pers = new (); 18 Omdefinering av metoder - polymorfi Polymorfi: eksempel Vi har sett at det med subklasser er mulig å utvide en eksisterende klasse med nye metoder. 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. I Java er alle metoder virtuelle, så sant de ikke er deklarert med final. Virtuelle metoder = polymorfi 19 class Hund { //... System.out.println("Voff-voff"); class Rasehund extends Hund { //... System.out.println("Vov-vov"); Anta: Hund h = new Hund(); Rasehund r = new Rasehund(); Hund g = new Rasehund(); For objekter av typen Hund er det denne metoden som gjelder. For objekter av typen Rasehund er det denne metoden som gjelder. Hva skrives ut ved hvert av kallene: h.bjeff(); r.bjeff(); g.bjeff(); 20

Polymorfi: eksempel Nøkkelordet super Hund h Rasehund r Hund g Nøkkelordet super brukes til å aksessere variable / metoder i objektets superklasse. Dette kan vi bruke til å la superklassen ha en generell skrivdata, som så kalles i subklassene: System.out.println("Voff-voff"); System.out.println("Voff-voff"); // I klassen : System.out.println("Navn: " + ); System.out.println("Telefon: " + ); System.out.println("Vov-vov"); // I klassen : super.skrivdata(); System.out.println("Studie: " + ); Anta: Hund h = new Hund(); Rasehund r = new Rasehund(); Hund g = r; Hva skrives ut ved hvert av kallene: h.bjeff(); r.bjeff(); g.bjeff(); voff-voff vov-vov vov-vov // Tilsvarende i klassen Ansatt: super.skrivdata(); System.out.println("Lønnstrinn: " + lønnstrinn); System.out.println("Timer: " + antalltimer); 21 22 Hva slags objekt har jeg? Men: 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 { public static void main(string[] args) { Eple e = new Eple(); skrivut(e); Hva skjer under kjøring? static void skrivut(frukt f) { if (f instanceof Eple) System.out.println("Dette er et eple!"); else if (f instanceof Appelsin) System.out.println("Dette er en appelsin!"); class Frukt {.. class Eple extends Frukt {.. class Appelsin extends Frukt {.. 23 Istedenfor å teste hvilken klasse objektet er av, be objektet gjøre jobben selv: Bedre 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!");.. Blir det skrevet ut noe? 24

Konvertering av referanser (pekere) Konvertering av referanser (forts.) Anta at vi har: class extends { stud = new (); Hva hvis vi istedenfor hadde hatt: pers = new (); stud = () pers; Ved tilordningen pers; pers = stud; har vi en implisitt konvertering fra - til referanse. Dette godkjennes av kompilatoren, men ved kjøring får vi feilmeldingen java.lang.classcastexception (fordi pers ikke peker på et objekt med alle egenskapene) Hvis vi nå ønsker å få tak i de spesielle egenskapene, må vi foreta en eksplisitt konvertering tilbake til igjen: stud2 = () pers; Dette kalles casting (class-cast) på engelsk, typekonvertering på norsk 25 For å unngå denne feilen, kan instanceof brukes: if (pers instanceof ) { stud = () pers; (Har det objektet pers peker på alle - egenskapene?) 26 Konvertering mellom flere nivåer Konvertering til klassen Object Master master = new Master(); Master Konvertering oppover: stud = master; pers = master; pers stud Konvertering nedover: () pers (Master) pers (fordi dette krever kontroll under kjøring) Master master Regel: Alle pekere har lov til å peke bortover og nedover Alle klasser i Java er subklasser av klassen Object. Når vi skriver class { så tolker Java dette som class extends Object { Dermed kan vi alltid konvertere en referanse oppover til klassen Object: pers = new (); Object obj = pers; For å snakke om egenskapene til -objektet må vi konvertere nedover igjen: () obj (men ikke oppover ) 27 28

Konstruktører Konstruktører og arv 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: int x, y; 1. Det settes av plass i intern-minnet til et objekt av klassen Punkt og til referansen p. 2. Variablene x og y blir deklarert. 3. Konstruktør-metoden blir kalt med x0=3 og y0=4. 4. Etter at konstruktøren har satt x=3 og y=4, settes høyresiden i tilordningen Punkt p = new Punkt(3,4) lik adressen (referansen) til det nye objektet. 5. Tilordningen Punkt p = utføres, dvs p settes lik adressen til objektet. : p type: Punkt Punkt(int x0, int y0) { x = x0; y = y0; : x : y 3 4 type: int type: int Punkt(int x0, int y0) : x0 : y0 3 4 type: int type: int x = x0; y = y0; 29 Det blir noe mer komplisert når vi opererer med arv: Anta at vi har definert en subklasse class B extends A { Hvilken konstruktør utføres hvis vi skriver B bpeker = new B(); Konstruktøren i klassen A? Konstruktøren i klassen B? Begge? 30 Konstruktører og arv (forts.) Kall på super-konstruktøren 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 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 met kompileres. Hvis en klasse ikke har noen konstruktør, legger Java inn en tom konstruktør med kallet super(); 31 32