You are on page 1of 55

Læringsmål for forelesningen

• Objektorientering
– Arv

• Java­programmering
– Arv i Java

• Eclipse
– Undersøke klassehierarki i Eclipse

1    
Arv (eng: inheritance)
• Er en fundamental OO­mekanisme
• Arv gir muligheten til definere nye klasser, 
basert på eksisterende
– vi kan utvide eksisterende klasser
– spesialisere eksisterende klasser

• En slik såkalt subklasse, arver alle 
egenskapene til superklassen
– instanser av subklassen vil inneholde alle felt og metoder (inkl. 
konstruktører) deklarert i både superklassen og subklassen
– alle grensesnitt arves, dvs. garanti for implementerte metoder
– alle public­ og protected­felt og ­metoder deklarerert i 
superklassen, kan refereres til i subklassens kode
2    
Hvorfor arv?
pattedyr
• Klassifisering i 
klassehierarkier er 
en intuitiv organisering  hovdyr rovdyr gnagere
av fenomener i verden
– hovdyr er et pattedyr
– katt og hund er et rovdyr er et pattedyr katter hunder
– gnager er et pattedyr

• Arv gir mulighet for gjenbruk av kode
• Forenkler strukturering av komplekse problemer og 
programmer 

• Mange mener at arv må støttes for at et programmeringsspråk skal 
være “ekte” objekt­orientert
3    
Exception­hierarki
Exception
RuntimeEx. IOEx.

FileNotFoundEx.

IllegalArgumentEx. NullPointerEx.

NumberFormatEx. IndexOutOfBoundsEx.

StringI.O.O.B.Ex. ArrayI.O.O.B.Ex.
4    
http://www.falkhausen.de/en/diagram/html/java.util.Collection.html  
5    
Lynkurs i arv Object
• Klasser struktureres 
i et hierarki, f.eks.  C2 C1
C1, C11, C12, C2, 
C21, C22
• Et objekt laget som  C21 C22 C11 C12
en instans av en 
klasse C, er  peker på superklassen
instanceof C 
og alle C sine  C21 c21 = new C21();
superklasser
c21 instanceof C2 = = true
6    
Typisk to typer bruk av arv
• Spesialisering av eksisterende klasse(r)
– noen har allerede laget en eller flere klasser i et hierarki, og vår 
subklasse skal spesialisere den som passer best
– eksempler:
• Exception/RuntimeException
• JComponent/JPanel

• Vi lager vårt eget klassehierarki, med tett 
koblede klasser
– superklasse Bok, subklasser Ordbok og Tegneseriealbum

7    
Spesialisering/subklassing av
eksisterende klasse(r)
• Utgangspunkt:
– Eksisterende klassehierarki
– Andre klasser som bruker klassene i hierarkiet på en 
veldefinert måte

• Eksempler:
– Object, +­operatoren og OutputStream/Writer­klassene
– Exception/RuntimeException og unntakssystemet
– JComponent/JPanel og Swing

8    
Object, +­operatoren og 
OutputStream/Writer­klassene
• Object
– implisitt superklassen til alle klasser
– definerer en del metoder, inkl. String toString(), som alle klasser forventer at finnes
• +­operatoren baserer seg på at toString­metoden kan 
brukes for å lage en tekstlig representasjon av et objekt
– ”hei” + obj betyr omtrent ”hei”.concat(obj.toString())
• OutputStream/Writer­klassene baserer seg på toString­
metoden
– når en skriver ut objekter, så vil toString­metoden bli brukt til å konvertere objektet 
til tekst

• Ved riktig redefinering av toString() så vil vår egen 
(Object­sub)klasse gli pent inn i Java sin objekt­til­tekst­
konverteringsmekanisme
9    
Redefinering av toString()
• public class Person {
private String name;
public String toString() {
return ”[Person ” + name + ”]”;
}
}
#1: Person
String toString() { ... }
Object­del
boolean equals(Object) { ... }
String toString() { ... }
Person­del
String name =

