GP 5, 26/9 20011 Grundlæggende programmering Efterår 2001 Forelæsning 5 onsdag 26/9 2001 kl. 9:15 – 12:00.

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

07 – Kort om OO Introduktion.
T1 – OPGAVE 14.2 LINETT & SABRINA Klasse Varer namespace Opgave_14._2 { class Varer { private string vare; private string farve; private double.
Indledende Programmering Uge 2 - Efterår 2006 Selektioner og interaktion mellem objekter Susanne Brix Lindros.
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
Intro Forelæsning 2 Linux install-party lør.14.sept kl – man. 14.okt – Kursets omfang :7,5 ECTS Kursussammensætning: forelæsning.
Selve objektet versus referencen til objektet Nedarvning
Grundlæggende programmering Efterår 2001
GP 4, 19/ Grundlæggende programmering Efterår 2001 Forelæsning 4 onsdag 19/ kl. 9:15 – 12:00.
Hvordan man skriver koden.
Intro Variabler - datatyper. 2. forelæsning Hvad skete sidste gang Hvad er PHP? Kursussammensætning: læse – newsgroup – forelæsning – øvelsestime – aflevering.
VOOP, 8 april Refleksion i objekt orienterede programmeringssprog Mandag 8/ Kasper Østerbye.
GP5, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 5 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder.
GP 10, 7/ Grundlæggende programmering Efterår 2001 Forelæsning 10 onsdag 7/ kl. 9:15 – 12:00.
FEN IntroJava AAU1 Java grundelementer Variable og datatyper Sætninger og udtryk Metoder.
Delphi og C++ Builder C++ Referencer og pointere.
GP 1, 6/ Grundlæggende programmering Forår 2002 Forelæsning 1 onsdag 6/ kl. 9:15 – 12:00.
Begreber og Redskaber 2. Plan for idag Noget om bestanddelene i et programmeringssprog Syntaksbeskrivelse af java Næste gang: –Binære tal –Repræsentation.
GP6, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 6 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder.
GP 11, 14/ Grundlæggende programmering Efterår 2001 Forelæsning 11 onsdag 14/ kl. 9:15 – 12:00.
Fundamentale datastrukturer
Mønstre En lille introduktion. Singleton Tilgå et objekt igennem klassereference i stedet for objektreference.  Overflødiggør referencer til objektet.
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
GP 6, 13/ Grundlæggende programmering Forår 2002 Forelæsning 6 onsdag 13/ kl. 9:15 – 12:00.
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
Repetition: Introduktion til OOP med C# og .NET
GP 3, 12/ Grundlæggende programmering Efterår 2001 Forelæsning 3 onsdag 12/ kl. 9:15 – 12:00.
GP 6, 3/ Grundlæggende programmering Efterår 2001 Forelæsning 6 onsdag 3/ kl. 9:15 – 12:00.
Begreber og Redskaber 7. Plan for idag Rekursive underprogrammer Rekursive datastrukturer Rekursion vs iteration Rekursivt: Flette sortering.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
Forelæsning 2.2 Tilstand og opførsel (repetition)
FEN IntroJava AAU1 Endnu mere om Klasser og Objekter Mange til mange relationer Student-Course v3.
Uge 14: distribuerede objekter, fjernprocedurekald, RMI Tirsdag: Introduktion Mulige fordele ved distribuerede objekter Introduktion til RMI: - Interfacets.
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.
GP 4, 27/ Grundlæggende programmering Forår 2002 Forelæsning 4 onsdag 27/ kl. 9:15 – 12:00.
GP3, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 3 Vi begynder Slides ligger på hjemmesiden. Du er velkommen til.
Forelæsning 7.1 – repetition
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.
Variabler, klassevariabler, identitet og lighed, collections
Klassevariable- og metoder Tilstand og opførsel på klasseniveau.
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.
DAIMIIntroducerende objektorienteret programmeringkd.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 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,
Indledende Programmering Uge 6 - Efterår 2006
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.
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.
 Jens Bennedsen 2001Multimedie programmering4.1 Definition af begreber Interface, implements, klasse.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation,
Klassevariable- og metoder Funktionalitet på klasseniveau.
 Jens Bennedsen 2001Multimedie programmering3A.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
Klasser og objekter. dIntProg, F08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
Jesper Mosegaard Multimedie Programmering E2003 MMProg uge44 Java til Lingo Klasser, statements og lister.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Objecter Introduktion Webintegrator HF1 PHP Object orienteret.
Forelæsning Uge 4 – Mandag
Klasser og objekter (Afsnit i manualen).
Forelæsning Uge 2 – Torsdag
Forelæsning Uge 4 – Torsdag
Præsentationens transcript:

GP 5, 26/ Grundlæggende programmering Efterår 2001 Forelæsning 5 onsdag 26/ kl. 9:15 – 12:00

GP 5, 26/ Dagens program Det praktiske Syntaks Objekter, referencer og variable Metodeinvokeringer, kaldstak

GP 5, 26/ Det praktiske LinuxLab arrangement: torsdag, 27. sep., kl. 15:15-17, LinuxLab (lok. 4.05), ”Java programming on Linux”; se Opdateret gp.jar: Brug den nyeste version af gp.jar (se hjemmesiden og it-c.courses.GP for oplysninger).it-c.courses.GP Ugeseddel 5: Ugeseddel 5 er noten (og derfor pensum) for dagens forelæsning. Kom velforberedt til øvelserne næste uge: læs ugesedlen og start at arbejde på opgaverne inden øvelserne.

GP 5, 26/ (Programmerings)sprog Linguistik (sproglære) inddeler læren af sprog i: –Syntaks: Hvordan er (velformede) sætninger i sproget bygget op? –Semantik: Hvad betyder sætningerne? –Pragmatik: Hvordan bruges sproget mest hensynsmæssigt? Tilsvarende for programmeringssprog, f.eks. Java: –Syntaks: Hvad er velformede Java programmer? –Semantik: Hvad sker der, når man udfører et velformet Java program? –Pragmatik: Hvordan bruges sprogets faciliteter bedst muligt for få effektive, let-forståelige, genbrugelige, testbare, modulære programmer?

GP 5, 26/ Java syntaks Syntaksen for Java, f.eks. hvordan en metode kan se ud, kan beskrives på forskellig måde. En mulighed er syntaksdiagrammer, som i L&L appendiks L. Metodeerklæringer er beskrevet som: Type void Identifier Modifier ParametersThrows clause Method body public double indsæt (double beløb) { saldo += beløb; } Syntaksdiagrammer viser hvordan syntaksen er, men ikke hvad det betyder.

GP 5, 26/ Java syntaks voidModifier Throws clause valgmulighed ved forgreninger ovaler angiver et nøgleord, eller en konstant i sproget. En kasse er navnet på et andet syntaksdiagram Throws vil vi ikke se på før i lektion 12. Her er det med for at vise at en Throws clause kan bestå af den tomme streng (ved at vælge øverste linje ret gennem diagrammet). slutprik til højre i diagrammet startprik til venstre i diagrammet

GP 5, 26/ Konto klasse public class Konto {private double saldo; private double maxOvertræk; private String ejer; public Konto(String ejeren) { ejer = ejeren; saldo = 0; maxOvertræk = -3000; } public double hæv(double beløb) { if (saldo-beløb >= maxOvertræk) { saldo = saldo - beløb; return beløb; } else { return 0; } public void indsæt(double beløb) { saldo += beløb; } public double aflæsSaldo() { return saldo; } forts. Hvert objekt lavet ud fra klassen Konto har sin egen saldo, maxOvertræk, og ejer. Når man laver et objekt skal man angive ejeren. Dette angives i konstruktøren. Der er tre metoder, som bruges til at hæve, indsætte, og aflæse saldo.

GP 5, 26/ Overførsel af penge public void overførTil(Konto modtager, double beløb){ if (this.hæv(beløb) == beløb) modtager.indsæt(beløb); } Ny metode i Konto klassen.

GP 5, 26/ Referencer 1) Konto lønKonto = new Konto(”Kasper”); Konto minKonto = lønKonto; lønKonto.indsæt(3000); int beløb = minKonto.aflæsSaldo(); int huskSaldo = beløb; minKonto.hæv(500); beløb = lønKonto.aflæsSaldo(); lønKonto Konto saldo: 0 maxOvertræk: ejer: Kasper Variablen lønKonto er en reference til et konto objekt. En reference er en entydig identifikation af et objekt. new operatoren laver et nyt objekt, og konstruktør metoden giver instans variablene deres start værdi.

GP 5, 26/ Referencer 2) Konto lønKonto = new Konto(”Kasper”); Konto minKonto = lønKonto; lønKonto.indsæt(3000); int beløb = minKonto.aflæsSaldo(); int huskSaldo = beløb; minKonto.hæv(500); beløb = lønKonto.aflæsSaldo(); lønKonto Konto saldo: 0 maxOvertræk: ejer: Kasper minKonto Variablen minKonto kan også referere til Konto objekter. Assignmentet får minKonto til at referere det samme objekt som lønKonto variablen. Teknisk siger man at minKonto og lønKonto er aliaser for det samme objekt.

GP 5, 26/ Referencer 3) Konto lønKonto = new Konto(”Kasper”); Konto minKonto = lønKonto; lønKonto.indsæt(3000); int beløb = minKonto.aflæsSaldo(); int huskSaldo = beløb; minKonto.hæv(500); beløb = lønKonto.aflæsSaldo(); Konto saldo: 3000 maxOvertræk: ejer: Kasper minKonto Ved kaldet ”lønKonto.indsæt(3000)” er det metoden på det objekt som lønKonto variablen referere der aktiveres. Derfor er det ligegyldigt om jeg aflæser saldo gennem den ene eller den anden variabel. Aflæsningen sker igen via referencen. lønKonto 3000 beløb

GP 5, 26/ Referencer 4) Konto lønKonto = new Konto(”Kasper”); Konto minKonto = lønKonto; lønKonto.indsæt(3000); int beløb = minKonto.aflæsSaldo(); int huskSaldo = beløb; minKonto.hæv(500); beløb = lønKonto.aflæsSaldo(); Konto saldo: 3000 maxOvertræk: ejer: Kasper minKonto beløb og huskSaldo er begge heltal, ikke objekter. De er derfor ikke alias for hinanden, men to adskilte variable. Egentlig er dette totalt umystisk. Objekt variable gemmer ikke objekter, men objekt referencer. Når man assigner en objekt variabel, så kopieres referencen, på samme måde som heltallet 3000 kopieres fra beløb til huskSaldo. lønKonto 3000 beløb 3000 huskSaldo

