INF1000 Klasser og objekter



Like dokumenter
INF1000 Metoder. Marit Nybakken 16. februar 2004

INF1000 HashMap. Marit Nybakken 2. november 2003

Enkle generiske klasser i Java

INF1000. Marit Nybakken 10. februar 2004

Oblig 4Hybelhus litt mer tips enn i oppgaven

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF Uke 10. Ukesoppgaver oktober 2012

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Klasser, objekter, pekere og UML. INF gruppe 13

INF1000: Forelesning 6. Klasser og objekter del 1

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

INF1000 Behandling av tekster

INF1000: Forelesning 7

INF1000: noen avsluttende ord

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

INF1000: Forelesning 7. Konstruktører Static

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

INF1010 Arv. Marit Nybakken 2. februar 2004

2 Om statiske variable/konstanter og statiske metoder.

INF1000 Mer om objekter

INF1010 MVC i tekstbaserte programmer

Løsningsforslag til eksamen i INF1000 våren 2006

UNIVERSITETET I OSLO

løsningsforslag-uke5.txt

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Java-kurs. Andreas Knudsen Nils Grimsmo 9th October 2003

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

INF1000 Prøveeksamen Oppgave 7 og 9

UNIVERSITETET I OSLO

Introduksjon til objektorientert programmering

Programmering i C++ Løsningsforslag Eksamen høsten 2005

UNIVERSITETET I OSLO

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

INF1010 UML. Marit Nybakken 26. januar 2004

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Eksamen. Objektorientert Programmering IGR 1372

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

IN våren 2019 Onsdag 16. januar

Forelesning inf Java 5

INF våren 2017

Forelesning inf Java 5

IN våren 2018 Tirsdag 16. januar

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

UNIVERSITETET I OSLO

Snake Expert Scratch PDF

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Steg 1: Streken. Steg 2: En hoppende helt. Sjekkliste. Sjekkliste. Introduksjon. Hei der! Hoppehelt

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

TDT4100 Objektorientert programmering

Argumenter fra kommandolinjen

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Velkommen til. INF våren 2016

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

UNIVERSITETET I OSLO

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Dagens tema Kapittel 8: Objekter og klasser

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

UNIVERSITETET I OSLO

Oblig 3 tips litt mer tips enn i oppgaven

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

praktiske eksempler DOM Document Object Model DOM og Høst 2013 Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

Repetisjon. INF gruppe 13

UNIVERSITETET I OSLO

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

INF1000 oppgaver til uke 38 (17 sep 23 sep)

UNIVERSITETET I OSLO

med canvas Canvas Grafikk Læreplansmål Gløer Olav Langslet Sandvika VGS

UNIVERSITETET I OSLO

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

Så hva er affiliate markedsføring?

UNIVERSITETET I OSLO

Jentetreff INF1000 Debugging i Java

Løse reelle problemer

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

UNIVERSITETET I OSLO

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Fra Python til Java, del 2

UNIVERSITETET I OSLO

Transkript:

INF1000 Klasser og objekter Marit Nybakken marnybak@ifi.uio.no March 1, 2004 Dette dokumentet skal tas med en klype salt og forfatter sier fra seg alt ansvar. Dere bør ikke bruke definisjonene i dette dokumentet på eksamen, de er bare ment som en forklaring, ingen streng definisjon. Motivasjon Kurt eier en geitefarm. Han driver oppdrett av geiter med vanlig pels og angorapels. Geitene han avler på kan ha mange farger, hvit, sort, rød, grønn og blå. De kan også ha ulike tegninger: striper, prikker og sjakkmønster. Han avler også frem syngende geiter, og trener dem opp til å synge mange forskjellige sanger, mest innenfor svensk folkemusikk, Evert Taube og desslike, og han har en liste over alle sangene som de syngende geitene har lært. Ikke alle geitene kan synge, men alle kan breke. Kurt selger videre geiter til andre oppdrettere og til folk som ønsker en syngende geit som husdyr. For å få fart på omsetningen, ønsker han å lage en webside med presentasjon av alle geitene sine, og har vendt seg til deg for å be om hjelp. Kurt har satt opp webcamera og mikrofon i alle båsene. Folk skal kunne se på video av hver enkelt geit og få vite all informasjon som Kurt har om geiten. De skal kunne søke på geiter som har en bestemt farge, pels eller mønster. I tillegg skal man kunne se stamtavlen til hver geit. Man kan også stille en geit et spørsmål som den kan legge ut svar på når den har tid, eller høre den synge en sang fra repertoaret. Man skal også kunne se hva slags killinger man sannsynligvis vil få hvis man parrer to fritt valgte geiter med hverandre. Kurt har selvfølgelig all slik informasjon liggende, siden han er en ekspert på geiter fra barnsben av. Når Kurt ikke avler på geiter, driver han med traktorpulling og atomfysikk. 1

