INF1010 våren Arv og subklasser del 1

Like dokumenter
INF1010 våren Arv og subklasser del 1

INF1010 våren 2008 Uke 4, 22. januar Arv og 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 2

INF1010 våren Arv, subklasser og grensesnitt - 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 1 (pluss litt I/O og unntaksbehandling)

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

INF1010 våren Arv og subklasser - del 2

INF1010 våren Arv og subklasser del I

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

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 Grensesnitt

INF1010 våren Grensesnitt

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

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

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 Grensesnitt (interface)

INF1010 våren Arv og subklasser, del 2

INF1010 våren Arv og subklasser, del 2

INF1010 våren Interface (Grensesnitt)

INF1010 våren Arv og subklasser - del 2

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

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

Kapittel 7: Mer om arv

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

INF1010 våren januar. Objektorientering i Java

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

UNIVERSITETET I OSLO

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

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

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

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

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

Enkle generiske klasser i Java

INF1010. Grensesnittet Comparable<T>

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

INF1010 Arv. Marit Nybakken 2. februar 2004

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 Eksamenstips. Løsningsforslag prøveeksamen del 1.

INF1000: Forelesning 6. Klasser og objekter del 1

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

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

INF Seminaroppgaver til uke 3

IN1010 våren januar. Objektorientering i Java

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

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

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

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

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

INF1000: Forelesning 7. Konstruktører Static

INF1000: Forelesning 7

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

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

UNIVERSITETET I OSLO

Gjennomgang av eksamen H99

Generiske mekanismer i statisk typede programmeringsspråk

Introduksjon til objektorientert programmering

Kapittel 9: Sortering og søking Kort versjon

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

Velkommen til. INF våren 2016

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO

INF Notater. Veronika Heimsbakk 10. juni 2012

Dagens tema Kapittel 8: Objekter og klasser

Læringsmål for forelesningen

Obligatorisk oppgave 4: Lege/Resept

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

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

Sortering med tråder - Quicksort

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

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

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

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

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

Klasser, objekter, pekere og UML. INF gruppe 13

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

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

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

LO191D/LC191D Videregående programmering

UNIVERSITETET I OSLO

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

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

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

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

INF1010 Binære søketrær ++

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

UNIVERSITETET I OSLO

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

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

Transkript:

INF1010 våren 2015 Torsdag 12. februar Arv og subklasser del 1 Stein Gjessing Institutt for informatikk Universitetet i Oslo 1

Når du har lært om subklasser kan du programmere med: Første uke: Spesialisering (og generalisering) Klasse-hierarkier - arv Referanser (pekere) sterk typing Nøkkelordet instanceof Konvertering av referanser Klassen Object Andre uke: Virtuelle metoder Nøkkelordet super Gjenbruk av klasser og begreper Ved sammensetning (komposisjon) Ved arv Konstruktører 2