GP 5, 26/ Referencer 5) Konto lønKonto = new Konto(”Kasper”); Konto minKonto = lønKonto; lønKonto.indsæt(3000); int beløb = minKonto.aflæsSaldo(); int huskSaldo = beløb; minKonto.hæv(500); beløb = lønKonto.aflæsSaldo(); Konto saldo: 2500 maxOvertræk: ejer: Kasper minKonto Beløb og huskSaldo er nu forskellige, idet beløb er ændret, men ikke huskSaldo. Det er stadig ligegyldigt hvilken objekt variabel jeg bruger til at operere på objektet, idet de to variable refererer til samme objekt. lønKonto 2500 beløb 3000 huskSaldo

GP 5, 26/ Referencer 6) Konto lønKonto = new Konto(”Kasper”); Konto minKonto = lønKonto; lønKonto.indsæt(3000); int beløb = minKonto.aflæsSaldo(); int huskSaldo = beløb; minKonto.hæv(500); beløb = lønKonto.aflæsSaldo(); lønKonto = new Konto(”Østerbye”); Konto saldo: 2500 maxOvertræk: ejer: Kasper minKonto Der er lavet et nyt objekt, og lønKonto variablen refererer til det nye objekt. minKonto refererer stadig til det gamle. lønKonto 2500 beløb 3000 huskSaldo Konto saldo: 0 maxOvertræk: ejer: Østerbye

