Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

GP 6, 13/3 20021 Grundlæggende programmering Forår 2002 Forelæsning 6 onsdag 13/3 2002 kl. 9:15 – 12:00.

Lignende præsentationer


Præsentationer af emnet: "GP 6, 13/3 20021 Grundlæggende programmering Forår 2002 Forelæsning 6 onsdag 13/3 2002 kl. 9:15 – 12:00."— Præsentationens transcript:

1 GP 6, 13/3 20021 Grundlæggende programmering Forår 2002 Forelæsning 6 onsdag 13/3 2002 kl. 9:15 – 12:00

2 GP 6, 13/3 20022 Dagens program Lagermodel for klasser og objekter Indkapsling Overlæsning (overstyring) Overblik over Javas sprogbestanddele (review)

3 GP 6, 13/3 20023 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.

4 GP 6, 13/3 20024 Lagermodel for klasser og objekter Klasse: Konto løbeNummer: 3 Konto(String ejeren){...} double hæv(double beløb){...} void indsæt(double beløb){...} double aflæsSaldo(){...} void overførTil(Konto modtager,...){...} Kontoobjekt 2: klasse: saldo: 1500 maxOvertræk: -3000 ejer: ”Dilbert” kontoNummer: 2 Kontoobjekt 1: klasse: saldo: 2000 maxOvertræk: -3000 ejer: ”Kasper” kontoNummer: 1 public class Driver { public static void test(){ Konto kasper = new Konto(“Kasper”); Konto dilbert = new Konto(“Dilbert”); kasper.indsæt(3500.00); kasper.overførTil(dilbert, 1500); } overførTil this: modtager: beløb: returTil: test, li. 5 test args: kasper: dilbert: returTil: prompt call stack heap

5 GP 6, 13/3 20025 private/public på vej til indkapsling Felt eller metode:publicprivatehverken public eller private Synlig i samme klasse ja Synlig i andre klasser i samme pakke janejja Synlig i andre klasser uden for pakken janej

6 GP 6, 13/3 20026 Indkapsling et eksempel… public class Person{ private String name; private int age; public Person(String name){ setName(name); age = 0; } public void setName(String name){ if(name != null && !name.equals(””)){ this.name = name; } public String getName(){ return name; } public void haveBirthday(){ age++; } public int getAge(){ return age; } public class PersonTester{ public void test(){ Person fritz = new Person(”Fritz”); fritz.haveBirthday(); System.out.println(fritz.getName() + ” ” + fritz.getAge()); Person mads = new Person(”Mads”); int fritzAge = fritz.getAge(); int madsAge = mads.getAge(); System.out.println(mads.getName() + ”is older than ” + fritz.getName() + ” is ” + (madsAge > fritzAge)); fritz.setName(”Fritz Henglein”); System.out.println(fritz.getName()); fritz.name = ””; //compile fejl fritz.age = -16768; //compile fejl }

7 GP 6, 13/3 20027 Indkapsling En klasse er en skabelon for at lave en række ens objekter. Objekter består af instansvariable og metoder. Instansvariablenes værdier udgør objektets tilstand. Metoderne kan aflæse og ændre tilstanden. Oftest er man ikke interesseret i at man ”udefra” – dvs. fra andre objekter, kan manipulere tilstanden direkte, f.eks. ændre saldo på kontoen. Motivationen for dette er at man således får indkapslet det indre af klassen; dvs. isoleret fra resten af programmet. Klassens grænseflade udgør dens public metode signaturer (+returtyper) (og dens public variable) Hvis man ikke ændrer grænsefladen til klassen, så vil klienterne af klassen være uberørt af ændringer i implementationen af klassen.

8 GP 6, 13/3 20028 Den korte udgave felter erklæres privatemetoder erklæres public metoder der kun bruges som hjælpe metode for andre metoder i samme klasse erklæres som private. hvis man udefra har brug for at aflæse et felt, laves en public ”get” metode (accesor). F.eks. getName hvis man udefra har brug for at tildele et felt en ny værdi laves en public ”set” metode (mutator) F.eks. setName(String)

9 GP 6, 13/3 20029 Overlæsning (overstyring, overloading) En klasse kan indeholde flere konstruktorer og metoder med samme navn sålænge deres signaturer er forskellige. Signaturen er konstruktorens, hhv. metodens navn, efterfulgt at typerne af parametrene. Metodens resultat-type indgår ikke i signaturen. Overlæssede metoder med samme navn kan have forskellige resultat- typer. Konto(String ejer, double overtræk){ this.ejer = ejer; this.overtræk = overtræk; saldo = 0; } Konto(String ejer){ this.ejer = ejer; overtræk = -3000; saldo = 0; } // this(ejer, 3000); //constructor chaining void indsæt(double beløb){ saldo += beløb; } void indsæt(String beløb){ saldo += Int.parseInt(beløb); } void indsæt(int beløb){ saldo += beløb; }

10 GP 6, 13/3 200210 Metode overstyring Metode overstyring (overload se 4.5) man kan i den samme klasse have to metoder med samme navn, hvis de har forskellige typer parametre, f.eks. System.out objektet println(String s) println(int i) println(double d) Man bruger ofte overstryring ved kontruktører. F.eks. Dato Dato(int year, int month, int day) Dato(String s) Dato() //today

11 GP 6, 13/3 200211 Overblik over Javas sprogbestanddele Efterfølgende en komplet review af de dele af Java vi indtil nu har gennemgået.

12 GP 6, 13/3 200212 Grundbegreber: værdi, type, variabel En værdi er en størrelse man kan ’regne’ med (f.eks. 117, false, objektreference). –Værdier kan ikke ændres eller ”opdateres”! –Objekter kan opdateres ved at opdatere deres instansvariable, men de er ikke værdier i Java, kun objektreferencer. En type er en familie af værdier (f.eks. int, som er typen af heltal). –En type er enten en basetype (f.eks. int, double, boolean) eller en referencetype (f.eks. String). –Basetyperne er indbygget i Java. Man kan ikke selv definere nye basetyper. –Man kan selv definere nye referencetyper ved at definere klasser. En variabel navngiver en plads (”skuffe” for værdier) i maskinens lager. –En variabel af basetype (f.eks. int) kan indeholde en værdi hørende til basetypen, f.eks. 117. –En variabel af referencetype (f.eks. Konto) kan indeholde en reference til et objekt hørende til klassen, eller null. –En variabel kan indeholde forskellige værdier på forskellige tidspunkter. –Variabelnavne kan vælges frit (bortset fra reserverede ord: if, else, for...). –Man bruger normalt lille begyndelsesbogstav i variabelnavne. –Variable skal erklæres før brug. –En variabel-erklæring består af en type efterfulgt af en variabel, eventuelt med en initialisering.

13 GP 6, 13/3 200213 Pakker package edu.it.pakkenavn; class Klassenavn { Felter Konstruktorer Metoder } class Klassenavn { Felter Konstruktorer Metoder } class Klassenavn { Felter Konstruktorer Metoder } Et program er en samling klasser (som kan være en pakke). En klasse indeholder felter, konstruktorer og metoder. En metode består af returtype, signatur og en metodekrop. En metodekrop er en blok, der indeholder erklæringer og ordrer.

14 GP 6, 13/3 200214 Programmer og Java-filer Et program består af en samling klassedefinitioner. Programmets klassedefinitioner kan ligge i en eller flere.java-filer. Skal programmet kunne udføres fra kommandofortolkeren, skal mindst en af klasserne skal indeholde en metode-erklæring af formen public static void main(String[] args) {... } Hvis klassen hedder Driver så kan programmet køres med kommandoen ”java Driver”, som invokerer main-metoden i Driver. BlueJ kan invokere vilkårlige metoder. main-metoden er ikke nødvendig for BlueJ. Hvis en klasse har brug for andre klasser skal de oversatte klassefiler (.class-filer) ligge i samme katalog som Driver eller i klassestien (class path). NB: Klassestien indeholder altid \jre\lib\ext.

15 GP 6, 13/3 200215 Klassedefinitioner En klassedefinition består af: –felt-erklæringer, –konstruktor-erklæringer og –metode-erklæringer. Rækkefølgen er ligegyldig. (men ovennævnte rækkefølge er godt stil) Klassenavne kan vælges frit (bør være sigende) Man bruger normalt stort begyndelsesbogstav i klassenavne (CamelBack style).

16 GP 6, 13/3 200216 Felter/instansvariable En felt-erklæring består af et typenavn efterfulgt at et eller flere feltnavne, f.eks. String mærke, nr_plade, farve; int serie_nr; Et felt kan være static (en klassevariabel). Så navngiver feltet en bestemt plads i maskinens lager. Ellers er feltet et objektfelt (instansvariabel). Så navngiver feltet en separat plads i hvert objekt hørende til klassen. Felter initialiseres altid med en standardværdi (0, false, null) afhængig af feltets type. Feltnavne kan vælges frit. (bør være sigende) Man bruger normalt lille begyndelsesbogstav i feltnavne.

17 GP 6, 13/3 200217 Konstruktorer En konstruktor skal have samme navn som den klasse den er defineret i. En konstruktor har en parameterliste ligesom en metode. En konstruktor har ingen returtype, ulige metoder. En konstruktors krop en en blok {... }, som indeholder erklæringer og ordrer. Konstruktorer bruges til at give klassens felter passende værdier, f.eks. Konto(String ejer) { this.ejer = ejer; saldo = 0; overtræk = -3000; }

18 GP 6, 13/3 200218 Metode-erklæringer En metode-erklæring består af: –evt. modifieres (public|private|protected)? static?, –returtype, –metodenavn, –parameterliste, –metodekrop. Hvis returtypen er ”void” skal metoden ikke returnere en værdi. Ellers skal den returnere en værdi af den rigtige type med ordren return udtryk En metodesignatur består af: –metodenavn og –liste af parametertyper. Eksempler på returtyper og metodesignaturer: doubleaflæsSaldo() voidhæv(double) doublesqrt(double)

19 GP 6, 13/3 200219 Ordrer En ordre har en effekt (på lageret eller skærmen), men ingen værdi. Ordre-artEksempel if-ordreif (x != 0) y = 1/y; if-else-ordreif (x !=0) y = 1/y; else y=0; metodekald (void)System.out.println(“Hello”); blok{ x = 1; y = 1/y; } for-løkkefor (int i = 0; i < 100; i++) { sum += i; } while-løkkewhile (sum < 100) sum++; do-while-løkkedo { sum++; } while (sum < 100); retur-ordrereturn x*x; switch-ordreswitch (x) { case 0: y = 0; break; default: y = 1/x; }

20 GP 6, 13/3 200220 Udtryk Et udtryk har en type, en værdi og måske en effekt (på lageret, skærmen eller input/output (sideeffekt)). Udtryks-artEksempel konstant7 variabelx aritmetisk udtrykx + 1 tildelingx = x+1 sammenligningx == 7 logisk udtrykx == 7 && y < 10 metodekald (nonvoid)Math.sqrt(5) konstruktorkaldnew Konto(“Kasper”) betinget udtrykx != 0 ? 1/x : 1

21 GP 6, 13/3 200221 Fra udtryk til ordre Et udtryk efterfulgt af “;” giver en ordre En tildelingsordre x = 10 + 117; består af: –udtrykket x = 10 + 117, der har værdien 127 og har den effekt at sætte x til 127; –et semikolon “;”. Semikolon forvandler udtrykket “x = 10 + 117” til en ordre “x = 10 + 117;” ved at smide udtrykkets værdi væk. Hvad er værdien af x efter udførslen af int x = 8; x == 9;

22 GP 6, 13/3 200222 Modifiers Felt:staticikke static Antal kopierEn for klassenEn for hvert objekt Fælles for klassejanej Metode:staticikke static Kan bruge ”this”nejja Invokeres påklassenavnobjektreference Felt:finalikke final Kan opdateresnejja

23 GP 6, 13/3 200223 Modifiers... Felt eller metode:publicprivatehverken public eller private Synlig i samme klasse ja Synlig i andre klasser i samme pakke janejja Synlig i andre klasser uden for pakken janej

24 GP 6, 13/3 200224 Spørgsmål Spørgsmål? Kommentarer?


Download ppt "GP 6, 13/3 20021 Grundlæggende programmering Forår 2002 Forelæsning 6 onsdag 13/3 2002 kl. 9:15 – 12:00."

Lignende præsentationer


Annoncer fra Google