Kapittel 7: Mer om arv



Like dokumenter
Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

Kapittel 9: Sortering og søking Kort versjon

Kapittel 7: Mer om arv

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

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

Kapittel 8: Sortering og søking

Kapittel 8: Sortering og søking INF100

Kapittel 8: Sortering og søking INF100

Kapittel 8: Programutvikling

INF1010 Arv. Marit Nybakken 2. februar 2004

Læringsmål for forelesningen

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

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

Kapittel 7: Mer om arv. Java som første programmeringsspråk

Kapittel 7: Mer om arv. Java som første programmeringsspråk

Kapittel 5: Objektkommunikasjon

INF1010 våren Arv og subklasser del 1

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

INF1010 våren Arv og subklasser - del 2

Kapittel 1: Datamaskiner og programmeringsspråk

INF1010 våren Arv og subklasser del 1

INF Seminaroppgaver til uke 3

INF1010 våren Arv og subklasser - del 2

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

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

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

Dagens tema: Mer av det dere trenger til del 1

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

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

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

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

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

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

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

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

INF1000 Metoder. Marit Nybakken 16. februar 2004

OPPGAVE 5b og 8b Java Kode

Introduksjon til objektorientert programmering

TDT4100 Objektorientert programmering

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

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

TOD063 Datastrukturer og algoritmer

Klasser, objekter, pekere og UML. INF gruppe 13

TDT4100 Objektorientert programmering

INF1010 våren Arv og subklasser - del 2

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øse reelle problemer

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

LO191D/LC191D Videregående programmering

Forelesning inf Java 5

Forelesning inf Java 5

LC191D/LO191D Videregående programmering mai 2010

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

UNIVERSITETET I OSLO

Kapittel 12: Rekursjon

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

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

EKSAMEN. Objektorientert programmering

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

J2EE. CMP Entity Beans, Transaksjoner, JSP

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

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

INF Notater. Veronika Heimsbakk 10. juni 2012

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

UNIVERSITETET I OSLO

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

INF1000: Forelesning 6. Klasser og objekter del 1

Generiske mekanismer i statisk typede programmeringsspråk

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

Kapittel 1: Datamaskiner og programmeringsspråk

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

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

Kapittel 3: Bruk av objekter

UNIVERSITETET I OSLO

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

ADT og OO programmering

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

NB!!! Veldig korte svar er gitt her. Disse burde det vært skrevet mer på ved en eksamen..

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 1 (pluss litt I/O og unntaksbehandling)

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

INF1010. Grensesnittet Comparable<T>

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

IN1010 V19, Obligatorisk oppgave 2

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

2 Om statiske variable/konstanter og statiske metoder.

Læringsmål for forelesningen

Eksamen. Objektorientert Programmering IGR 1372

Transkript:

Kapittel 7: Mer om arv Redigert av: Khalid Azim Mughal (khalid@ii.uib.no) Kilde: Java som første programmeringsspråk (3. utgave) Khalid Azim Mughal, Torill Hamre, Rolf W. Rasmussen Cappelen Akademisk Forlag, 2006. ISBN: 82-02-24554-0 http://www.ii.uib.no/~khalid/jfps3u/ (NB! Boken dekker opptil Java 6, men notatene er oppdatert til Java 7.) 12/7/2012 7: Mer om arv 7-1/25 Emneoversikt Programmering med arv: En superklasse med flere subklasser Polymorfisme og dynamisk metodeoppslag Bruk av polymorfe referanser Konsekvenser av polymorfisme Abstrakte klasser: Instansiering og arv Metodeoverkjøring Konkrete klasser Arv kontra aggregering Substitusjonsprinsippet - Liskov Kontrakter i Java: Abstrakte metoder Kontrakttype Multippel arv for kontrakter Kontrakter og polymorfe referanser Super- og subkontrakter JFPS3U 7: Mer om arv 7-2/25

