uke 9 - repetisjon av metoder, klasser og objekter, mer om: klassediagrammer, private og public

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

Upload: lovie

Post on 09-Jan-2016

35 views

Category:

Documents


1 download

DESCRIPTION

Uke 9 - Repetisjon av metoder, klasser og objekter, Mer om: Klassediagrammer, private og public. 14 okt. 2003, Arne Maus Inst. for informatikk, UiO. Ta flervalgstestene !!. De minner om hvordan deler av eksamen vil bli. God trening til eksamen. Oversikt. Repetisjon metoder - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

Uke 9 -Repetisjon av metoder, klasser og

objekter, Mer om: Klassediagrammer, private og

public

14 okt. 2003,Arne Maus

Inst. for informatikk, UiO

Page 2: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

2

Ta flervalgstestene !!

De minner om hvordan deler av eksamen vil bli.

God trening til eksamen

Page 3: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

3

Oversikt

Repetisjon metoder klasser og objekter

Klassediagrammer Public, private, protected og ’package’ Get- og set-metoder for variable Et eksempel Konto

Page 4: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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)

Page 5: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 6: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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.

Page 7: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 8: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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 .......

Page 9: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 10: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 11: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 12: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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 26529

BIL. eier:Ola Nord, nummer:BD 26529

b

b

eier

regNum

Page 13: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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); }

}}

Page 14: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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 .)

Page 15: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 16: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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.

Page 17: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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().

Page 18: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 19: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 20: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Student Eksamen

-har tatt

1

-

*

Page 21: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

Forbindelsen leses fra venstre:En student har tatt null, en eller flere Eksamener”

Antallet objekter angis slik:

Student Eksamen

-har tatt

1

-

*

Navnet på forbindelsen

antall Studentantall Eksamen

Page 22: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

22

Studentregister2

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

Student

StudentRegister2

Kurs

-Er registrert i*

1

-Tar

1..* 3

-Holder rede på

1

- 3..*

Page 23: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

Sammenligning: Objektdiagram og Klassediagram

mineKursnavn : String

: Student

infKursstud

: StudentRegister2

kurskodeeantStudenter : int

studentene

: Kurskurskodee

antStudenter : intstudentene

: Kurs

Student

StudentRegister2

Kurs

-Er registrert i*

1

-Tar

1..* 3

-Holder rede på

1

- 3..*

Page 24: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 25: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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å.

Page 26: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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

Page 27: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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;

}

Page 28: Uke 9 - Repetisjon av metoder, klasser og objekter,  Mer om: Klassediagrammer, private og public

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