Figure 1: Her er Kurt Han er en hyggelig fyr, og liker å slappe av med en kopp te og Nytt på Nytt på NRK1. Du vil derfor ikke få noe problem med å samarbeide med ham, så lenge du takler geitelukten. Han vil bare at du skal lage et fint system til ham, så skal han fylle inn informasjonen selv. Du klør deg i hodet. Dette høres ut som en enorm oppgave. Hvor mange arrayer kan man komme til å trenge her for å få lagret all informasjonen om geitene? Og når du endelig har fått alle haugene av String-arrayer på plass, hvordan skal du klare å konsentrere deg lenge nok av gangen til å lage alle de dusinvis av indre for-løkkene som skal til for å finne igjen all informasjon om en geit? Og hvordan skal du få stilt den et spørsmål og hørt den synge? Klasser og objekter Objektorientering er en ny og for dere uvant måte å dele opp det et program skal gjøre på og dataene det skal inneholde. Vi er nå nødt til å starte litt fra bunnen av igjen og for øyeblikket glemme det vi har lært om arrayer, løkker, variable og metoder som måter å skrive et program på. Vi skal se på programmet vi skal lage på et litt høyere nivå. Vi vil at det først og fremst skal bestå av en samling med geiter. Hver geit har en rekke egenskaper. Blant disse har vi 2

alder vekt kjønn farge pelstype tegning navn og kanskje idnummer og kanskje syngeferdigheter En geit har også to andre geiter som mor og far. Den har kanskje også flere kull bestående av en rekke geitekillinger, som jo er geiter igjen. I tillegg til å ha egenskaper kan geitene også utføre oppgaver. Disse vil være å synge (eventuelt bare breke) svare på spørsmål. parre seg med andre geiter Ut i fra dette lager vi oss en oppskrift på hva en geit er. Vi gjør dette ved å lage oss en ny klasse Geit. Enhver egenskap en geit kan ha representerer vi med en variabel, deklarert utenfor metodene. Enhver oppgave en geit kan utføre, represesenterer vi med en metode. // Definisjonen av en geit class Geit { // Egenskapene til en geit int alder, idnummer, syngeferdigheter; double vekt; boolean kjønn, pelstype; String farge, tegning, navn; Geit mor, far; // peker på mor og far 10 Geit [ ] killinger; // Oppgavene en geit kan utføre void syng(string sang) { 3

// Syng en sang String svarpåspørsmål(string spørsmål) { // Så hvordan er det egentlig å være en geit? 20 // Jo, nå skal du høre... Kull parrdeg(geit make) { // En helt naturlig del av livet på en bondegård Jassånå, tenker du. Nå har du laget en geit til programmet. Men vi skal jo ha hundrevis, kanskje tusenvis av geiter. Må vi lage en tilsvarende klasse Geit2, Geit3 osv opp til Geit4700? Nei, det trenger vi ikke. Det vi har laget er en slags Geitedefinisjon. Når vi har denne definisjonen, kan vi ut i fra den lage oss så mange geiter vi bare vil ved å lage objekter av klassen Geit. Et objekt lager vi ved å si new Geit(). Imidlertidig vil geita bare stikke av igjen hvis vi bare skriver new Geit(); på en linje. Vi er nødt til å feste et halsbånd til geita, så vi kan få tak i henne senere. Dette gjør vi ved å lage oss en Geite-peker som vi setter til å peke på objektet: Geit geitami; // Lager en Geite-peker Geit enannengeit; // lager nok en Geitepeker geitami = new Geit(); // Lager en ny geit, og setter pekeren geitami til å peke på den så den ikke stikker av enannengeit = new Geit(); // Lager nok en geit og setter den andre pekeren til å peke på den. Geit nokengeit = new Geit(); // Gjør begge deler på en linje. Nå har vi laget oss tre geiter. Foreløpig har vi ikke gitt geitene forskjellige egenskaper, så vi kan ikke akkurat se forskjell på dem. Vi skal derfor endre på objektvariablene til hvert objekt. Dette er altså de variablene som vi deklarerte helt på toppen. geitami.navn = "Torstein"; geitami.farge = "Blå"; enannengeit.navn = "Hjørdis"; enannengeit.farge = "Rød"; nokengeit.navn = "Kjartan II"; nokengeit.farge = "Hvit"; 4