• Person har nå to toString()-metoder, men kun den i subklassen er


synlig utenifra
– en metode i en subklasse skygger for en metode med samme navn og parametre i superklassens
10 – subklassen kan referere til superklassens ved bruk av super.toString()
   
Exception/RuntimeException og 
unntakssystemet
• throw, catch og throws forventer en Exception­
instans
– throw new IllegalArgumentException(...)
– catch (IllegalArgumentException iae)
– throws IllegalArgumentException
• Viktig distinksjon mellom checked og unchecked 
exceptions:
– RuntimeException og subklassene er unchecked
– Exception og andre subklasser er checked
• Ved riktig bruk av subklassing (visse regler må 
overholdes) så vil vår egen (Runtime)Exception­
subklasse gli pent inn i Java sitt unntakssystem
11    
NameValidationException
• Person har en setName­metode og regler for 
hvilke tegn som tillates i et navn
• Hvis reglene ikke overholdes, så skal det kastes en 
ny type unntak: NameValidationException
• NameValidationException lagrer informasjon om 
det nye (ulovlige navnet) og Person­objektet

• Ved å subklasse riktig Exception­(sub)klasse, så 
vil vår klasse blir brukt av 
unntakshåndteringsmekanismen på ønsket måte
– checked eller unchecked
– riktig logiske klassifisering

12    
NameValidationException
• public class NameValidationException extends IllegalArgumentException {
private Person person;
private String illegalName;
public NameValidationException(Person person, String illegalName) {
this.person = person;
this.illegalName = illegalName;
}
public String getMessage() {
return illegalName + ” is an illegal name for ” + person;
}
}
#1: NameValidationException
Object ­del String toString() { ... }
String toString() { ... }
Ill.Arg.Exc. ­del
String getMessage() { ... }
String getMessage() { ... }
NameVal.Exc.­del Person person =
13   String name =  
Hierarchy­view
• Hvordan ser objektet vårt ut?

• Velg klassenavnet og trykk F4

#1: NameValidationException
Object ­del String toString() { ... }
String toString() { ... }
Ill.Arg.Exc. ­del
String getMessage() { ... }
String getMessage() { ... }
NameVal.Exc.­del Person person =
String name =
14    
Sekvensdiagram
#1: NameValidationException

1: toString() // Throwable sin metode

1.1: getLocalizedMessage() // Throwable sin metode

1.1.1: getMessage() // NameValidationException sin metode

• Ved å redefinere riktig metode kan vi skyte vår egen 
kode inn i en kallsekvens på strategisk riktig sted
• Dette krever at vi forstår hvordan superklassen bruker 
sine egne metoder
15    
JComponent/JPanel og Swing
• JComponent er en generell GUI­element­klasse
• JComponent har en del paint­metoder som kalles 
av Swing for å tegne innholdet i GUI­elementet
– public void paint(Graphic g) kaller
• protected void paintBorder(Graphics g)
• protected void paintComponent(Graphics g)
• protected void paintChildren(Graphics g)

• Med subklassing og redefinering av riktig paint­
metode så kan vi lage våre egne GUI­elementer

16    
Sekvensdiagram
#1: JComponent

1: paint()

paint kaller
1.1: paintComponent
­ paintComponent 
1.2: paintBorder ­ paintBorder
­ paintChildren
1.3: paintChildren

• paintComponent er den som er ”riktigst” å redefinere, 
siden paint gjør viktig håndtering av Graphics­objektet 
og paintBorder ikke trenger å endres på. 
17    
Redefinering av metoder i Eclipse

18    
MyComponent, alt. 1
• liste av firkanter, som tegnes i en løkke

19    
MyComponent, alt. 2
• liste av firkanter, som tegnes i en løkke
• utnytter at
– Graphics­argumentet alltid er en Graphics2D, som kan litt mer
– En Rectangle er en Shape, som kan brukes som argument til 
Graphics2D sin draw­metode

20    
Eget klassehierarki,
med tett koblede klasser
• En bok har en tittel