Hva er en subklasse? En klasse, Kl, beskriver objekter med visse felles egenskaper En subklasse av Kl, Sub, beskriver objekter som har de samme egenskapene (som beskrevet av Kl), men i tillegg er Sub-objektene noe mer, de har flere og / eller mer spesielle egenskaper... class Kl {... class Sub extends Kl {... Nytt Java nøkkelord: extends Navn på klasser og subklasser (Kl og Sub her) bør best mulig beskrive hva klassene representerer 3

Eksempel: Universitetsregister I et mini-system for Universitetet i Oslo skal alle studenter registreres med og telefonnummer (åtte siffer), samt hvilket studieprogram de er tatt opp til. Det skal være mulig for studenter å bytte program. 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. Alle personer skal behandles som......... 4

Eksempel: Universitetsregister I et mini-system for Universitetet i Oslo skal alle studenter registreres med og telefonnummer (åtte siffer), samt hvilket studieprogram de er tatt opp til. Det skal være mulig for studenter å bytte program. 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. Alle personer skal behandles som......... Substantivmetoden 5

Klassen Student program skrivdata() byttprogram() class Student { String ; int ; String program; void skrivdata() { System.out.println("Navn: " + ); System.out.println("Telefon: " + ); System.out.println("Studieprogram: " + program); boolean { return >= 10000000 && <= 99999999; void byttprogram(string nytt) { program = nytt; 6

Klassen Ansatt lønnstrinn antalltimer skrivdata() lønnstillegg() class Ansatt { String ; int ; int lønnstrinn; int antalltimer; void skrivdata() { 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; 7

Student vs Ansatt Felles variable:, Egne variable: Student: program Ansatt: lønnstrinn, antalltimer Felles metoder: Lignende metoder: skrivdata() Egne metoder: Student: byttprogram(string nytt) Ansatt: lønnstillegg(int tillegg) program skrivdata() byttprogram() Student-objekt lønnstrinn antalltimer skrivdata() lønnstillegg() Ansatt-objekt 8

Klassen Person Kan samle det som er felles i en egen, mer generell, klasse: class Person { String ; int ; boolean { return >= 10000000 && <= 99999999; Klassen Person beskriver alt som er felles for studenter og ansatte 9

Student og Ansatt som subklasser Kan nå gjøre Student og Ansatt til subklasser av Person: class Student extends Person { String program; void byttprogram(string nytt) { program = nytt; class Ansatt extends Person { int lønnstrinn; int antalltimer; Angir at klassene Student og Ansatt er subklasser (= utvidelser) av klassen Person. void lønnstillegg(int tillegg) { lønnstrinn += tillegg; Hva med skrivdata()? - Kommer tilbake til denne Nytt Java nøkkelord: extends 10

class Student { String ; int ; String program; class Person { String ; int ; boolean {... boolean {... void byttprogram(string nytt) {... class Student extends Person { String program; void byttprogram(string nytt) {... Eksempler på objekter av klassene program byttprogram() program byttprogram() 11

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): eller Med bruk av subklasser (nå): class Student { String ; int ; String program; boolean {... void byttprogram(string nytt) {... Navn: stud class Person { String ; int ; boolean {... class Student extends Person { String program; void byttprogram(string nytt) {... Navn: stud program byttprogram() Type: Student Type: Student Student stud = new Student(); boolean ok = stud.; String prog = stud.program; program byttprogram() 12

UML-notasjon for subklassehierarki class Person { String ; int ; boolean {... Person class Student extends Person { String program; void byttprogram(string nytt) {... class Ansatt extends Person { int lønnstrinn; void lønnstillegg (int tillegg){ lønnstrinn += tillegg; Student Ansatt I INF1010 er riktig UML-notasjon ikke viktig (men subklassehierarkier er viktig) 13

Igjen: Hva er en subklasse? 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/konstanter). En subklasse er altså en mer spesialisert utgave av klassen den bygger på. Klassen vi bygger på kalles en superklasse. Dette fant Ole-Johan Dahl og Kristen Nygaard på i ca. 1963, og laget programmeringsspråket Simula 14

Spesialisering - Generalisering Mengden av alle Personer Person Student Mengden av alle Studenter lønnstrinn antalltimer lønnstillegg() Ansatt Mengden av alle Ansatte program byttprogram() Sub-klasse ~ Sub-mengde (del-mengde) 15

Klasse-hierarkier Det er mulig å definere subklasser av en subklasse (etc.): class Person { String ; int ; boolean {... Person Student class Student extends Person { String program; void byttprogram(string nytt){... MasterStudent class MasterStudent extends Student { String veileder; Obs: Her er MasterStudent en subklasse av både Student og Person, og arver egenskaper fra begge disse. program byttprogram() veileder MasterStudent-objekt 16

Generalisering spesialisering Mengden av alle Personer Person Student Mengden av alle Studenter program byttprogram() MasterStudent Mengden av alle MasterStudenter program byttprogram() veileder 17

Klassehierarki: Klasser - Subklasser Bil class Bil {... Lastebil Personbil Drosje class Personbil extends Bil {... class Lastebil extends Bil {... class Drosje extends Personbil {... 18

Klassehierarki: Personbil Bil 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 { <gule egenskaper> Alle lastebiler Lastebil Drosje Alle biler Alle drosjer Alle personbiler 19

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 Mer om dette neste uke Postulere verktøy 1 og 2 er klart viktigst 20

Ulike referansetyper class Person { String ; int ; boolean {... Person pers; Student stud; pers stud Rollen Person class Student extends Person { String program; void byttprogram(string nytt){... program byttprogram() Objekt av klassen Student Og vi har igjen forskjellige roller = forskjellige briller Rollen Student 21

Ulike måter å se et objekt på Navn: stud Type: Student program byttprogram() Navn: pers Typen (klassen) til hele dette objektet er Student Type: Person Typen (klassen) til et objekt er uforanderlig. Et objekt kan likevel fremtre for oss på ulike måter Det kan spille forskjellige roller. Et objekt av klassen class Student extends Person {... kan vi se på som et objekt av typen (klassen) Person: da er egenskapene som er spesielle for Student ikke synlige (men de er der fortsatt!). Student: da er både Person- og Studentegenskapene synlige for oss. Det er referansens (pekerens) type som avgjør hvordan objektet fremtrer. (med untak av virtuelle metoder, som vi skal lære om neste uke) Student stud; Person pers; stud = new Student(); pers = stud; (Det er lov å skrive: pers = new Student(); 22

Eksempler class Person { String ; int ; boolean {... class Student extends Person { String program; void byttprogram(string nytt) {... Student s program byttprogram() Person p program byttprogram() Anta: Student s = new Student(); Person p = new Student(); Hvilke av følgende uttrykk er nå lovlige? s. = Ole-Morten";... s.; s.program = "Matte"; s.byttprogram("data"); p. = Ole-Ivar";... p.; p.program = "Matte"; p.byttprogram("data"); 23

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 24

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

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

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 objektet som pers peker på alle Student -egenskapene?) 27

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

Klassen Object class Object {... er alle klassers mor (alle klassers superklasse) D.v.s. at 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 en peker av klassen Object peke på et hvilket som helst objekt: Person pers = new Person(); Object obj = pers; Person pers2 = (Person)obj; Person pers2 Object obj Person pers Mer neste gang om hva som er inne i Object-delen av et objekt. 29

Klassehierarki: class Object - eksempel Object Object obj Bil Bil bl Personbil Personbil p Lastebil Drosje Drosje d 30

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 (++) 31

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

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 et på grensesnittet (og boksen?) kursiv. Norsk: Grensesnitt Engelsk: Interface 33

Arv fra grensesnitt til grensesnitt Nytt interface KanBjeffe{ void bjeff(); KanBjeffe 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; Svigermor NorskSvigermor 34

35 To (eller flere) grensesnitt = to (eller flere) roller KanBjeffe Utkledd Karnevalshund Denne figuren avspeiler interface -ene og class -en på neste siden Multippel arv

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; Multippel arv 36

Eller kanskje bedre: KanBjeffe En klasse kan bare ha én superklasse, men gjerne flere "super-grensesnitt" VanligHund Utkledd Karnevalshund Nytt (kanskje bedre hierarki) Denne figuren avspeiler interface -ene og class -ene på neste siden 37

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

Abstrakte metoder og klasser abstract class Ansatt { String ; double timelonn; abstract double beregnbonus(); Ikke lov å si new Ansatt()! Ansatt timelonn beregnbonus(); class Deltidsansatt extends Ansatt { double beregnbonus() { return 0; Deltidsansatt Heltidsansatt timelonn Heltidsansatt objekt beregnbonus(); ansiennitetsfaktor class Heltidsansatt extends Ansatt { int ansiennitetsfaktor; double beregnbonus() { return timelonn* ansiennitetsfaktor; beregnbonus() 39