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

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

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

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF1010 våren Arv og subklasser del 1

INF1010 våren Arv og subklasser del 1

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

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

INF1010, 8. mars Om klassehierarkier, grensesnitt (interface) og multippel arv. Konstruktører i subklasser. Unntak.

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

Abstrakte metoder og klasser

INF1010, 10. februar 2009, Konstruktører. Inst for Informatikk

Klasser, objekter, pekere og UML. INF gruppe 13

Kapittel 7: Mer om arv

2 Om statiske variable/konstanter og statiske metoder.

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

INF1010 våren Arv og subklasser - del 2

INF1000: Forelesning 7

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

Enkle generiske klasser i Java

INF1000: Forelesning 7. Konstruktører Static

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

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

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

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

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

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

Seminaroppgaver IN1010, uke 2

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

INF Seminaroppgaver til uke 3

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

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

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

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

INF1000: noen avsluttende ord

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

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

Læringsmål for forelesningen

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

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

2 Om statiske variable/konstanter og statiske metoder.

INF1000: Forelesning 6. Klasser og objekter del 1

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

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

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

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

UNIVERSITETET I OSLO

LC191D/LO191D Videregående programmering mai 2010

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

Velkommen til. INF våren 2016

Uke 7 - Objekter, klasser og pekere (+ litt først om args[])

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

Løsningsforslag til eksamen i INF1000 våren 2006

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

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

Semantisk Analyse del III

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

INF Notater. Veronika Heimsbakk 10. juni 2012

INF1000 Metoder. Marit Nybakken 16. februar 2004

UNIVERSITETET I OSLO

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

INF Uke 10. Ukesoppgaver oktober 2012

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

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

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Leksjon 4. Metoder. Program, klasse og metode

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

6108 Programmering i Java. Leksjon 4. Metoder. Roy M. Istad 2015

INF1010. Grensesnittet Comparable<T>

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

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

INF1000: Forelesning 4. Mer om arrayer Metoder

Leksjon 6. Objekt. Evt. importsetninger. public class Klasse { Konstruktør. Objektmetoder. Innkapsling (private): set-og get-metoder

INF våren 2017

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

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

2012 2a. C rc; void main() { rc = new C (); rc.m2(); } } INF 3110/ INF /28/13 1

Transkript:

Konstruktører 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 pekeren p. 2. Variablene x og y blir opprettet inne i objektet. 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 (en peker) til det nye objektet. 5. Tilordningen Punkt p = utføres, dvs p settes lik adressen til objektet. navn: p type: Punkt Punkt(int x0, int y0) { x = x0; y = y0; navn: x navn: y 3 4 type: int type: int Punkt(int x0, int y0) navn: x0 3 type: int x = x0; y = y0; navn: y0 4 type: int 1

Konstruktører og arv 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? B A bpeker A() B() B 2

Konstruktører og arv (forts.) 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 3

Kall på super-konstruktøren Superklassens konstruktør kan kalles fra en subklasse ved å si: - 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 programmet kompileres. Hvis en klasse ikke har noen konstruktør, legger Java inn en tom konstruktør med kallet 4

Eksempel 1 Anta at vi har følgende klasser: class Person { String fødselsnr; Person() { fødselsnr = 12034567890"; class Student extends Person { int studid; Student() {... Anta to konstruktører: Student() { studid = 0; eller: Student() { studid = 0; Disse to er helt ekvivalente! Hva skjer hvis Student ikke har noen konstruktør :? class Student extends Person { int studid = 0; Svar: det går bra 5

Eksempel 2 Her er fire forslag til konstruktører: Student() { studid = 0; Anta at vi har følgende klasser: class Person { String fødselsnr; Person(String fnr) { fødselsnr = fnr; class Student extends Person { int studid; Student() {... Student() { super( 12345"); studid = 0; Student(String nr){ super(nr); studid = 17; Student(String nr, int id){ super(nr); studid = id; Hvilke virker? Diskuter! 6

Eksempel 3 class Bygning { Bygning() { System.out.println("Bygning"); class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); Hva blir utskriften fra dette programmet? class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); 7

Når programmet kompileres class Bygning { Bygning() { System.out.println("Bygning"); // class Bygning class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); // class Bolighus Java føyer selv på super() i disse tre konstruktørene før programmet utføres class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk 8

Når programmet utføres 4. class Bygning { Bygning() { System.out.println("Bygning"); // class Bygning 5. class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); // class Bolighus Til Object sin konstruktør 3. 2. class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk Her starter eksekveringen 1. 9

Når programmet utføres (forts.) 7. Nå er Bygning skrevet ut 8. Nå er Bolighus skrevet ut 9. Nå er Blokk skrevet ut class Bygning { Bygning() { System.out.println("Bygning"); // class Bygning class Bolighus extends Bygning { Bolighus() { System.out.println("Bolighus"); // class Bolighus class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk 6. Tilbake fra Object sin konstruktør 10

Eksempel 4 class Bygning { Bygning() { System.out.println("Bygning"); Hva skjer i dette eksempelet? class Bolighus extends Bygning { Bolighus(int i) { System.out.println("Bolighus nr " + i); class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); Merk: Konstruktøren i klassen Bolighus har nå en parameter. public static void main(string[] args) { new Blokk(); 11

Når programmet kompileres class Bygning { Bygning() { System.out.println("Bygning"); // class Bygning Java legger igjen til kall på super() i alle konstruktørene. class Bolighus extends Bygning { Bolighus(int i) { System.out.println("Bolighus"); // class Bolighus class Blokk extends Bolighus { Blokk() { System.out.println("Blokk"); public static void main(string[] args) { new Blokk(); // class Blokk Men: Kallet matcher ikke metoden i antall parametre! Mulige løsninger: 1. Selv legge til kall på super, med argument, i kontruktøren Blokk. 2. Legge til en tom konstruktør i Bolighus. 12

Abstrakte metoder og klasser abstract class Ansatt { String navn; double timelonn; abstract double beregnbonus(); Ikke lov å si new Ansatt()! Ansatt navn timelonn beregnbonus(); class Deltidsansatt extends Ansatt { double beregnbonus() { return 0; Deltidsansatt Heltidsansatt navn timelonn Heltidsansatt objekt beregnbonus(); ansiennitetsfaktor class Heltidsansatt extends Ansatt { int ansiennitetsfaktor; double beregnbonus() { return timelonn* ansiennitetsfaktor; beregnbonus() Ellers helt som vanlige subklasser med polymorfi (virtuelle metoder) 13 13