Nå er det lett å se forskjell, geitene har forskjellig farge og har forskjellige navn. Det er viktig å huske på at hvis man endrer på objektvariablene til ett objekt, så gjelder ikke det for alle de andre objektene. Hvis jeg kaller den ene geita mi for Hjørdis, så betyr ikke det at alle de andre også heter Hjørdis, de fortsetter å hete Torstein og Kjartan. Du har også ditt eget navn, studentnummer, mor og far, hybel og teddybjørn. Du deler ikke dette med hele verden. Hvert objekt har på samme måte sine kopier av objektvariablene, slik at vi kan lagre info per objekt. Det samme gjelder metodene i objektet. Hvis du ber en geit om å synge, får du ikke det samme resultatet som hvis du ba en annen geit om å synge. Det avhenger av geitas syngeferdigheter, kjønn og alder (avgjør bass/tenor/sopran) kanskje arv og opplæring fra mor og far, og en masse andre forhold. Vi kan kalle en metode i et av geiteobjektene på denne måten geitami.syng( Calle Schewens vals ); Altså objektpeker.metodenavn(parametre); Da kalles metoden nettopp i geiteobjektet som pekes på av geitami, den som heter Torstein og er blå. Hvis Torstein tidligere ble satt til å være 1 år og syngeferdighetene hans er gode, vil han muligens synge Calle Schewen med en lys og vakker tenor. Kurt har laget en sangliste til oss, med alle de sangene som han lærer opp geitene i. Alle geitene skulle gjerne ha hatt denne tilgjengelig. Ofte kan ikke brukerne av websiden noe om svensk folkemusikk, og ber bare en geit om å synge en tilfeldig sang. Da hadde det vært praktisk om geitene kunne delt en liste over alle sangene, kanskje med tittel, forfatter noter og tekst, slik at de ikke får panikk og scenefrykt og plutselig ikke husker noen av sangene. Vi lager oss derfor en klasse Sang: // Definisjonen på en sang class Sang { // Egenskapene til en sang String tittel; String forfatter; Image noter; String tekst; 5

final String nasjonalitet = "Svensk"; // er bare det som 10 // rocker på geitefarmen // En sang kan vise seg selv frem // på forskjellige måter, alt etter hva som er praktisk // for geita void visnoter() { // Hent frem bildet av notene og vis det på skjermen? void vistekst() { // Vis frem teksten på skjermen, pent formatert med // vers og understrekning av ordrim 20 og geitene skal nå dele på en liste av alle sangene // Definisjonen av en geit class Geit { static Sang [ ] fellesrepertoar; // Egenskapene til en geit int alder, idnummer, syngeferdigheter; double vekt; //... osv 10 Legg merke til static foran Sang-arrayen. Dette betyr at alle objektene deler på arrayen. Arrayen er en klassevariabel. Hvis du legger til en sang, sletter en sang eller endrer på en sang i arrayen, så synes dette for alle objektene. Dette er riktig bruk at static, vi bruker det til å la objektene dele variable. Kurt vil nå legge til en sang til repertoaret. Vi lager først et nytt Sang-objekt med informasjonen om sangen Sang nysang = new Sang(); nysang.navn = "Rosa på ball"; nysang.forfatter = "Evert Taube"; nysang.tekst = "Tänk att jag dansar med Andersson\n" + "lilla jag, lilla jag med Fritiof Andersson.\n" + "Tänk att bli uppbjuden av en så n populär person.\n";.... + noter da. 6

Figure 2: Og her er Torstein Man har nå to måter å putte inn sangen i fellesarrayen. Man kan enten si Geit.fellesrepertoar[antall_sanger] = nysang; Altså, bruke Klassenavn.arraynavn. Eller vi kan gå via en av geitene geitami.fellesrepertoar[antall_sanger] = nysang; Altså, pekernavn.arraynavn. Det spiller ingen rolle hvilken av geitene vi her bruker, da arrayen er den samme for alle geitene. Nå er det kanskje noen som lurer litt på hvor all denne koden som lager geiter og styrer rundt med geitene skal ligge. Og hvor skal vi lagre alle pekerne til geitene? Skal den ligge i klassen Geit? Nei, absolutt ikke. En geit er et ganske ignorant vesen, den vet bare om seg selv, hva den heter, hvilken farge den har, hva den veier, og bryr seg ikke med alle de andre geitene (med mindre det dreier seg om å lage geitebarn). Kun programkode for egenskaper som en geit har og oppgaver den kan utføre skal ligge inni denne klassen. 7

