Selve objektet versus referencen til objektet Nedarvning

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

07 – Kort om OO Introduktion.
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
NetBeans Installation og brug.
Grundlæggende programmering Efterår 2001
Objektorienteret programmering
09 – Arv og polymorfi i java
Hvordan man skriver koden.
VOOP, 8 april Refleksion i objekt orienterede programmeringssprog Mandag 8/ Kasper Østerbye.
Arv Idéen i arv et at kunne genbruge gennem generalisering
FEN IntroJava AAU1 Opsamling: afvikling af Java-programmer Input fra keyboard og fil Fra en prompt Fra BlueJ Fra NetBeans.
Objektorienteret programmering
FEN IntroJava AAU1 Java grundelementer Variable og datatyper Sætninger og udtryk Metoder.
Grundlæggende elementer i UML
Indledende Programmering Uge 8 - Efterår 2006 Mere om abstraktioner Susanne Lindros.
To måder at overføre objekt- referencer mellem processer (1) Via naming service - interface RMISolver (2) Som parametre til fjernprocedurekald - interface.
Fundamentale datastrukturer
Mønstre En lille introduktion. Singleton Tilgå et objekt igennem klassereference i stedet for objektreference.  Overflødiggør referencer til objektet.
Eksempel på realisering af domænemodel
GP 8, 24/ Grundlæggende programmering Efterår 2001 Forelæsning 8 onsdag 24/ kl. 9:15 – 12:00.
Objekter og klasser Rasmus D. Lehrmann DM
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
Comparable Students German Students Composite Pattern State Pattern Observer Pattern Collections Interfaces Abstrakte klasser Design Patterns.
GP7, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 7 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
FEN IntroJava AAU1 Endnu mere om Klasser og Objekter Mange til mange relationer Student-Course v3.
KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
Længste plateau En klassisk problemstilling (Gries, 1981) - og her i Java!!! Denne opgave drejer sig om at bestemme længden af det længste plateau i en.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
Begreber og Redskaber 11. Plan for idag Lidt afrunding: Collections Framework i Java Noget om oversættere og sprog Evaluering Sidste gang øvelser før.
Identitet vs lighed. Spørgsmål Hvad udskriver run metoden? 1.”Ens!” 2.”Forskellige!” 3.Ved ikke public class Driver{ public static void run(){ String.
Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt.
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6B.1 Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence.
DAIMIIntroducerende Objektorienteret Programmering1 Polymorfi og nedarvning Motivation for arv og “mange former”
 1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
 Jens Bennedsen 2001Multimedie programmering10A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
DAIMIIntroducerende objektorienteret programmering4B.1 Typer og tilstand i Java Typer, tilstand, erklæring, variable, primitive datatyper, reference- og.
Klasser og objekter. dIntProg, E08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
DAIMIIntroducerende objektorienteret programmering3B.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Henrik B. Christensen, 1999Introducerende objektorienteret programmering8B.1 Interfaces En ren kontrakt.
 Jens Bennedsen, 2003Introducerende objektorienteret programmeringinterfaces.1 Interfaces En ren kontrakt.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
DAIMIIntroducerende objektorienteret programmering4B.1 Grundlæggende og Reference Typer i Java Typer, tilstand, erklæring, reference- og værdi semantik,
Klassehierarkier Specialisering vha. subklasser. dIntProg, E05Klassehierarkier.2 Oversigt Eksempler på specialisering –Aktør, Koreograf, Skuespiller,
Indledende Programmering Uge 6 - Efterår 2006
Interfaces Afkobling af programkomponenter (eksempel: Comparable)
Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type.
Objektorienteret analyse og design Ó Bennedsen 2001 Design - part Programmering og systemudvikling Lektion 7 Design - part 2.
Kari Rye Schougaard, Ph.d.-stud. Værktøjer og Teknikker, 2006 A A R H U S U N I V E R S I T E T DATALOGISK INSTITUT Java på 20 minutter (eller lidt mere)
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
DAIMIIntroducerende Objektorienteret Programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
Klasser og objekter – grundbegreber.  Michael E. Caspersen, 2001Introducerende objektorienteret programmeringKlasser og objekter.2 Klasser og objekter.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Interfaces – hvorfor, hvad og hvordan?.  Michael E. Caspersen 2003IOOPInterfaces.2 Oversigt Interfaces, hvorfor –Separering af specifikation (interface)
 Jens Bennedsen 2001Multimedie programmering10B.1 Interfaces En ren kontrakt.
Jesper Mosegaard Multimedie Programmering E2003 MMProg uge46 Ancestor.
 Jens Bennedsen 2001Multimedie programmering4.1 Definition af begreber Interface, implements, klasse.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation,
Klasser og objekter. dIntProg, F08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
DAIMIIntroducerende Objektorienteret Programmering8B.1 Interfaces En ren kontrakt.
I o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5C.1 Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence.
Forelæsning Uge 6 – Mandag
Forelæsning Uge 12 – Torsdag
Præsentationens transcript:

Selve objektet versus referencen til objektet Nedarvning Objekter, Klasser, Polymorfi Opsamling GP fredag den 7. november 2003 kl. 9 – 9.45 Oversigt Klasse versus objekt Klassehierarkier Selve objektet versus referencen til objektet Nedarvning Overskrivning af metoder Polymorfi Abstrakte klasser Interfaces toString() og equals()

Klasse versus Objekt En klasse repræsenterer et begreb: tidspunkt, aftale, køretøj, bil, cykel, dyr, ko, person, beholder, tønde… Et objekt repræsenterer en ting, en instans af et begreb: et bestemt tidspunkt, en bestemt bil, en bestemt cykel, en bestemt ko, en bestemt person… Klasse Objekt Hest hest1:Hest :Hest

Klassehierarkier Nogle begreber er beslægtede (f.eks. køretøj, bil og cykel; eller dyr og ko; eller beholder og tønde). Det er naturligt at forsøge at ordne begreberne i hierarkier: dyr kan opdeles i ’pattedyr’, ’fisk’, ’fugl’… køretøj kan opdeles i ’bil’, ’cykel’, ’lastvogn’… beholder kan opdeles i ’tønde’, ’tank’, ’trug’… Vi forsøger ofte at beskrive verden ved hjælp af begrebshierarkier. I Java og mange andre objektorienterede programmeringssprog modellerer man ved hjælp af klassehierarkier. En klasse B kan udvide en eksisterende klasse A. Klassen A er superklasse til B, og B er subklasse til A.

Eksempel på klassehierarki (tegnet i UML)

Selve Objektet versus Referencen til Objektet Klasser fungerer som skabeloner for objekter. Man siger, at objektet har (eller hører til) en bestemt klasse Referencer er også defineret ved en klasse. Man siger at referencen har en type ved navn klassenavn. I Java kan vi oprette objekter med et udtryk, der består af følgende led: referencetype referencenavn = new objekttype ([argumenter]); En reference af typen T kan pege på objekter hørende til klassen T og dens subklasser. F.eks. Hest hest1 = new Hest(); I dette tilfælde er både referencetype og objekttype den samme – nemlig Hest hest1:Hest :Hest

Men vi kunne også have valgt at lade hest1 være en araber hest: Hest hest1 = new Araber(); Nu er objektet af typen Araber, men referencen er stadig af type Hest. :Araber hest1:Hest

Vi kunne såmænd også lade referencen være af typen Dyr: Dyr hest1 = new Araber(); Nu er objektet stadig af typen Araber, men referencen er af typen Dyr. :Araber hest1:Dyr

Opgaver – objekter og referencer Er følgende initialiseringer lovlige: Araber h1 = new Hest(); Hest h1 = new Araber(); Fisk f1 = new Dyr(); Dyr d1 = new Pattedyr(); Dyr d2 = new Hest(); Dyr d3 = new Islænder();

En subklasse arver felter og metoder fra sin superklasse. Nedarvning En subklasse arver felter og metoder fra sin superklasse. En subklasse kan derudover definere nye felter og metoder, eller omdefinere (overskrive) nedarvede metoder – det er grundlaget for polymorfi. private metoder og felter: Hvis et felt (eller en metode) er private i en superklasse A, så kan det ikke benyttes i subklasser af A.Feltet arves dog alligvel: det findes i subklassens objekter. Ellers ville det jo ikke kunne benyttes i metoder, der arves fra superklassen. Arves konstruktorer? Nej, konstruktorer arves ikke. Men det første en subklasses konstruktor gør, er at kalde en konstruktor for superklassen. Dette kan gøres eksplicit med et kald af formen super(…). Hvis ikke det gøres eksplicit, så underforstås et kald super() til en argumentløs konstruktor. I det tilfælde er superklassen altså nødt til at have en argumentløs konstruktor. Sådan en findes automatisk, hvis man ikke definerer andre konstruktorer. Overskrives felter? Nej. Hvis subklassen erklærer et felt f som også findes i superklassen, så får man to felter med samme navn. Det er næsten altid forkert og resulterer i forvirring og hovedbrud. Omdefinér kun metoder, ikke felter. (Feltet arvet fra superklassen kan dog tilgås som super.f, mens subklassens felt blot hedder f).

Overskrivning af metoder En subklasse kan omdefinere en metode, der ellers ville blive arvet fra en superklasse. I mit bearbejdede dyre-hierarki har jeg givet Dyr en metode: lavKaldeLyd(). Alle klasser, der nedarver fra Dyr, arver denne lavKaldeLyd() metoden, hvis ikke de overskriver den. Araber og Islænder arver dog metodeimplementationen fra Hest. Hest-klassen har jeg udvidet en del. Jeg har bestemt, at en hest i mit program altid skal have et navn, og derfor har den fået sit eget klassefelt, navn. Det har den konsekvens, at Hest har fået en konstruktor med en parameter. Derudover har Hest-klassen sin egen metode, stejl().

Bearbejdet dyrehierarki

class Dyr{ public void lavKaldeLyd(){ System.out.println(”Dyrelyd”); } class Fugl extends Dyr{ System.out.println("Pip"); class Fisk extends Dyr{ System.out.println("Glob"); class Pattedyr extends Dyr{ class Ko extends Pattedyr{ System.out.println("Muh"); class Hest extends Pattedyr{ public String navn; public Hest(String n){ navn = n; } public void lavKaldeLyd(){ System.out.println("Vrinsk"); public void stejl(){ System.out.println(”Stejler"); class Araber extends Hest{ public Araber(String n){ super(n); class Islænder extends Hest{ public Islænder(String n){

Polymorfi Når man kalder en metode på et objekt, er det objektets klasse, der bestemmer hvilken metode, der kaldes, men det er referencens type, der afgør om man må kalde metoden. Altså givet følgende udtryk: Dyr d1 = new Hest(”Sally”); er det lovligt at skrive: d1.lavKaldeLyd(); hvorved implementationen af lavKaldeLyd() fra Hest klassen eksekveres. Mens d1.stejl(); ikke er lovligt selvom metoden findes i Hest-klassen. Det skyldes at den ikke findes i Dyr-klassen.

Test af Dyre hierarkiet public class PolymorfiTest{ public static void main(String[] args){ Dyr[] zoo = new Dyr[5]; Dyr ko1 = new Ko(); Dyr fugl1 = new Fugl(); Dyr fisk1 = new Fisk(); Dyr hest1 = new Hest("Beauty"); Dyr hest2 = new Hest("Plet"); zoo[0] = ko1; zoo[1] = fugl1; zoo[2] = fisk1; zoo[3] = hest1; zoo[4] = hest2; for(int i = 0; i < zoo.length; i++){ zoo[i].lavKaldeLyd(); } Bemærk at det kun er muligt at samle objekter af typen Ko, Fugl, Fisk og Hest i et Array fordi der er en fælles supertype. Output: Muh Pip Glob Vrinsk

Opgaver - polymorfi Givet følgende objekter: Dyr d1 = new Fugl(); h1 a1 :Fugl +lavKaldeLyd() :Hest +navn:String +lavKaldeLyd() +stejl() :Araber +navn:String +lavKaldeLyd() +stejl() :Araber +navn:String +lavKaldeLyd() +stejl() Givet følgende objekter: Er det da lovligt at skrive: Dyr d1 = new Fugl(); Dyr d2 = new Hest(”Klaus”); Hest h1 = new Araber(”Storm”); Araber a1 = new Araber(”Sheik”); d1.lavKaldeLyd() d2.stejl() h1.stejl() a1.stejl() d2.navn h1.navn a1.navn

En abstrakt klasse kan ikke instantieres. Abstrakte klasser En klasse kan erklæres abstrakt. Så modellerer den typisk et abstrakt begreb. En abstrakt klasse kan have abstrakte metoder (– den kan også have konkrete metoder). En abstrakt klasse kan ikke instantieres. I mit dyre hierarki kunne jeg lade Dyr være en abstrakt klasse. Hermed siger jeg, at et Dyr ikke bare kan være et Dyr, men skal være et mere specifikt Dyr – nemlig en subklasse af Dyr. Jeg kunne også lade lavKaldeLyd() være en abstrakt metode. Så skal alle subklasser overskrive denne abstrakte metode eller selv være abstrakt. abstract class Dyr{ abstract void lavKaldeLyd(); }

Interfaces (Klassegrænseflader) I visse objektorienterede sprog kan en klasse have flere superklasser. Det kan føre til teoretiske og praktiske problemer. (Eks: I hvilken rækkefølge skal superklassernes konstruktorer kaldes?) (Eks: Hvis to metoder med samme signatur arves fra to forskellige superklasser, hvilken en skal så bruges?) Java har enkel nedarvning: en klasse kan kun have én umiddelbar superklasse. Interfaces er en erstatning for multipel nedarvning. Et interface kan opfattes som en ultra-abstrakt klasse. Et interface kan kun erklære felter der er konstante. Derfor er nøgleordene final og static underforståede (men må gerne skrives). Et interface kan kun erklære metoder, der er abstrakte og synlige overalt. Derfor er nøgleordene abstract og public underforståede (men må gerne skrives). En metode beskrevet i en grænseflade, skal være public i klasser, der implementerer grænsefladen. Et interface kan ikke erklære konstruktorer. En klasse kan implementere vilkårlig mange interfaces (men stadig kun udvide én superklasse). For at implementere et interface skal klassen implementere alle interfacets metoder.

Polymorfi – hvorfor Polymorfi tillader os at skabe et begrebshierarki via nedarvning samt at manipulere objekter i dette hierarki gennem deres fælles baseklasse. Superklassen udgør den fælles grænseflade for alt det, som nedarver fra den. De nedarvede klasser kan overskrive definitionerne fra superklassen og på den vis have deres egen unikke adfærd. Polymorfisme lader os behandle alle objekter i et hierarki generisk, hvilket betyder at store dele af koden ikke behøver være afhængig af en specifik type-information. Pointen skulle være, at det gør programmer mere udvidbare (extensible), og den egenskab medfører, at det at bygge programmer og vedligeholde programmer er billigere og lettere. Polymorfisme skulle desuden lægge op til bedre organisering af kode og læsbarhed. For at kunne udnytte herlighederne ved polymorfi gælder det altså om at få defineret sine metoder så højt oppe i hierarkiet som muligt -> lave så generelle metoder som muligt.

Polymorfi – toString() Alle klasser i Java er subklasser af klassen Object. Det er underforstået og behøver ikke blive skrevet i klasse-erklæringerne public class Dyr extends Object{ … } Alle klasser arver visse metoder fra Object herunder en universel udgave af metoden toString(). Med universal-udgaven kan d2.toString() give noget, der ligner ”Hest@f5da06” Det er objektets klasse efterfulgt af objektets adresse i maskinens lager (angivet i sekstentalssystemet). Definerer vi en metode toString i klassen Hest, så overskriver den toString arvet fra klassen Object.

Implementering af toString() metoden class Ko extends Pattedyr{ … public String toString(){ return "Jeg er en ko"; } (Tilsvarende for fugl og fisk) -------------------------- class Hest extends Pattedyr{ return "Jeg er en hest ved navn: " + navn; class Araber extends Hest{ return "Jeg er en araberhest ved navn: " + navn; class Islænder extends Hest{ return "Jeg er en islænderhest ved navn: " + navn;

Jeg er en hest ved navn: Beauty Jeg er en araberhest ved navn: Plet public class PolymorfiTest{ public static void main(String[] args){ Dyr[] zoo = new Dyr[]{new Ko(), new Fugl(), new Fisk(), new Hest("Beauty"), new Araber("Plet")}; for(int i = 0; i < zoo.length; i++){ System.out.println(zoo[i].toString()); } Output: Jeg er en ko Jeg er en fugl Jeg er en fisk Jeg er en hest ved navn: Beauty Jeg er en araberhest ved navn: Plet

Polymorfi - equals() metoden Klassen Object har også en metode ved navn equals(), hvilket betyder at alle klasser har en equals() metode, som de nedarver fra Object. Ifølge denne standard implementation returnerer equals() true, hvis de to objekter, der sammenlignes er identiske. Dyr d1 = new Araber(”Prince”); Dyr d2 = new Araber(”Prince”); d1.equals(d2) returnerer false, idet der er tale om to forskellige objekter. d1 :Araber navn=”Prince” d2 :Araber navn=”Prince”

Implemetering af equals() metoden Tanken med equals() er dog, at metoden skal returnere sand, hvis to objekter er ens ifølge den definition af ens, som skaberen af den enkelte klasse giver. Dvs. at vil man have en equals metode i sine klasser, som fungerer efter hensigten, skal man selv implementere den. class Araber{ … public boolean equals(Object o){ Araber a2 = (Araber) o; return (navn.equals(a2.navn)); } Test: Araber a1 = new Araber(”Prince"); Araber a2 = new Araber(”Prince"); System.out.println("a1.equals(a2): ” + a1.equals(a2)); System.out.println("a1 == a2: ” + (a1 == a2))); Output: a1.equals(a2): true a1 == a2: false