Programmering med arv En superklasse har ofte flere subklasser, som deklarerer nye eller overskygger felt, og/eller overkjører instansmetoder for å oppfylle subklassens abstraksjon. AnsattV0 fornavn etternavn timelønn NORMAL_ARBEIDSUKE beregnukelønn() skrivtilstand() beregnovertid() TimebetaltArbeiderV0 beregnukelønn() ArbeidsLederV0 ledertillegg beregnukelønn() skrivtilstand() AkkordArbeiderV0 antallenheter prisperenhet beregnukelønn() skrivtilstand() JFPS3U 7: Mer om arv 7-3/25 Polymorfe referanser Hvilket objekt en referanse skal betegne under utføring kan ikke alltid avgjøres under kompilering. AnsattV0 enansatt; Scanner tastatur = new Scanner(System.in); System.out.println("Velg 1=ansatt, 2=timebetalt, 3=leder, 4=akkord:"); int valg = tastatur.nextint(); if (valg == 1) enansatt = new AnsattV0("Nils", "Nilsen", 150.0); else if (valg == 2) enansatt = new TimebetaltArbeiderV0("Jon", "Ås", 0); else if (valg == 3) enansatt = new ArbeidsLederV0("Ottar", "Boss", 350, 600); else if (valg == 4) enansatt = new AkkordArbeiderV0("Per", "Berg"); else enansatt = new AnsattV0("Ole", "Olsen", 125.50); // Hvilket objekt betegner enansatt ved utgangen av if-setningen? Kompilatoren kan ikke avgjøre hvilket objekt referansen enansatt vil betegne ved utgangen av if-setningen ovenfor. En polymorf referanse er en referanse som kan referere til objekter av forskjellige klasser til forskjellige tider. En referanse til en superklasse er polymorf siden den kan referere til objekter av alle subklasser til superklassen under utføring. JFPS3U 7: Mer om arv 7-4/25

Dynamisk metodeoppslag Når en metode blir påkalt på et objekt er det klassen til objektet (dvs. aktuell type) og metodens signatur som avgjør hvilken metodedefinisjon som blir utført. Typen til referansen (dvs. deklarert type) som betegner objektet er ikke relevant i denne sammenhengen. // Hvilket objekt betegner enansatt ved utgangen av if-setningen? System.out.println("Ukelønn=" + enansatt.beregnukelønn() // Hvilken beregnukelønn()-metode blir utført? ); enansatt.skrivtilstand(); // Og hvilken skrivtilstand()-metode blir utført her? Dynamisk metodeoppslag er prosessen som bestemmer hvilken metodedefinisjon metodesignaturen til kallet betegner under utføring, basert på klassen til objektet. Denne prosessen kan medføre søking oppover i arvhierarkiet for å finne metodedefinisjon. For det første kallet overnfor utføres beregnukelønn()-metoden i den klassen som objektet enansatt betegner tilhører. For det andre kallet blir skrivtilstand()-metoden i AnsattV0 utført, dersom objektet enansatt betegner tilhører AnsattV0- eller TimebetaltArbeiderV0- klassen. Eller utføres skrivtilstand() i en av de to andre subklassene, avhengig av om enansatt betegner en arbeidsleder eller en akkordarbeider. JFPS3U 7: Mer om arv 7-5/25 Bruk av polymorfe referanser class AnsattTabell { // Fra Program 7.4 static AnsattV0[] ansatttab = { // (1) new AnsattV0("Ole", "Brumm", 325.0), new TimebetaltArbeiderV0("Kari","Bø", 325.0), new AkkordArbeiderV0("Lasse", "Liten", 45.50, 126), new ArbeidsLederV0("Ottar", "Boss", 400.0, 500.0), ; static double[] ansatttimer = { 37.5, 25.0, 30.0, 45.0 ; // (2) public static void main(string[] args) { // Går gjennom alle ansatte og skriver utvalgte egenskaper for (int i=0; i<ansatttab.length; i++){ System.out.printf("Ansatt nr. %d: %s %s har en ukelønn på %.2f kroner%n", i+1, ansatttab[i].fornavn, // (3) ansatttab[i].etternavn, // (4) ansatttab[i].beregnukelønn(ansatttimer[i])); // (5) JFPS3U 7: Mer om arv 7-6/25

Utskrift fra kjøring: Ansatt nr. 1: Ole Brumm har en ukelønn på 12187,50 kroner Ansatt nr. 2: Kari Bø har en ukelønn på 8125,00 kroner Ansatt nr. 3: Lasse Liten har en ukelønn på 5733,00 kroner Ansatt nr. 4: Ottar Boss har en ukelønn på 21500,00 kroner JFPS3U 7: Mer om arv 7-7/25 Konsekvenser av polymorfisme Polymorfisme lar oss betegne ulike typer objekter med en felles (polymorf) referanse, så lenge disse objektene tilhører en av subklassene eller superklassen i et arvhierarki. Dynamisk metodeoppslag gjør at samme kall i koden kan resultere i at ulike metodeimplementasjoner blir utført under kjøring. Aktuell type bestemmer hvilken metode som blir utført. Klienter kan behandle super- og subklasseobjekter på samme måte, og trenger ikke endres selv om nye subklasser blir lagt til. Dermed blir utvikling og vedlikehold av klienter enklere. JFPS3U 7: Mer om arv 7-8/25