• Ordbøker og tegneseriealbum er bøker
– Bok er et generelt begrep, med sine felter
– En ordbok er en spesiell type bok
• lar Ordbok­klassen arve egenskaper fra Bok­klassen
• definerer i tillegg feltet antallOrd
– Et tegneseriealbum er også en bok
• lar Tegneseriealbum­klassen arve egenskaper fra Bok­klassen
• definerer i tillegg feltet antallStriper

21    
Ordbok og Tegneseriealbum
arver fra Bok
• Ordbok
– extends Bok, arver
dermed tittel­feltet
– definerer også eget antallOrd­felt

• Tegneseriealbum
– extends Bok,
arver dermed
tittel­feltet
– definerer også eget antallStriper­felt
22    
Definere
subklasse
• Ny klasse
Ordbok
• Bok er
superclass

• Legger til
23  
extends Bok  
Begreper knyttet til arv 
• Vi sier at Bok er superklassen til Ordbok og 
Tegneseriealbum, mens Ordbok og 
Tegneseriealbum er subklasser av Bok
• Ordbok og Tegneseriealbum er 
spesialiseringer av Bok Bok

• Bok er en generalisering String tittel

av Ordbok og
Tegneseriealbum Ordbok Tegneseriealbum
int antallOrd int antallStriper
24    
Instanser og klassetilhørighet
• Et objekt instansieres av én 
bestemt klasse #1: Bok

• Objektet har alle egenskaper  tittel = ”Sofies verden”

definert i denne klassen og  #2: Ordbok

(alle) dens superklasse(r) tittel = ”Riksmålsordboken”


antallOrd = 32768
– #1 er en Bok og har feltet tittel
– #2 er en Ordbok og har Ordbok­del
feltene tittel og antallOrd Bok­del
#2:
– #3 er et Tegneseriealbum og har Tegneseriealbum
feltene tittel og  tittel = ”Flat firer”
antallStriper
Tegneseriealbum­del antallStriper = 128
25    
Instanser og klassetilhørighet
• Vi kan si at et objekt også er en X, 
dersom X er (en av) superklassen(e)
– #1 er Bok, #2 er både Ordbok og Bok og #1: Bok
#3 er både Tegneseriealbum og Bok tittel = ”Sofies verden”
• Arving av egenskaper
sikrer at Ordbok­objekter og #2: Ordbok

Tegneseriealbum
tittel = ”Riksmålsordboken”
antallOrd = 32768

for alle praktiske formål Ordbok­del
er Bok­objekter
#2:
Bok­del Tegneseriealbum
tittel = ”Flat firer”

26
Tegneseriealbum­del antallStriper = 128
   
Instanser i Eclipse
• Sette
breakpoint
• Kjøre i
debug­modus

• Bok­subklasser har tittel­
felt og felt
definert i egen klasse
27    
Arv av metoder (1)
• En subklasse arver alle egenskaper til 
superklassen
– felter
– vanlige metoder
– konstruktører arves ikke direkte,
men kan brukes av subklassens konstruktør

• Metodene som arves fra en superklasse, kan 
kun bruke felt som er definert i 
superklassen
– f.eks. vil get­ og set­metoder i Bok virke som før,
de leser og setter felter i Bok­delen av en Ordbok
28    
Arv av metoder (2)
• Flere metoder vi har brukt er egentlig arvet
– toString­metoden, som alle objekter har, er egentlig arvet fra 
java.lang.Object
– assertXXX­metodene, som en finner i JUnit­testene til 
JExercise, er arvet fra TestCase­klassen i JUnit­rammeverket

• Dersom en definerer samme metode i en 
subklasse, vil denne brukes istedenfor den i 
superklassen, jfr. egendefinerte toString­
metoder
• Vi sier at en metode som er redefinert i en 
subklasse, skygger for den i superklassen
29    
Arving og redefinering
av toString­metoden

Run

• Redefinerer toString i Bok­klassen:
Run

• Redefinerer toString i Ordbok­klassen:

