Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Uke 9 - Repetisjon av metoder, klasser og objekter, Mer om: Klassediagrammer, private og public 14 okt. 2003, Arne Maus Inst. for informatikk, UiO.

Liknende presentasjoner


Presentasjon om: "Uke 9 - Repetisjon av metoder, klasser og objekter, Mer om: Klassediagrammer, private og public 14 okt. 2003, Arne Maus Inst. for informatikk, UiO."— Utskrift av presentasjonen:

1 Uke 9 - Repetisjon av metoder, klasser og objekter, Mer om: Klassediagrammer, private og public 14 okt. 2003, Arne Maus Inst. for informatikk, UiO

2 2 Ta flervalgstestene !!  De minner om hvordan deler av eksamen vil bli.  God trening til eksamen

3 3 Oversikt  Repetisjon  metoder  klasser og objekter  Klassediagrammer  Public, private, protected og ’package’  Get- og set-metoder for variable  Et eksempel Konto

4 4 Hva er en metode  En metode er en valgfritt antall programsetninger vi gir et navn  All kode i programmet er inne i en metode (som igjen er inne i en eller annen klasse)  Skille mellom  å deklarere en metode (= skrive Javakode for og kompilere)  Utføre en metode (kdet som skjer når vi kaller den)  Når vi deklarerer en metode, skjer det ’ingen ting ’  En metode blir utført hver gang den kalles fra koden i en annen metode:  da hopper utførelsen av programmet til starten av den kalte metoden  har den kalt metoden parametere, kopieres verdiene brukt i kallet til metodens parameter-variable (de er som lokale variable i den kalte metoden)