GP 5, 26/ Referencer 7) public void overførTil (Konto modtager, double beløb) { if (this.hæv(beløb) == beløb) modtager.indsæt(beløb); } Konto minKonto = new Konto(”Kasper”); Konto dinKonto = new Konto(”Dilbert”);... minKonto.overførTil(dinKonto,1205); Under aktiveringen af ”overførTil” er ”modtager” et alias for Dilberts konto. Konto saldo: 2500 maxOvertræk: ejer: Dilbert minKonto dinKonto Konto saldo: 0 maxOvertræk: ejer: Kasper modtager this er en reference til det objekt som i øjeblikket har fået denne metode aktiveret. Altså this refererer Kaspers konto objekt

GP 5, 26/ Static Man kan i særlige tilfælde få brug for tilstand der ikke er knyttet til et specifikt objekt, men er fælles for en række objekter. F.eks. alle konto objekter skal have et konto nummer som er et løbenummer. Man kan i Java knytte metoder og variable til klassen i stedet for til et objekt. Man kalder den slags klassemetoder og klassevariable. Af historiske grunde (fordi Java er inspireret af C og C++), kaldes klassemetoder og -variable også for statiske metoder og variable. Man angiver om en metode eller variabel er en klassevariabel ved at skrive static foran metoden eller variablen.