Run
30    
Typer, referanser og instanser (1)
• To måter å tenke på typer og variabler, 
parametre, felter og returverdier
– Typen garanterer hva objektet den refererer til har av 
egenskaper
– Typen begrenser hva slags objekt den kan ha som verdi

• Typen til en variabel/felt avgjør hvilke felt og 
metoder det er tillatt å bruke
– Dersom bokaMi er deklarert som Bok,
vil bokaMi.tittel være lov, men ikke bok.antallStriper,
selv om bokaMi faktisk refererer til en Tegneseriealbum­instans

31    
Typer, referanser og instanser (2)
• For å kunne garantere at et objekt har de nødvendige 
egenskapene, må en også begrense hva en variabel/felt 
kan referere til
– Dersom bokaMi er deklarert som Ordbok, kan den ikke referere til (dvs. 
tilordnes) et objekt som kun er en Bok.
• En variabel/felt deklarert av type X kan referere til 
objekter av type Y, dersom Y er X eller subklasse av X
– En Bok­variabel/felt kan referere til Bok­, Ordbok­ og Tegneseriealbum­objekter, 
mens en Object­variabel/felt kan referere til alle type objekter!
• Siden Y har arvet alle egenskapene til X,
sikrer det at Y har de garanterte evnene
– En Ordbok­instans kan for alle praktiske formål brukes som en Bok­instans, siden 
alle Ordbok­instanser har alle Bok­egenskapene

32    
Typer, referanser og instanser (3)
• instanceof­operatoren (<objekt> instanceof 
<klasse>) sjekker om <objekt> er av en bestemt klasse, 
uavhengig av typen til <objekt>­uttrykket
• Tabellen viser hvilke objekter som gir true for hvilke 
typer:
– Object o1 = new Bok();
– Object o2 = new Ordbok();
– Object o3 = new Tegneseriealbum();

instanceof o1: o2: o3:


Bok Ordbok Tegneserie
instanceof Object ? ? ?
instanceof Bok ? ? ?
instanceof Ordbok ? ? ?
instanceof Tegneseriealbum ? ? ?
33    
Typer, referanser og instanser (3)
• instanceof­operatoren (<objekt> instanceof 
<klasse>) sjekker om <objekt> er av en bestemt klasse, 
uavhengig av typen til <objekt>­uttrykket
• Tabellen viser hvilke objekter som gir true for hvilke 
typer:
– Object o1 = new Bok();
– Object o2 = new Ordbok();
– Object o3 = new Tegneseriealbum();

instanceof o1: o2: o3:


Bok Ordbok Tegneserie
instanceof Object true true true
instanceof Bok true true true
instanceof Ordbok false true false
instanceof Tegneseriealbum false false true
34    
instanceof og casting
• instanceof brukes typisk for å sjekke at bruk av et objekts spesifikke 
felter og metoder er lov:

– Bok bok = new Ordbok();


...
if (bok instanceof Ordbok) {
System.out.println(bok.getAntallOrd());
}

• Vi vet at koden er logisk grei, men det er likevel ikke lov, siden typen til 
bok fortsatt ikke kan garantere at objektet har getAntallOrd­metoden
• Etter å ha testet typen til et objekt, må vi bruke ”casting” for å garantere 
overfor Java at objektet har den nødvendige typen, før egenskapen brukes:

• if (bok instanceof Ordbok) {


System.out.println(((Ordbok)bok).getAntallOrd());
}

35    
instanceof og casting
• Casting tvinger Java til å akseptere at en 
objekt(referanse) er av annen (mer 
spesialisert) type enn deklarasjonen 
garanterer
– Casting til subklasse kalles downcasting, som er det mest vanlige
– Casting til superklasse kalles upcasting, som en sjelden gang kan 
være nyttig
• objekt kan castes til X dersom objekt
instanceof X er true, ellers får en 
ClassCastException
36    
Hva vil det altså si å arve?
• En klasse definerer egenskaper, i form av 
felter og metoder, som instansene vil få
• Ved arving/subklassing vil alle 
egenskapene definert i superklassen også 
gjelde for subklassen
• Ekstra egenskaper definert i subklassen 
legges til de som er definert i superklassen