5 class BB { int antall = 0; void skrivAntallGanger() { antall++; System.out.println(" Du har kalt meg:" + antall + " ganger"); } class AA { public static void main ( String[] args) { BB b = new BB(); b.skrivAntallGanger(); // Kall nr. 1 b.skrivAntallGanger(); // Kall nr. 2 b.skrivAntallGanger(); // Kall nr. 3 } M:\INF1000\prog>java AA Du har kalt meg:1 ganger Du har kalt meg:2 ganger Du har kalt meg:3 ganger Kall på en metode: skrivAntallGanger()’ i objektet ’b ’ tre ganger

6 6 Hva skjer når vi kaller en metode  Når vi kaller en metode, blir det opprettet et metodeobjekt og vi kopierer over verdiene brukt i kallet til parameterne  Dette metodeobjektet  inneholder alle lokale variabler og parameterne til metoden  når setningene i metoden utføres, brukes disse variablene og parametrene av metoden  metodeobjektet fjernes automatisk når metoden er ferdig utført og returnerer  Merk forskjellen på å deklarere en metode, og at den utføres.

7 class C { int skrivAntall(int i){ System.out.println(" Du har kalt meg med:" + i); return i+10; }} class D { static int dobbel( int k) { return 2*k; } void gjørMye(C cc, int v) { System.out.println(" gjørMye kalt"); int j = cc.skrivAntall(v); System.out.println(" 1.verdien av j:" + j); j = dobbel(j); System.out.println(" 2.verdien av j:" + j); System.out.println(" 3.verdien av skrivAntall(j):" + cc.skrivAntall(j) ); } public static void main ( String[] args) { C c = new C(); D megSelv = new D(); megSelv.gjørMye(c,2); }} >java D gj°rMye kalt Du har kalt meg med:2 1.verdien av j:12 2.verdien av j:24 Du har kalt meg med:24 3.verdien av skrivAntall(j):34

8 8 Hvorfor bruke metoder  Vi deler opp programmet i metoder fordi:  Noen program setninger brukes flere steder, eller:  Vi vil dele opp programmet i mindre deler  Ingen metode bør være lenger enn 30 linjer (og helst mindre)  Hver del gjør noe veldefinert som fremgår av navnet:  regner ut en bestemt formel  skriver ut en meny  leser noen data fra terminal eller fil  tegner ut opplysninger på skjermen 

9 9 Problemløsning med metoder  Når vi har laget en metode, og vi har forsikret oss om at den er ’riktig’, så har vi laget en ny operasjon  Vi kan nå i resten av koden tenke at vi nå har en slik operasjon tilgjengelig og nytte denne som om den var innebygd i Java  eks: skrive ut en meny, regne ut en bestemt formel,..  Vi trenger da ikke tenke på alle detaljene om hvordan denne operasjonen blir utført, bare at den blir gjort.  Vi har da laget et (lite) verktøy som kan gjenbrukes og lettere løse vårt større problem (hele systemet)  Denne måte å programmere på heter bottom-up programmering og nyttes mye.  Eks: Java-biblioteket kan best forstås som en diger verktøykasse med nyttige operasjoner og datastrukturer vi kan (og ofte bør) bruke for å lage vårt program

10 10 Hva er en klasse  En klasse er en beskrivelse av hvordan ett objekt av en bestemt type i vårt problem er.  Inneholder variable som beskriver egenskaper for ett slikt objekt – eks:  Navn, adresse, studiepoeng, kurs... for klassen Student  Registreringsnummer, eier, type, årsmodel for klassen Bil  Inneholder metoder som er fornuftig handlinger for ett slikt objekt – eks:  skrivUtVitnemål(), meldPåEmne(),.. i klassen Student  beregnÅrsavgift(), skiftEier(),.. i klassen Bil

11 11 Skille mellom deklarasjon og bruk av en klasse  Når vi deklarerer en klasse (= skriver Javakode for) skjer det ’ingen ting’ i programmet  Når vi oversetter og starter opp programmet vårt med javac og java, skjer ’lite’:  De variable og metodene det står static foran er tilgjengelig  Ingen kode (med unntak av main) utføres  Først når vi sier new på en klasse, får vi laget et objekt av klassen  Objektet inneholder alle variable og metoder som ikke har static foran deklarasjonen (objekt-variable og – metoder)  Når vi sier new, kaller vi en konstruktør-metode i klassen, og først når den er ferdig, returnerer new det med det nye objektet

12 import easyIO.*; class Bil { String eier,regNum; Bil (String e, String n) { eier = e; regNum = n; } class E { public static void main ( String[] args) { Bil b; String eier, num; In tast = new In(); System.out.print("Gi eier:"); eier = tast.inWord("\n"); System.out.print("Gi nummer:"); num = tast.inWord("\n"); b = new Bil (eier,num); System.out.println("BIL. eier:" + b.eier + ", nummer:" + b.regNum); } >java E Gi eier:Ola Nord Gi nummer:BD BIL. eier:Ola Nord, nummer:BD b b eier regNum

13 class Konto1 { String eier; int kontoNum, saldo = 0; Konto1(String e) { eier = e; } void settInn(int beløp) { saldo = saldo + beløp; } boolean taUt(int beløp) { // moderne bank med muligheter for overtrekk saldo = saldo - beløp; return saldo > 0; } class Bank1 { Konto1 [] kontiene = new Konto1[100000]; public static void main( String[] args) { Bank1 b = new Bank1(); for (int i = 0; i < b.kontiene.length; i++) { b.kontiene[i] = new Konto1("kunde nr." + i); b.kontiene[i].settInn(100); }

14 14 Forskjeller mellom klasser og metoder  Begge lager objekter når de kalles, men:  Et metode-objekt:  fjernes når metoden returnerer  inneholder ’bare’ variable og parametere som alle er skjult for resten av programmet  Et objekt laget med new fra en klasse:  er i hukommelsen etter at det er laget (så lenge det minst er en peker som peker på det)  kan inneholde både metoder og variable, som kan nyttes av resten av programmet (med en peker og.)

15 15 Ikke alt i et objekt bør være synlig fra resten av programsystemet - innkapsling  Vi ønsker ofte at resten av systemet bare skal se deler av et objekt  eks: int saldo i Konto1-objektet bør være skjult, resten av programmet skal bare bruke settInn() og taUt() metodene.  Vi kan regulere tilgangen til variable og metoder ved å sette enten :  private  public  protected  foran en metode eller deklarasjonen av en variabel

16 16 For ’sm娒 systemer hvor alle.java filene ligger på samme filområde, gjelder:  Skriver vi:  ingenting foran en deklarasjon/metode, så er slike deklarasjoner fullt tilgjengelige for alle annen kode kompilert på samme filområde, men usynlig /sperret for kode kompilert på andre filområder.  private foran en deklarasjon/metode, så er den bare synlig fra kode i metoder deklarert i samme klasse, usynlig/sperret for all annen kode  protected foran en deklarasjon/metode, så er den synlig i samme klasser og subklasser og synlig i klassene på samme filområdet, men usynlig/sperret i andre klasser (på andre filområder).  public så er metoden/variabelen synlig for all annen kode.  Slik delvis sperring av adgang til særlig variable, sikrer oss at vi kan bestemme fullt ut selv i en klasse hvordan en variabel skal endres.

17 17 Klassediagrammer  En mer kompakt måte enn objektdiagrammer å tegne sammenhengen i programmet  Skiller seg fra objektdiagrammer ved at vi ikke direkte tegner datastrukturen (pekere og pekerarrayer), men bare forhold (assosiasjoner, forbindelser) mellom klassene.  I klassediagrammer dokumenterer vi også sentrale metoder.  Forholdene er linjer med et logisk navn og antall objekter i hver ende  Anta at vi har laget en class Konto med tre objektvariable: saldo, eier og adresse og en metode: settinn().

18 18 Tre (fire) mulig felter i tegning av en klasse  Navnefeltet (alltid)  klassenavnet Kan utelates:  Variabelfeltet (attributtene)  variabelnavn evt. med type  Metode-feltet  Evt med parametere og returverdi  (Unntaks-feltet) Symboler for synlighet (fra resten av programmet) + public - private # protected ~ package

19 19 UML Klassediagrammet kan nyttes til  Modell av problemområdet (domenemodell)  Modell av klassene i programmet (+ modell av databasen,....)  Men siden vi skal modellere virkeligheten en- til-en i programmet vårt, så blir de like i utgangspunktet

20 20 Forhold mellom klasser  En student har null eller flere eksamener  Vi tegner et forhold mellom to klasser som har med hverandre å gjøre logisk sett,og  hvor vi i programmet vil kunne følge pekere for å få adgang til variable eller metoder  Vi skriver hvor mange objekter det maksimalt på ett tidspunkt kan være på hver side av et slikt forhold  Siden vi med: Eksamen mener en avlagt enkelt-eksamen vil en Eksamen bare være tilknyttet en bestemt student

21  Forbindelsen leses fra venstre: En student har tatt null, en eller flere Eksamener”  Antallet objekter angis slik: Navnet på forbindelsen antall Student antall Eksamen

22 22 Studentregister2  Et studentregister holder orden på studentene og kursene, og en student tar 3 kurs hvert semester

23 Sammenligning: Objektdiagram og Klassediagram

24 24 Regler for å plassere riktige antall på et forhold 1. Anta at du står i ett objekt av en klasse og ser over til (langs en forbindelse) til en annen klasse: 2. Hvor mange objekter ser du da maksimalt på et gitt tidspunkt av den andre klassen 3. Det antallet noteres (jfr. tabellen) på den andre siden 4. Du går så over forbindelsen til den andre klassen og antar at du nå står i ett objekt av denne klassen og gjenntar pkt. 1-3

25 25 Hvilke forhold skal vi ha med i klassediagrammet  Slike forhold hvor ett objekt av den ene klassen:  inneholder  består av  eier,.. en eller flere objekter av den andre klassen  Det vi i programmet vil følge en peker for å få tak i verdien på visse variable i den andre klassen eller kalle en metode. Det er da ikke ’naturgitt’ hvilke forhold vi har i et klassediagram, det avhenger av hvilke spørsmål vi vil være interessert i å svare på.

26 26 Et større eksempel – class Konto  Hvordan representere en konto med private og get/set –metoder  SettInn() og taUt() og overførTilAnnenKonto() er set- metoder  giSaldo() er en get-metode  I større systemer lar vi aldri andre klasser direkte endre variable, men går ’alltid’ via get- og set- metoder

27 class Konto { private static int nummer = 0; private int kontonummer, saldo; private String eier, adresse; Konto() { saldo = 0; bestemKontonummer(); } Konto(String e, String adr, int s) { eier = e; adresse = adr; saldo = s; bestemKontonummer(); } void bestemKontonummer() { nummer++; kontonummer = nummer; } void settInn(int innskudd) { saldo = saldo + innskudd; } boolean taUt(int uttak) { if (uttak > saldo) return false; saldo = saldo - uttak; return true; } boolean overførTilAnnenKonto(Konto tilKonto, int beløp) { if (taUt(beløp)) { tilKonto.settInn(beløp); return true; } else return false; }

28 int giSaldo() { return saldo; } } // end class Konto class Bank { public static void main ( String[] args) { Bank b = new Bank(); Konto a = new Konto(); a.settInn(500); Konto k = new Konto("Arne M", "Ifi, UiO", 1000); System.out.println("a.saldo" + a.giSaldo() + ", k.saldo:" + k.giSaldo()); a.overførTilAnnenKonto(k, 400); System.out.println("a.saldo" + a.giSaldo() + ", k.saldo:" + k.giSaldo()); }} >java Bank a.saldo500, k.saldo:1000 a.saldo100, k.saldo:1400


Laste ned ppt "Uke 9 - Repetisjon av metoder, klasser og objekter, Mer om: Klassediagrammer, private og public 14 okt. 2003, Arne Maus Inst. for informatikk, UiO."

Liknende presentasjoner


Annonser fra Google