GP 5, 26/ Instansmetoder og klassemetoder En instansmetode tilhører et bestemt objekt. En instansmetode kan kun tilgås fra et objekt (angives før ”.”). En instansmetode kan bruge og opdatere alle instansvariable. En instansmetode kan bruge og opdatere alle klassevariable. En instansmetode kan referere til this (modtagerobjektet for metoden) En instansmetode kan først invokeres når der er dannet et objekt. En klassemetode tilhører klassen, ikke noget bestemt objekt. En klassemetode kan kun tilgås fra en klasse (klassenavn angives før ”.”) En klassemetode kan ikke tilgå instansvariable. En klassemetode kan bruge og opdatere alle klassevariable. En klassemetode kan ikke referere til this. En klassemetode kan invokeres uden at der er dannet et objekt.

GP 5, 26/ Løbenumre i Konto public class Konto {private double saldo; private double maxOvertræk; private String ejer; private int kontoNummer; private static int løbeNummer = 1; public Konto(String ejeren) { ejer = ejeren; saldo = 0; maxOvertræk = -3000; kontoNummer = løbeNummer; løbeNummer = løbeNummer +1; }.... } static angiver at det er en klasse variabel. private at den ikke kan ses ude fra. variablen løbenummer får sin værdi når klassen bliver lavet, hvilket er første gang klassen bliver brugt. Man kan aflæse klasse variable som enhver anden variabel Og den kan også tildeles en ny værdi. Resultatet er at enhver konto objekt får sit eget konto nummer.

GP 5, 26/ Metoder (review) public static int max(int a, int b) { int resultat; if (a>b) resultat = a; else resultat = b; return resultat; }.... public static void main(String[] args){ System.out.println( max(5,9) ); System.out.println( max(-5,-9) ); System.out.println( max(5,5) ); } Dette kaldes metodens hoved. Her angives navn og type på hver parameter. metodens navn er max, og typen af det den giver som resultat står umiddelbart før navnet (her int). Hvis metoden ikke returnerer noget, angiver man det med void. I forbindelse med en aktivering af max, vil a og b få tildelt værdier – f.eks. 5 og 9. Når der i hovedet er angivet en retur type (ikke void), skal der være en return. Den behøver dog ikke at stå til sidst. a og b kaldes formelle parametre, mens de værdier der gives med ved aktivering kaldes aktuelle parametre, eller argumenter.