Når vi støter på slike problemer kan vi heller prøve å forestille oss hvordan det fungerer i den virkelige verden. Hvor befinner alle geitene seg? Jo, de befinner seg på geitefarmen, eventuelt i fjøset. Dette gir opphav til en ny klasse Geitefarm, der alle geitene skal være. Når man er i geitefarmen, kan man også tusle rundt, lete etter geiter med bestemte farger, bestemte navn, osv. // En farm har mange geiter.... class Geitefarm { Geit [ ] allegeitene = new Geit[1000]; int antall geiter = 0; String bestyrer; Inn tast = new Inn(); 10 void meny() { // Her kan Kurt styre geiteregisteret while(<ikkeavslutt>) { // Legg til en geit // Parr en geit med en annen geit // Søk etter geit 20 // Her kan Kurt legge til en geit i registeret void leggtilgeit() { // Lag den nye geiten Geit g = new Geit(); // Les inn informasjon og lagre i geiteobjektet 30 System.out.print("Navn: "); g.navn = tast.instring(); System.out.print("ID: "); g.idnummer = tast.inint(); System.out.print("Kjønn? M/F "); tast.skipwhite(); char kjonn = tast.inchar(); if(kjonn == M ) g.kjonn = false; else 40 g.kjonn = true; // osv... // Legg geita inn i registeret allegeitene[antall geiter] = g; 8

antall geiter++; // Søk etter geiter med en bestemt farge 50 void finngeitermedfarge() { System.out.println("Farge: "); String farge = tast.instring(); for(int i=0;i<antall geiter;i++) { if(allegeitene[i].farge.equals(farge)) { // Geit funnet, vis informasjon 60 // Finn en geit med en bestemt id Geit finngeit(int id) { for(int i=0;i<antall geiter;i++) { if(allegeitene[i].id == id) { return allegeitene[i]; return null; 70 // Få en bestemt geit til å synge en sang void fågeittilåsynge(int geiteid, String sang) { Geit g = finngeit(geiteid); g.syng(sang); Vi har her altså en array der vi kan lagre pekerne til alle geiteobjektene. Dette er egenskapen til geitefarmen, den har mange geiter i båser, hver plass i arrayen representerer en bås der det kan stå en geit. Vi legger en peker inn i arrayen/binder fast halsbåndet til geita til båsen ved å skrive allegeitene[båsnummer] = geitepeker; Da vil det for fremtiden være slik at allegeitene[båsnummer] også peker på dette Geite-objektet. Geitefarmen vet også hvor mange geiter den har i alt. Siden det er den som lagrer geitene, er det også den som må kunne legge til nye geiter, fjerne geiter (hvis en geit dør), søke blant geitene og få geitene til å utføre oppgaver. Den har derfor metoder for hver av disse oppgavene. 9

Hvorfor har vi ikke satt alle metodene og variablene til static i klassen Geitefarm? Vi skal fra nå av som oftest unngå det. Statiske metoder og variable skal brukes der det gir mening å bare ha ett eksemplar. I teorien kan vi tenke oss at vi etterhvert ville utvide programmet vårt med flere geitefarmer. Kanskje Kurt går i samarbeid med resten av geitefarmene i området for å øke den genetiske variasjonen. Da har vi behov for å lage flere objekter av klassen Geitefarm, en for hver farm. Dette ville ikke gå hvis alle metodene og geitearrayen var static. Alle programmer startes i main-metoden, og den har vi ikke laget enda. Vi skal nå lage oss en siste klasse som kun inneholder main og starter opp geitefarmen til Kurt. // Denne klassen starter bare opp registeret class GeitefarmMain { public static void main(string [ ] args) { Geitefarm f = new Geitefarm(); f.bestyrer = "Kurt"; f.meny(); 10 Her lages det nå en ny geitefarm, bestyreren av farmen settes til å være Kurt og vi starter opp menyen i objektet. Denne menyen vil fortsette å kjøre til brukeren på en eller annen måte velger å avslutte, og da avslutter samtidig programmet. Konklusjon Vi har nå sett en ny måte å programmere på. Vi prøver å modellere programmets verden med objekter som har bestemte egenskaper, og lar disse objektene interaktere med hverandre ved hjelp av metoder. Vi får dermed et mer intuitivt og oversiktlig program, i og med at det minner mye mer om den verden vi forsøker å representere med programmet vårt. Programmet er selvfølgelig langt fra ferdig. Andre klasser kan etterhvert komme inn. Kanskje vi ønsker oss en Bestyrer-klasse for bestyrerne av geitefarmene. Vi så også at geitene hadde en array av Kull. Kull må da være en 10

klasse som inneholder informasjon om et geitekull, med fødselsdato, far og en liste med geiter, og den har vi heller ikke laget. Vi trenger også et webinterface til Geitefarmklassen, med metoder som kommuniserer med geitefarmen og henter ut informasjon om geitene. Kanskje ønsker vi også å lagre mer informasjon om brukerne av websystemet, for eksempel lagre navn, adresse, brukernavn og passord, og da kommer det fort inn en klasse WebBruker. Og så videre. Selv om modellering med objekter kan gjøre programmene lettere å holde oversikten over, kan vi fremdeles fort lage kaos. Vi skal senere lære mer om hvordan vi kan planlegge pg dokumentere objektorienterte programmer ved hjelp av diagrammer. 11