Kontrakter i Java En kontrakt i Java definerer et sett av tjenester - men uten å gi noen implementasjon. Kontrakten inneholder et sett av abstrakte metodedeklarasjoner. En abstrakt metode består av metodens navn, parameterliste og returtype men ingen implementasjon. Vi sier at en slik metode er abstrakt. Eksempel: interface IIdrettslagsMedlem { double beregnkontingent(); // Abstrakt metode Klasser som vil implementere en kontrakt må angi dette vha. nøkkelordet implements, f.eks. class Student implements IIdrettslagsMedlem { double beregnkontingent() { return 100.0; // andre metoder og felt og gir en implementasjon av kontraktens abstrakte metoder. JFPS3U 7: Mer om arv 7-9/25 Kontrakter i Java (forts.) En kontrakt er ikke en klasse - så vi kan ikke opprette objekter av en kontrakt. Men en kontrakt definerer en type - kontrakttypen - og vi kan deklarere referanser av denne typen, f.eks. IIdrettslagsMedlem enstudent; En referanse av en kontrakttype kan betegne objekter av alle klasser som implementerer kontrakten: class AnsattV0 implements IIdrettslagsMedlem { double beregnkontingent() { IIdrettslagsMedlem etmedlem; etmedlem = new AnsattV0("Ole", "Olsen", 125.0); etmedlem = new Student("Jens", "Jensen"); Med en kontrakttype-referanse kan vi derfor få utført alle tjenester som kontrakten definerer. JFPS3U 7: Mer om arv 7-10/25

Kontrakter i Java (forts.) En kontrakt kan også brukes til å importere delte konstanter. interface ViktigeKonstanter { int AVSLUTT = -1; int FORTSETT = 1; class ViktigKlasse implements ViktigeKonstanter { public int svar() { if (ferdig()) return AVSLUTT; // Kontraktnavn ikke nødvendig pga implements. else return FORTSETT; boolean ferdig() { Dersom klassen ViktigKlasse ikke hadde deklarert at den implementerte kontrakten ViktigeKonstanter, måtte den ha brukt punktumnotasjon, f.eks. ViktigeKonstanter.AVSLUTT, for å få fatt i konstantene. JFPS3U 7: Mer om arv 7-11/25 Kontrakter i Java (forts.) En klasse kan implementere flere kontrakter i Java. Dette kalles multippel arv for kontrakter. class ArbeidsLederV0 extends AnsattV0 implements IFagforeningsMedlem, ITillitsValgt { Klassen må da implementere alle abstrakte metoder fra samtlige kontrakter. En kontrakt B kan utvide en annen kontrakt A. Da kalles A en superkontrakt og B en subkontrakt. En klasse som implementerer B må implementere metodene fra både A og B. interface ITikk { void tikk(); interface ITikkTakk extends ITikk { void takk(); class Klokke implements ITikkTakk { void tikk() { // fra ITikk (superkontrakten) void takk() { // fra ITikkTakk (subkontrakten) JFPS3U 7: Mer om arv 7-12/25

Arvhierarki Object equals() tostring() getclass() Ding ding() Kling ding() dong() String length() substring() equals() Dong dong() class Dong extends Ding { Klang class Klang extends Kling { JFPS3U 7: Mer om arv 7-13/25 Bruk av kontrakter for å håndtere objekter av flere typer Lag en referanse type som kan betegne ting som har både dong()- og ding()-metoder. «kontrakt» DingDong ding() dong() Object equals() tostring() notify() Ding ding() Kling ding() dong() String length() substring() equals() Dong dong() Klang En variabel av type DingDong kan refererer til et Dong-, et Klingog et Klang-objekt, men ikke til et Ding-objekt. Arv Interface JFPS3U 7: Mer om arv 7-14/25

Bruk av kontrakter for å håndtere objekter av flere typer (forts.) interface DingDong { public void ding(); public void dong(); class Ding { public void ding() { System.out.println("ding fra Ding"); class Dong extends Ding implements DingDong { @Override public void dong() { System.out.println("dong fra Dong"); class Kling implements DingDong{ @Override public void dong() { System.out.println("dong fra Kling"); @Override public void ding() { System.out.println("ding fra Kling"); class Klang extends Kling { public void klang() { System.out.println("klang fra Klang"); JFPS3U 7: Mer om arv 7-15/25 public class TestInterface { public static void main(string[] args) { DingDong dingdonger[] = new DingDong[3]; // Oppretter tabell av referanser dingdonger[0] = new Dong(); // Initialiserer referansene dingdonger[1] = new Kling(); dingdonger[2] = new Klang(); for (int i = 0; i < dingdonger.length; i++) dingdonger[i].ding(); // Polymorfe referanser + dynamisk metodeoppslag Utskrift fra kjøring: ding fra Ding ding fra Kling ding fra Kling JFPS3U 7: Mer om arv 7-16/25

Oppsummering av kontrakter i Java En klasse må eksplisitt deklarere at den implementerer en kontrakt. Klassen (eller dens subklasser) må implementere metoder for abstrakte metoder spesifisert i kontrakten. Dersom en klasse implementerer en kontrakt, implementerer også alle dens subklasser den automatisk p.g.a. arv. Arv gjelder også for kontrakter: super- og subkontrakter. Kontrakter definerer en ny referanse type, og referanser av en kontrakttype er polymorfe. En klasse kan implementere flere kontrakter. En klasse som implementerer en subkontrakt må også implementere alle superkontraktens metoder. To varianter av arv: Design-arv: Multippel-kontrakt arv der objekter kan tilhøre mange typer (vha. kontrakter i Java). Implementasjonsarv: Enkel-implementasjonsarv der metode- og variabeloppslag er enklere (vha. subklasser i Java). Nesten alle fordeler av generell multippel arv uten alle implementasjonsvanskeligheter. JFPS3U 7: Mer om arv 7-17/25 Abstrakte klasser En abstrakt klasse er en klasse som det ikke kan opprettes objekter av. Abstrakte klasser kan brukes som en superklasse, som gjennom arv tvinger alle subklasser til å overholde en felles kontrakt. En abstrakt klasse kan implementere deler (eller hele) kontrakten. En Java-kontrakt derimot implementerer ingenting av kontrakten. En subklasse til en abstrakt klasse må implementere de abstrakte metodene i superklassen. Gjør subklassen ikke det, må den deklareres abstrakt. Klienter kan bruke referanser av den abstrakte klassen til å betegne subklasseobjekter, og vha. polymorfisme få utført riktige instansmetoder. Eksempel: Vi ønsker å gi rabatt på varer. Klassen VareMedRabatt blir abstrakt superklasse for alle rabatterte varer. Klassene Vare og VareMedEnhetspris gjenbrukes. Eksempel: Bruk av Template Method designmønster - en abstrakt klasse implementerer et felles rammeverk for oppførsel; subklasser må implementere de deler som er spesifikke for dem. JFPS3U 7: Mer om arv 7-18/25

Abstrakte klasser (forts.) Vare varenavn beholdning hentvarenavn() hentbeholdning() settvarenavn() settbeholdning() tostring() VareMedEnhetsPris enhetspris hentenhetspris() tostring() «abstrakt» VareMedRabatt finnrabatt() VareMedFastRabatt rabatt finnrabatt() tostring() VareMedProsentRabatt finnrabatt() tostring() JFPS3U 7: Mer om arv 7-19/25 Abstrakte klasser (forts.) public class Vare { // som tidligere public class VareMedEnhetspris extends Vare { // som tidligere public abstract class VareMedRabatt extends VareMedEnhetspris { VareMedRabatt(String varenavn, int beholdning, double pris) { super(varenavn, beholdning, pris); // kaller superklassens konstruktør abstract double finnrabatt(double prisutenrabatt, int antallbestilt); public class VareMedFastRabatt extends VareMedRabatt { private double rabatt; // fast rabatt i kroner VareMedFastRabatt(String varenavn, int beholdning, double pris, double rabatt) { super(varenavn, beholdning, pris); // kaller superklassens konstruktør this.rabatt = rabatt; @Override public double finnrabatt(double prisutenrabatt, int antallbestilt){return rabatt; @Override public String tostring() { // overkjører tostring() fra VareMedEnhetspris-klassen return super.tostring() + "\trabatt: " + rabatt; JFPS3U 7: Mer om arv 7-20/25

Abstrakte klasser (forts.) public class VareMedProsentRabatt extends VareMedRabatt { int rabattintervall; // antall varer som må selges for å få rabatt double prosentsats; // prosentsats rabatten økes med per intervall double maksimalsats; // maksimal rabattsats VareMedProsentRabatt(String varenavn, int beholdning, double pris, int rabattintervall, double prosentsats, double maksimalsats) { super(varenavn, beholdning, pris); // kaller superklassens konstruktør this.rabattintervall = rabattintervall; this.prosentsats = prosentsats; this.maksimalsats = maksimalsats; @Override public double finnrabatt(double prisutenrabatt, int antallbestilt) { int antallintervaller = antallbestilt / rabattintervall; double rabatt = antallintervaller * prosentsats; if (rabatt > maksimalsats) rabatt = maksimalsats; return rabatt/100.0*prisutenrabatt; @Override public String tostring() { // overkjører tostring() fra VareMedEnhetspris-klassen return super.tostring() + "\trabatt-intervall: " + rabattintervall + "\tprosentsats: " + prosentsats + "\tmaks.sats: " + maksimalsats; JFPS3U 7: Mer om arv 7-21/25 public class Utsalg { public static void main(string[] args) { VareMedEnhetspris[] varelager = { new VareMedEnhetspris("Coca cola 0.5l", 150, 20.0), new VareMedFastRabatt("Pepsi 0.5l", 100, 20, 0.50), new VareMedEnhetspris("Solo 0.5l", 50, 20.0), new VareMedFastRabatt("Farris 0.5l", 50, 20, 1.50), new VareMedProsentRabatt("Coca cola 0.33l", 500, 12, 10, 0.5, 10.0) ; int[] bestilling = { 50, 50, 10, 20, 250 ; double sum = 0; double rabatt = 0; double varepris, varerabatt; for (int i=0; i<varelager.length; i++) { varepris = varelager[i].hentenhetspris(); varerabatt = 0; if (varelager[i] instanceof VareMedRabatt) { VareMedRabatt vare = (VareMedRabatt) varelager[i]; varerabatt = vare.finnrabatt(varepris, bestilling[i]); varepris -= varerabatt; varerabatt *= bestilling[i]; // for hele ordren varepris *= bestilling[i]; // for hele ordren System.out.println("Pris for " + bestilling[i] + " stk. av varen '" JFPS3U 7: Mer om arv 7-22/25

+ varelager[i].hentvarenavn() +"' er " + varepris + " kr."); sum += varepris; rabatt += varerabatt; System.out.println("Total sum: " + sum + " kr."); System.out.println("Rabatt: " + rabatt + " kr er trukket fra."); Utskrift fra kjøring: Pris for 50 stk. av varen 'Coca cola 0.5l' er 1000.0 kr. Pris for 50 stk. av varen 'Pepsi 0.5l' er 975.0 kr. Pris for 10 stk. av varen 'Solo 0.5l' er 200.0 kr. Pris for 20 stk. av varen 'Farris 0.5l' er 370.0 kr. Pris for 250 stk. av varen 'Coca cola 0.33l' er 2700.0 kr. Total sum: 5245.0 kr. Rabatt: 355.00000000000006 kr er trukket fra. Merk at punktum brukes som desimaltegn av println()-metoden. Øvelse: formater utskriften med komma som desimaltegn vha. printf(). JFPS3U 7: Mer om arv 7-23/25 Arv kontra aggregering Arv tilbyr gjenbruk av klasser ved at nye klasser får tilgang til variabler og metoder fra superklassen (og alle superklasser lengre opp i arvhierarkiet). Aggregering tilbyr gjenbruk av klasser ved at nye klasser deklarerer sammensatte objekter der objekter av eksisterende klasser inngår som delobjekter. Arv brukes når: den nye klassen er en naturlig spesialisering av en eksisterende klasse. den eksisterende klassen kan utvides (dvs. ikke er en endelig klasse). Aggregering brukes når: den nye klassen representerer sammensatte objekter, og det allerede er deklarert klasser for delobjektene. en eksisterende klasse ikke kan utvides, derom den er endelig. Merk at aggregering tilbys som standard i Java, mens for arv må vi bruke nøkkelordet extends. JFPS3U 7: Mer om arv 7-24/25

Substitusjonsprinsippet - Liskov En referansetype kan være: et klassenavn et kontraktnavn en tabelltype Subtyper og supertyper: I arvhierarkiet, en referansetype kan ha en eller flere supertyper. Referansetypen er en subtype til hver av dens supertyper. Substitusjonsprinsippet: Subtypers atferd er i samsvar med spesifikasjon av deres supertyper, d.v.s. at et subtype-objekt kan substitueres for et supertype-objekt. JFPS3U 7: Mer om arv 7-25/25