37    
Hva med innkapsling?

• Innkapslingsprinsippet gjelder fortsatt.
• En ny synlighetsmodifikator: 
protected 
innføres for å definere hvilke 
egenskaper i superklassen som blir 
synlige i subklassene

38    
Synlighet av arvede egenskaper
• Arv krever introduksjon av en ny grad av 
synlighet, mellom public og private
• Egenskaper markert som protected i en 
superklasse er synlige kun i subklassene
– felter markert med protected kan både leses og endres i 
subklassen
– metoder markert med protected kan både kalles og redefineres 
i subklassen
• Merk forskjellen mellom
synlighet og eksistens:
– et private­felt er ikke synlig i subklassens kode, men finnes fortsatt
– en private­metode er ikke synlig i subklassens kode, men finnes 
fortsatt og kan kalles indirekte via synlig metoder
39    
Synlighet av arvede egenskaper

• NB! protected­egenskaper skaper 
en tettere og ofte uønsket binding 
mellom super­ og subklasser
– protected skal brukes i tilfeller hvor direkte tilgang 
til superklassens egenskaper er nødvendig
– metoder som det er meningen/naturlig at skal 
redefineres i subklasser bør markeres som 
protected
– felter bør kun i nødsfall markeres som protected
40    
Innkapsling og arv
klasse
Methods Data

Client, med
tilgang til  Egenskaper markert med protected
public­ er synlig i subklassen
metoder
subklasse
Methods Data

41    
Mer om redefinering av metoder
 (eng: overriding) 
• Ved subklassing arves både felter og metoder.

• Arv av metoder gjør det mulig å bruke superklassens 
metoder på instanser av en subklasse
– toString­metoden definert i Object kan brukes på alle instanser av alle klasser
– getTittel­metoden definert i Bok kan brukes på alle Ordbok­instanser

• Dersom en ønsker å erstatte en arvet metode med en egen 
implementasjon, defineres bare en metode med samme 
synlighet, returverdi og parameter i subklassen
– Bok kan definere en alternativ toString­metode med signaturen
public String toString(), som setter sammen relevante Bok­felter

42    
Redefinering av metoder
• Redefinerte metoder skygger for arvede, slik at metoden 
definert i subklassen kalles istedenfor den i superklassen
– Bok sin toString­metode blir brukt istedenfor den som er arvet fra Object

• Hvilken metode som kalles er avhengig av klassen som 
objektet er laget av, ikke typen til referansen
– Ordbok ordbok = new Ordbok();
// kaller toString-metoden definert i Ordbok
System.out.println(ordbok);
Bok bok = ordbok;
// kaller fortsatt toString-metoden definert i Ordbok
System.out.println(bok);
Object objekt = bok;
// kaller fortsatt toString-metoden definert i Ordbok
System.out.println(objekt);
43    
Redefinering av metoder

• Det er det faktiske objektet som avgjør 
hvilken metode som velges, ikke typen 
til uttrykket, men typen til uttrykket 
begrenser hvilke metoder som kan 
brukes
• Skygging av metoder kan imidlertid 
være problematisk...
44    
Legger til valideringskode i Bok 
sin setTittel­metode
• Sjekker om tittelen inneholder ulovlige bokstaver

• Det er viktig at subklasser ikke omgår denne 
sjekken, men er med på å sikre at reglene for Bok 
sin oppførsel følges
45    
Oppgave: Definer en alternativ 
setTittel­metode for Ordbok, som 
sikrer at tittelen til en Ordbok slutter 
på ”ordbok”
Sjekker om tittel slutter på 
”ordbok” og i tilfelle ikke, legger 
til ”ordbok”
46    
Alternativ setTittel­metode
• Redefinerer setTittel i Ordbok­klassen:
– samme signatur som
setTittel i Bok­klassen
– sjekker endelsen og legger
evt. til ”ordbok”­endelsen