GP 5, 26/ Metodeaktiveringer og kaldsstakken Konto minKonto = new Konto(”Kasper”); Konto dinKonto = new Konto(”Dilbert”);... minKonto.overførTil(dinKonto,1205); public class Konto {private double saldo; private double maxOvertræk; private String ejer; public Konto(String ejeren) { ejer = ejeren; saldo = 0; maxOvertræk = -3000; } public double hæv(double beløb) { if (saldo-beløb >= maxOvertræk) { saldo = saldo - beløb; return beløb; } else { return 0; } public void indsæt(double beløb) { saldo += beløb; } public double aflæsSaldo() { return saldo; } public void overførTil (Konto modtager, double beløb){ if (this.hæv(beløb) == beløb) modtager.indsæt(beløb); } forts. Givet denne konto klasse, vil vi følge aktiveringen af overførTil neden for.

GP 5, 26/ En metodeaktivering En metode aktivering indeholder følgende 3 ting. For det første indeholder den lokale variable og parametre for denne aktivering af metoden. For det andet indeholder den en reference til hvilket objekt denne metode er aktiveret på – this objektet. og endelig indeholder den det sted i programmet hvor vi skal vende tilbage til når metoden er færdig.

GP 5, 26/ Aktiveringen af overførTil public void overførTil(Konto modtager, double beløb){ if (this.hæv(beløb) == beløb) modtager.indsæt(beløb); } modtager: beløb: 1205 this: retur til: ??? saldo: 1500 maxOvertræk: ejer: ”Kasper” saldo: 2000 maxOvertræk: ejer: ”Dilbert”

GP 5, 26/ I debuggeren I if sætningen aktiveres hæv metoden

GP 5, 26/ Aktiveringen af hæv modtager: beløb: 1205 this: retur til: ??? saldo: 1500 maxOvertræk: ejer: ”Kasper” saldo: 2000 maxOvertræk: ejer: ”Dilbert” public double hæv(double beløb) { if (saldo-beløb >= maxOvertræk) { saldo = saldo - beløb; return beløb; } else { return 0; } beløb: 1205 this: retur til: ??? saldo betegner i denne aktivering saldoen i Kaspers konto, idet this er Kaspers konto.

GP 5, 26/ I debuggeren Vi returnerer fra denne aktivering

GP 5, 26/ Aktiveringen af overførTil public void overførTil(Konto modtager, double beløb){ if (this.hæv(beløb) == beløb) modtager.indsæt(beløb); } modtager: beløb: 1205 this: retur til: ??? saldo: 295 maxOvertræk: ejer: ”Kasper” saldo: 2000 maxOvertræk: ejer: ”Dilbert” Vi er nu kommet tilbage fra hæv, men har endnu ikke indsat beløbet på Dilberts konto.

GP 5, 26/ I debuggeren Vi aktiverer metoden indsæt

GP 5, 26/ Aktiveringen af indsæt modtager: beløb: 1205 this: retur til: ??? saldo: 1500 maxOvertræk: ejer: ”Kasper” saldo: 2000 maxOvertræk: ejer: ”Dilbert” public void indsæt(double beløb) { saldo += beløb; } beløb: 1205 this: retur til: ??? saldo betegner i denne aktivering saldoen i Dilberts konto, idet this er Dilberts konto, fordi vi kaldte metoden som ”modtager.indsæt(beløb)”

GP 5, 26/ I debuggeren Vi returnerer fra denne aktivering

GP 5, 26/ Aktiveringen af overførTil public void overførTil(Konto modtager, double beløb){ if (this.hæv(beløb) == beløb) modtager.indsæt(beløb); } modtager: beløb: 1205 this: retur til: ??? saldo: 295 maxOvertræk: ejer: ”Kasper” saldo: 3205 maxOvertræk: ejer: ”Dilbert” Vi er nu kommet tilbage fra indsæt og er færdige.

GP 5, 26/ I debuggeren