• To problemer:
– tittel­feltet må være protected og ikke private, for at 
Ordbok sin setTittel­metode skal kunne endre tittel­feltet
– Bok sin setTittel­metode inneholder egen valideringskode, som 
burde vært duplisert i Ordbok sin setTittel­metode

• Forslag til løsning?
47    
Ved redefinering av en
metode i en subklasse,
hadde det vært fint å kunne bruke 
superklassen sin metode, slik at en 
slipper å duplisere kode (og logikk)

Java gir oss muligheten til å kalle 
metoder i superklassen fra en 
subklasse, selv disse er redefinert i 
subklassen

48    
super.<metode>(...)­
konstruksjonen
• Med super som prefiks kan en kalle en
metode i superklassen,
selv om denne er
redefinert i subklassen!
• Dette løser begge våre problemer
– vi kan deklarere tittel­feltet som private, siden vi kan sette den vha. 
Bok (altså superklassen) sin setTittel­metode
– vi kan kalle Bok sin setTittel­metode med en evt. endret tittel, og være 
sikker på at denne valideres iht. Bok sine egne regler
• Merk at super.<metode>(...)
– kan kalles fra alle metoder i subklassen, ikke bare fra <metode>
– kun kan brukes for å kalle metoder definert i den direkte superklassen, og 
ikke metoder i super­superklassen

49
• this­referansen vil være den samme
   
super gjør det mulig å (gjen)bruke 
superklassens metoder, selv om de 
redefineres i subklassen
#1: Ordbok
Det er som om Ordbok består  super­ ...
av én Bok­ eller super­del og  del
void setTittel(String)
én egen Ordbok­del, og super  super
gir mulighet til å referere til  egen ...
metoder i super­delen del void setTittel(String)

50    
Redefinering av konstruktører
• En konstruktør er en spesiell metode som kalles ifm. 
initialisering av en nyopprettet instans.
• super(...) MÅ brukes for å kalle superklassens 
konstruktør, slik at en sikrer at også super­delen blir riktig 
og skikkelig initialisert.
• super(...) MÅ stå først i konstruktøren, for å sikre at 
superklassens felter initialiseres før subklassens!

• I Bok­klassen:
– initialiserer tittel­feltet
• I Ordbok­klassen:
– kaller superklassen sin konstruktør
– initialiserer antallOrd­feltet
– alternativt kunne en fjernet antallOrd­parametret og initialiseringen av det,
men konstruktøren MÅ defineres
51    
Kallsekvens

• main­metode
– lager en Ordbok­instans og endrer tittelen

52    
Redefinering vs. overlasting
(overriding vs. overloading)
• Redefinering
– Metoder med like parameterlister (og returtyper) i ulike super­ og 
subklasser
– Hvilken faktisk instans metoden kalles på, avgjør hvilken metode som 
kalles
– Metoden som kalles avgjøres dynamisk ved utførelsen
• Overlasting
– Metoder med ulike parameterlister (antall og type), som ikke har annet 
felles enn navnet.
– Hvilken metode(variant) som kalles, avgjøres av den deklarerte typen til 
parametrene
– Metoden som kalles avgjøres statisk ved kompilering
• Ved kombinasjon av overlasting og redefinering
– først brukes de deklarerte typene til parameterlista tilsvarende overlasting
– deretter kalles den mest spesifikke metoden på instansen
53    
Konstruktører kan også 
overlastes
• Flere konstuktører med ulike parameterlister kan defineres
• En konstruktør kan kalle en annen definert i samme klasse 
med this(...)

• this(...)­konstruksjonen
er analogt med bruk av
super(...):
Den navnløse
konstruktørmetoden i egen (this) eller
superklassen (super) kalles

• NB! Dersom en konstruktør må kalle en annen, må dette 
skje i første linje!!!
54    
Læringsmål for forelesningen

• Objektorientering
– Arv

• Java­programmering
– Arv i Java

• Eclipse
– Undersøke instanser i Eclipse

55    

You might also like