Grunnkurs i objektorientert programmering Hjelpehefte for studenter som tar INF101,



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

2 Om statiske variable/konstanter og statiske metoder.

INF 1000 høsten 2011 Uke september

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

INF1000 undervisningen INF 1000 høsten 2011 Uke september

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

INF1000 (Uke 4) Mer om forgreninger, While-løkker

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

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

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

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

INF1000 : Forelesning 1 (del 2)

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

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter denne uken! Klart for første oblig

INF1000 Uke 4. Innlesning fra terminal. Uttrykk og presedens. Oversikt

Forelesning inf Java 5

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

Forelesning inf Java 5

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

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

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

INF1000 : Forelesning 3

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

som jobbet nærmest døgnet rundt i 18 måneder i Menlo Park i California for å forberede den neste bølgen innen computing.

Litt Java-historikk. Litt Java-historikk. Ulike varianter for ulike behov. Litt Java-historikk. The Green Team

Enkle generiske klasser i Java

Forelesning inf Java 3

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

INF1000 : Forelesning 4

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

Kapittel 1 En oversikt over C-språket

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

Velkommen til. INF våren 2016

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Eksempel: Body Mass Index (BMI)

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

UNIVERSITETET I OSLO

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

Del 1 En oversikt over C-programmering

Programmeringsspråket C

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

INF 1000 høsten 2011 Uke 3 6. september

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

UNIVERSITETET I OSLO

Innhold uke 3. INF 1000 høsten 2011 Uke 3 6. september. Uttrykk. Variabel: En plass i hukommelsen

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter i dag! Klart for første oblig

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Forelesning inf Java 1

INF Uke 10. Ukesoppgaver oktober 2012

Forelesning inf Java 1

Gjennomgang av eksamen H99

2 Om statiske variable/konstanter og statiske metoder.

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

INF1000 Uke 3. Innlesning fra terminal. Uttrykk og presedens. Oversikt. Litt repetisjon Blokker og forgreininger

Argumenter fra kommandolinjen

INF1000: Forelesning 7. Konstruktører Static

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

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

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.

Blokker og metoder INF1000 (Uke 6) Metoder

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

TEMA: Kommunikasjon med Bruker INF1000 Plenumsgruppe 1, formatert utskrift

TDT4100 Objektorientert programmering

Mer om uttrykk, terminal I/O, forgreninger. Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo

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

UNIVERSITETET I OSLO

Jentetreff INF1000 Debugging i Java

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

INF1000 Metoder. Marit Nybakken 16. februar 2004

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Løsningsforslag ukeoppg. 2: 31. aug - 6. sep (INF Høst 2011)

Forelesning inf Java 3

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

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

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

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

INF1000: Forelesning 7

INF1000: noen avsluttende ord

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

Blokker. Uke 4, INF 1000, 13 sept Løkker og arrayer. Eksempel. Deklarasjoner inne i blokker. Institutt for Informatikk Universitet i Oslo

Feilmeldinger, brukerinput og kontrollflyt

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

Løse reelle problemer

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Hva er en metode. Hva skjer når vi kaller en metode

Oversikt. Hva er programmering & Java forkurset til INF1000. Hva er en datamaskin. Arne Maus Inst for Informatikk Univ. i Oslo

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

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

Transkript:

Grunnkurs i objektorientert programmering Hjelpehefte for studenter som tar INF101, Institutt for informatikk, Universitetet i Oslo Oslo, 15. august 2001

2

Innhold Forord... 5 Kapittel 1 - Hva er programmering?... 7 Å kommunisere med en datamaskin... 8 Programmeringsspråk... 9 Mer informasjon... 9 Kapittel 2 - Mitt første javaprogram... 11 Kompilering og kjøring... 12 Kommentarer... 12 Formatering... 13 Kapittel 3 - Variabler og tilordninger... 15 Hva er en variabel?... 15 Deklarasjoner og tilordninger... 15 Variabeltyper... 17 Mer om identifikatorer... 17 Kapittel 4 - Kontrollsetninger... 19 Booleske uttrykk... 19 If-setninger... 20 While-setninger... 21 For-setninger... 22 do while-setninger... 23 Switch-setninger... 23 Kapittel 5 - Objekter og klasser... 25 Objekter... 25 Klasser... 25 Referanser (pekere)... 26 Klasse/objekt-diagrammer... 27 Bruk av static... 28 Kapittel 6 - Innlesing fra tastatur... 31 Hvordan lese fra tastatur... 31 Inn-klassen... 32 Kapittel 7 - Metoder... 35 Hvordan bruke metoder... 35 Hvorfor bruke metoder... 35 Enkle metoder... 36 Kapittel 8 - Arrayer og hashtabeller... 37 Hva er en array?... 37 Hvordan lage en array... 37 Hvordan bruker vi en array... 37 Hvordan gå gjennom en array... 38 Et eksempel... 38 En spesiell array... 39 Arrayer med referanser... 40 Todimensjonal array... 41 Hva er en hashtabell?... 42 Hvordan bruke en hashtabell... 42 Hvordan gå gjennom alle elementer i en hashtabell (Iterator)... 44 Et stort eksempel... 44 3

Valg mellom bruk av array eller hashtabell... 46 Kapittel 9 Klasse/objekt-diagrammer... 47 Kapittel 10 - Filbehandling Inn- og Ut-klassene... 51 Skrive til fil... 51 Formatering av tall for utskrift... 52 Lese fra fil... 53 Teste om slutten av filen er nådd... 53 Om filstruktur... 54 Array og filer... 54 Hashtabell og filer... 54 Kapittel 11 - Unntak (exceptions)... 55 Sende unntaket videre... 55 Fange unntaket... 56 Mer enn ett unntak... 56 Exceptions kompilatoren oppdager... 57 Exceptions under kjøring... 58 Inn- og Ut-klassen... 58 Kapittel 12 - Mer om metoder... 59 Hva er parametre?... 59 Returverdier... 60 Eksempel på bruk av metoder... 61 Konstruktører... 62 Om public og private... 63 Kapittel 13 - Subklasser... 65 Hva er subklasser?... 65 Hvordan lage subklasser... 65 Referanser og typekonvertering... 65 Alle klasser er subklasser... 67 Hvorfor bruke subklasser... 67 Eksempel på bruk av subklasser... 68 Hvordan tegne subklasser... 69 Feil å unngå... 69 Subklasser og filer... 70 Hva slags objekt har vi (instanceof)... 70 Kapittel 14 - Tekststrenger... 73 Hva er strenger?... 73 Hvordan bruke strenger... 73 Hvordan tegne strenger... 73 Operasjoner på strenger... 73 Et eksempel... 75 Kapittel 15 - Bruk av Java-pakker og dokumentasjon... 77 Hva er en pakke og import... 77 Bruk av dokumentasjonen... 78 Hvordan få tak i klassene Inn og Ut, og classpath... 79 Hvordan få tak i klassene Inn og Ut, og classpath... 80 Appendix A: Klassen Inn... 81 Appendix B: Klassen Ut... 87 4

Forord Velkommen til INF101 - grunnkurset i objektorientert programmering ved Institutt for Informatikk ved Universitetet i Oslo. I løpet av kurset skal du lære om programmering, og det programmeringsspråket vi kommer til å benytte oss av heter Java. Hensikten med dette heftet er å gi en kortfattet innføring i endel sentrale begreper i kurset, samt å vise gjennom en rekke eksempler hvordan man kan gjøre ting i Java. Heftet kan forhåpentlig også fungere som et oppslagsverk for endel av de viktigste elementene i Java som undervises i kurset. Heftet er imidlertid ikke ment å være noen fullstendig lærebok, og dekker ikke alle sider av pensum. Det programmeringsspråket vi benytter i kurset - Java 1.3 - kan brukes på alle datamaskinene vi benytter her ved instituttet og kan dessuten installeres på enhver PC (Java 1.3 ligger på Ifi-CD'en som deles ut til alle fjernundervisningsstudentene og som øvrige INF101-studenter kan få på forespørsel; du kan også hente Java 1.3 over nettet fra http://www.javasoft.com/j2se/1.3/). De første versjonene av dette hjelpeheftet ble skrevet av Anders Brunland og Steinar Eliassen som et hjelpemiddel i et tidligere kurs i objektorientert programmering. Det er siden foretatt en omfattende restrukturering og revidering av teksten og nye avsnitt er føyet til. Ferdig blir vi aldri, og kommentarer mottas med takk. Kommentarer kan sendes til epostadressen: inf101@ifi.uio.no. August, 2001 Knut Hegna, Arne Maus, Ole Christian Lingjærde 5

6

Kapittel 1 - Hva er programmering? INF101 er et kurs i objektorientert programmering. Et program er et instruksjonssett (en oppskrift) som forteller en datamaskin hva den skal gjøre. Å programmere vil si å lage slike instruksjonssett for å få datamaskinen til å løse oppgaver for oss. Å programmere er noe de fleste av oss gjør fra tid til annen nesten uten å tenke over det, f.eks. når man programmerer en videospiller til å ta opp et bestemt tv-program neste dag, eller når man programmerer en vekkerklokke til å ringe en bestemt tid neste morgen. Noen har sikkert også programmert en kalkulator ved å få kalkulatoren til å huske en hel sekvens av tastetrykk, slik at man senere kan få utført alle tastetrykkene bare ved å trykke på en enkelt knapp. De programmene du skal lære å lage i INF101 skiller seg fra disse eksemplene ved at de ikke skal utføres av f.eks. en videospiller eller en vekkerklokke - de skal istedet utføres av en PC eller liknende (f.eks. en arbeidsstasjon, slik de fleste av maskinene på Institutt for Informatikk er). En PC eller en arbeidsstasjon består typisk av fire komponenter: en skjerm, selve maskinen (en boks som står under eller ved siden av skjermen), et tastatur og et redskap for å peke på skjermen (en "mus"). Ofte refererer vi til alle komponentene under ett som en datamaskin eller (av historiske årsaker) en terminal. Den siste betegnelsen skyldes at datamaskiner veldig ofte er knyttet sammen i store nettverk (dette gjelder også datamaskinene ved Institutt for Informatikk), og da danner hver enkelt datamaskin et endepunkt eller et terminalpunkt i dette nettverket. Personen som bruker datamaskinen kalles ofte brukeren. Det er lett å forstå hvorfor man skal programmere en videospiller (for å ta opp et program) eller en vekkerklokke (for å bli vekket). Men hva kan vi få en datamaskin til å gjøre for oss (det er jo f.eks. ikke særlig praktisk å bruke en datamaskin som vekkerklokke)? Noen eksempler på bruk er å programmere datamaskinen slik at den kan brukes som en avansert skrivemaskin (tekstbehandlingsprogram) som en avansert kalkulator (regnearkprogram) til å surfe på internett (nettleserprogram = web browser) for å holde orden på flyavganger og passasjerer (til bruk for et flyselskap) for å holde orden på kinoforestillinger og solgte/reserverte billetter for å holde orden på vareutvalg, varebeholdning og priser i en butikk for å beregne været imorgen (til bruk for meteorologer) 7

I løpet av kurset skal du lære nok om programmering til at du kan gå løs på mange av problemene i listen ovenfor (men mange av problemene forutsetter at du også kan mye annet - f.eks. må du kunne endel om meteorologi for å være i stand til å lage et program som beregner været imorgen med noenlunde presisjon og pålitelighet). Men i virkeligheten vil et godt program for å beregne været imorgen eller for å surfe på internett være mye større enn det vi har mulighet til å rekke i løpet av kurset, og derfor kommer vi i stor utstrekning til å se på problemer av enklere natur eller grove forenklinger av noen av problemene i listen ovenfor. Et eksempel på et veldig enkelt problem er å programmere datamaskinen slik at den skriver ut på skjermen følgende: "jeg er et javaprogram". Hvordan programmerer vi datamaskinen til å gjøre noe slikt (ønsker du svaret med en gang kan du gå til kapittel 2)? Vi kunne prøve å skrive setningen ovenfor på tastaturet og håpe det beste, men da oppdager vi fort at datamaskinen ikke forstår norsk (eller andre naturlige språk for den saks skyld). Vi er nødt til å formulere oss i et språk som datamaskinen behersker. Å kommunisere med en datamaskin For å kunne gjøre noe som helst nyttig med en datamaskin er vi nødt til å kommunisere med den, og en vanlig måte å gjøre dette på er å bruke tastaturet og musen når vi skal fortelle datamaskinen noe skjermen når datamaskinen skal fortelle oss noe I tillegg er det ofte mulig å kommunisere med en datamaskin via et nettverk, f.eks. via internett, men det ser vi bort fra her. Hvordan kommuniserer vi så med datamaskinen ved hjelp av tastaturet og musen? Hvilke ord og tastetrykk forstår datamaskinen? Faktisk er det ikke noe entydig svar på det - det kommer helt an på hvilket program som kjører på datamaskinen, for: Når vi kommuniserer med datamaskinen så skjer det alltid via et program som kjører på datamaskinen, og det er dette programmet som bestemmer hvilke tastetrykk og musebevegelser som er meningsfylte og hvilken mening de skal ha. En datamaskin inneholder vanligvis mange (tusenvis av) forskjellige programmer, og vanligvis er det flere av disse som kjører samtidig. Et program som alltid kjører når datamaskinen er på, er det såkalte operativsystemet. På de fleste maskinene ved Institutt for Informatikk heter dette operativsystem-programmet Unix, mens de fleste hjemme-pc'er har et av operativsystemprogrammene Windows (f.eks. Win98) eller Linux. Operativsystemet utfører en rekke oppgaver, og en av de er å gjøre datamaskinen istand til å kommunisere med en bruker via tastatur, mus og skjerm. Enten du sitter ved en av instituttets maskiner eller din egen PC, er operativsystemet typisk det første du kommer i kontakt med når du har logget inn (eller for hjemme-pc: slått på maskinen). Noen av tingene du kan fortelle operativsystemet ved å bruke tastatur eller mus er å: starte å kjøre et annet program (kanskje et dataspill, eller et program du har laget selv) skrive ut noe på en skriver ("printer") vise fram noe på skjermen logge ut (eller for hjemme-pc: slå av maskinen) Hvis vi ønsker mer avansert kommunikasjon med datamaskinen enn dette (f.eks. fortelle datamaskinen nøyaktig hvordan den skal oppføre seg slik at den kan brukes av en kino til å holde orden på kinoforestillinger og solgte/reserverte billetter) så må vi kommunisere med datamaskinen ved hjelp av et programmeringsspråk. 8

Programmeringsspråk Et programmeringsspråk er et språk som kan brukes til å gi datamaskinen detaljerte instruksjoner om hvordan den skal oppføre seg, f.eks. hva den skal vise på skjermen, hva det skal bety når man trykker på bestemte taster, osv. Behersker du et programmeringsspråk kan du i praksis få datamaskinen til å gjøre hva som helst (innenfor rammen av hva datamaskiner kan få til, naturligvis). Programmeringsspråk skiller seg fra naturlige språk (som norsk, engelsk og spansk) ved at de har et veldig lite ordforråd (kanskje 100-200 ord) og en veldig enkel og veldefinert grammatikk. Mens det i naturlige språk er mange ord for å uttrykke f.eks. følelser, har ordene i et programmeringsspråk kun én hensikt: å fortelle datamaskinen hva den skal gjøre. Det finnes mange programmeringsspråk; det som benyttes i INF101 heter Java og er utviklet av firmaet Sun Microsystems (som også har laget endel av de datamaskinene vi bruker på Institutt for Informatikk). Den versjonen av Java vi benytter nå heter Java 1.3. For å kunne benytte Java, må datamaskinen først installere en programpakke som kalles Java 2 SDK Standard Edition, v 1.3. Denne programpakken (som allerede er installert på maskinene på Institutt for Informatikk, og som kan installeres på PC'er fra Ifi-CD'en som du kan få gratis ved å henvende deg i institutt-ekspedisjonen i 2. etg i Informatikkbygningen) inneholder blant annet programmer som må brukes hver gang du har laget et Java-program og ønsker å kjøre (utføre) det på datamaskinen. Mer informasjon INF101 er i første rekke et kurs i programmering, og vi kommer ikke til å si mer enn nødvendig om hvordan en datamaskin ser ut inni. Dersom du har lyst å lære mer om det, anbefaler vi at du bruker en nettleser (f.eks. netscape eller internet explorer) og går inn på Universitetets Senter for Informasjonsteknologi (USIT) sine informasjonssider om PC'er. Der finner du masse nyttig informasjon om datamaskiner, operativsystemer, internett, osv. Prøv f.eks. adressene http://www.usit.uio.no/it/pc/pcinfo/indxstrt/indxinnh.htm http://www.usit.uio.no/it/pc/pcinfo/educat/startedu.htm 9

10

Kapittel 2 - Mitt første javaprogram Nedenfor ser du et av de aller enkleste programmer som det er mulig å lage i Java. Vi skal her forklare noen aspekter ved dette programmet, men ikke alle (resten kommer senere i kurset). class MittProgram { public static void main (String[] argv) { System.out.println("Jeg er et javaprogram"); Når programmet blir kjørt, vil teksten «Jeg er et javaprogram» komme fram på skjermen. Dette programmet kan virke ubegripelig når man nettopp har begynt å lære programmering, men man trenger ikke forstå alle detaljene nå i starten. La oss ta for oss det viktigste. Vi ser først på rammen rundt programmet: class MittProgram {... Dette kalles en klassedeklarasjon (hele programmet er altså en klassedeklarasjon i dette tilfellet). Legg merke til at det brukes krøllparenteser her som viser begynnelsen og slutten på programmet. Hva class betyr, kommer vi tilbake til senere i heftet - foreløpig kan du bare tenke på det som en innpakning av programinstruksjonene, hvor innpakningen i dette tilfellet heter MittProgram. Hele programmet omtales derfor noen ganger som «klassen MittProgram». Navnet er valgfritt, men det kan være greit å følge disse normene: Ikke bruk de særnorske bokstavene («æ, ø, å») i klassenavn. Bruk av disse kan skape problemer når programmet skal kjøres, selv om programmet blir kompilert uten problemer. Bruk gjerne tall, men du kan ikke starte navnet med et tall. Begynn programnavnet med stor bokstav. Dersom navnet består av flere ord, skiller du mellom ordene ved å starte hvert ord med en stor bokstav slik som i «MittProgram». Du kan ikke ha mellomrom i programnavnet. Programmet skal lagres i en fil som heter det samme som programnavnet, og ha «.java» bak seg. Det betyr at programmet vårt skal lagres i en fil med navn «MittProgram.java». Det er viktig å få med seg de store og små bokstavene også i filnavnet. La oss se videre på programmet. Inne i klassen MittProgram ligger public static void main( String[] argv ) { System.out.println("Jeg er et javaprogram"); Ved å skrive public static void main(string[] argv) 11

lager vi startpunktet for javaprogrammet 1. Dette er også en deklarasjon (og er samtidig - som påpekt ovenfor - en del av deklarasjonen av hele klassen). Når vi starter et javaprogram, vil utføringen av programmet begynne her. Hva programmet skal gjøre, skrives mellom krøllparentesene { og. System.out.println("Jeg er et javaprogram"); fører til at setningen «Jeg er et javaprogram» skrives ut til skjerm. Denne type setninger kalles for handlingssetninger eller bare setninger. Setninger utføres i den rekkefølgen de står dvs. ovenfra og nedover. System.out.println er en standard javametode som brukes for å skrive tekst på skjermen. Inne i parentesen finner vi teksten som skal skrives ut på skjerm. Selve teksten står i anførselstegn. I Java avsluttes alle programsetninger med semikolon ( ; ). Det gjøres for at kompilatoren (et oversetterprogram, se nedenfor) skal kunne finne hvor en programsetning slutter og den neste begynner. Byggesteinene i et javaprogram er deklarasjoner og setninger. Ved å sette sammen ulike typer deklarasjoner og setninger kan vi få programmet til å gjøre (nesten) hva det skal være. I det første programeksemplet vårt var det to deklarasjoner (class MittProgram og public static void main(string[]argv) ) og én handlingssetning (System.out.println("Jeg er et javaprogram"); ). Foreløpig må du slå deg til ro med de to deklarasjonene. De må være med. I det neste kapitlet skal vi se på andre typer deklarasjoner og lære flere handlingssetninger. Kompilering og kjøring Før programmet kan kjøres, slik at vi kan se resultatet på skjermen, må det oversettes til et språk som er mer maskinnært. I programspråket Javas tilfelle, til et språk som kan forstås av den kunstige maskinen som kjører java-programmer (Java Virtual Machine, JVM). Denne oversettingen kalles kompilering, og oversetterprogrammet kalles kompilatoren. Kompilering av javaprogrammet over gjøres med kommandoen javac, slik: > javac MittProgram.java Kommandoen gis til unix, dos eller på annen måte, avhengig av programmerings-omgivelsene. Går kompileringen bra, vil du få en ny fil i filkatalogen : MittProgram.class. Denne filen er klar til å bli kjørt av JVM. Dette gjøres ved kommandoen java : > java MittProgram Legg merke til at man her ikke tar med filens etternavn (.class). En fullstendig sesjon med kompilering og kjøring vil da se slik ut: > javac MittProgram.java > java MittProgram Jeg er et javaprogram > Kommentarer Når vi kompilerer et javaprogram, vil kompilatoren prøve å oversette det vi har skrevet til kode som datamaskinen kan utføre, men ofte vil vi legge inn kommentarer i programkoden som kompilatoren ikke tar hensyn til. Disse kommentarene står der for at koden skal bli enklere å forstå for dem som leser den. Tekst som skrives mellom «/*» og «*/», og tekst som skrives på en linje etter «//» vil ikke bli kompilert, den blir oversett av kompilatoren. public static void main(string[] argv) { 1 argv er et navn du finner på selv, men det er vanlig å bruke enten argv eller args 12

// Skriv ut en tekst på skjermen. System.out.println("Jeg er et javaprogram"); /* * System.out.println("Denne teksten blir ikke skrevet ut * når programmet kjøres."); */ Formatering Kompilatoren bryr seg stort sett ikke om linjeskift og mellomrom. Det er derfor lovlig å skrive programeksemplet vårt slik: class MittProgram {public static void main(string[] argv) { System.out.println( "Jeg er et javaprogram"); Det er imidlertid vanlig å bruke innrykk og linjeskift for å gjøre koden oversiktlig. Emacs gir deg god hjelp til dette. Hvis du trykker tab-tasten vil linjen automatisk få «riktig» innrykk. Har du f.eks. glemt semikolon på slutten av en linje, vil du med en gang se det pga. innrykkene. Firmaet Sun har utarbeidet en standard for hvordan et javaprogram bør se ut 2. Noen steder i dette kompendiet avviker vi fra denne standarden. Som oftest er det av plasshensyn. Vi anbefaler på det sterkeste at du benytter deg av denne standarden (eller en annen). 2 http://java.sun.com/docs/codeconv/ 13

14

Kapittel 3 - Variabler og tilordninger For at et program skal kunne gjøre noe særlig fornuftig, trenger vi en måte å ta vare på forskjellige verdier. I første omgang skal vi se på verdier som enten er tall eller tekster. For å ta vare på en verdi, må vi ha et navn på verdien. I lærebøker kalles dette navnet for en identifikator. Dette navnet finner du på selv, men det er noen begrensninger på hva du kan kalle den. Disse begrensningene kommer vi tilbake til mot slutten av kapitlet. Hva er en variabel? Du kan tenke på identifikatoren eller navnet som en adresse til en bestemt lagerplass i maskinens minne. På denne lagerplassen kan vi legge en verdi som vi siden kan hente fram ved å oppgi adressen. Det som er spesielt, er at du på forhånd må si hva slags type verdier du har tenkt å legge på lagerplassen (tall, tekst, e.l.). 1. Den har et navn (identifikator) som du finner på selv. 2. Den har en type. 3. Den har en verdi som stemmer overens med typen. Verdien kan endres underveis i programmet (derav navnet variabel). Deklarasjoner og tilordninger Å deklarere en variabel vil si å sette av lagerplass i maskinens minne og gi denne lagerplassen et navn. Typen forteller maskinen hvor mye plass som skal settes av. int er en type som forteller at det skal settes av plass til et heltall. La oss ta et eksempel: class VariabelEksempel { public static void main(string[] args) { /*Først deklareres en variabel. Den er av typen * int. Vi kaller den for «lengde». */ int lengde; // Så gir vi variabelen «lengde» en verdi (et heltall) lengde = 3; /* Tilslutt skriver vi litt tekst og verdien i * variabelen «lengde» på skjermen. */ System.out.println("Verdien i variabelen lengde er " + lengde); Når vi skal lage en variabel, gjør vi det altså i to skritt: int lengde; Dette er deklarasjonen. Her sier vi hva navnet på variabelen skal være («lengde»), og hva slags type den er (int). lengde = 3; Dette er en tilordning. Vi gir variabelen en verdi (lagrer en verdi på lagerplassen). Tegnet for tilordning er altså =. Likhetstegnet betyr altså ikke det samme i Java som vi er vant til fra 15

matematikken. Det må her forstås og leses som "settes lik". Altså : verdien av variabelen lengde settes lik 3. Det er mulig å gjøre både deklarasjonen og en tilordning samtidig: int lengde = 3; Det er også mulig å gjøre flere deklarasjoner samtidig: eller int lengde, bredde; int lengde = 3, bredde; Når vi ønsker å skrive ut verdien av innholdet i en variabel, gjør vi det på samme måte som vi skriver ut tekst: System.out.println(lengde); For enkelhets skyld sier vi at vi «skriver ut (variabelen) lengde». For å skjøte tekst sammen med annen tekst eller variabler brukes + -operatoren. Når denne står i sammenheng med tekst, får den betydningen: «Slå sammen og lag en tekst.». Til nå har vi vist deg et eksempel der vi deklarerte en variabel og gjorde én tilordning, men det er mulig å gjøre flere tilordninger til samme variabel i løpet av programmet, dvs. at det legges en ny verdi på lagerplassen med den bestemte adressen (variabelnavnet). Den gamle verdien blir borte. class VariabelEksempel2 { public static void main(string[] args) { int lengde; lengde = 3; // tilordning nr. 1 System.out.println("Verdien i variabelen lengde er " + lengde); lengde = 7; // tilordning nr. 2 System.out.println("Nå er verdien " + lengde); lengde = lengde - 2; // tilordning nr. 3 System.out.println("Den siste verdien av lengde er " + lengde); Den andre tilordningen skulle være grei å forstå. Hvis du tenker tilbake på lagerplassen, så putter vi nå tallet 7 der. Den gamle verdien som lå der, blir borte. La oss nå se på den tredje tilordningen: lengde = lengde 2; Når denne utføres, regner maskinen først ut høyresiden lengde 2 Variabelen lengde har verdien 7 (fra forrige tilordning). Dermed regnes det ut hva 7 2 er. Neste skritt er tilordningen: lengde = Her legges resultatet av regnestykket på høyre side av = inn som ny verdi av variabelen på venstre side (som i dette tilfellet er lengde). Resultatet blir at verdien 5 tilordnes variabelen lengde. 16

Variabeltyper Som sagt må man bestemme hvilken type en variabel skal ha. Hittil har vi sett på heltall, men det finnes mange flere typer. Her kommer en liste over noen av de vanligste typene: int Eks: int i = 5; Brukes til å lagre etheltall (fra -2147483648 tom 2147483647). char Eks: char tegn = A ; Brukes til å lagre et enkelt tegn. double Eks: double pi = 3.1415; Brukes til å lagre et desimaltall (flytende tall). String Eks: String tekst = "To be or not to be"; Brukes til å lagre en tekst 3. Legg merke til den store S-en i String. boolean Eks: boolean ferdig = true; Brukes til å lagre en sannhetsverdi. Kan enten ha verdien sann (true) eller usann (false). Mer om identifikatorer Vi har sagt at du selv velger navn på variabler, og at disse navnene kalles identifikatorer. Selv om du velger navnet selv, er ikke alle navn tillatt. De viktigste begrensningene kommer her: variabelnavn kan ikke begynne med et tall variabelnavn kan ikke inneholde andre tegn enn bokstaver og tall 4 Det er også noen ord som har en spesiell betydning i Java, vi har allerede vært borti noen av dem (int, boolean, osv.). Disse ordene kan du heller ikke bruke som identifikatorer. Her kommer hele listen over de reserverte ordene: abstract default goto new synchronized boolean do if package this break double implements private throw byte else import protected throws case extends instanceof public transient catch false int return true char final interface short try class finally long static void const float native super volatile continue for null switch while Tabell 2.1: Reserverte ord i Java 3 Egentlig er ikke String en type i Java, men siden den er så vanlig og brukes så ofte, har vi tatt den med her likevel. 4 I tillegg kan man bruke enkelte spesialtegn. 17

Hva slags navn bør du velge Selv om vi nå har sagt at du står (nesten) fritt til å velge navn på variabler, er det likevel noen retningslinjer du bør merke deg. navn på variabler bør begynne med liten bokstav. navnet bør si noe om hva variabelen brukes til i programmet. Hvis variabelen bare brukes midlertidig, får den ofte et kort navn (f.eks. ni, x). dersom navnet består av flere ord, skiller du ordene ved bruk av stor bokstav på andre, tredje osv., ord slik som i «minvariabel». Dette er vanlig på engelsk som ikke har noen språklig tradisjon for å sette sammen ord. På norsk bør man ikke overdrive dette. Vi kan sette sammen ord helt naturlig: brannbil, ikke brannbil. navn på klasser skal alltid begynne med stor bokstav. 18

Kapittel 4 - Kontrollsetninger I dette kapitlet skal vi fortelle deg hvordan du kan kontrollere programflyten, f.eks. hvordan du kan hoppe over, eller gjenta, enkelte linjer i programmet. Før vi begynner å se på de enkelte kontrollsetningene må du kjenne til noe som heter booleske uttrykk 5. Booleske uttrykk Som du husker fra kapittelet om typer og variable finnes det en type som heter boolean. Det er en type som kan ha to verdier: sann eller usann (true eller false). Som du kanskje allerede har gjettet, likner booleske uttrykk svært på booleske typer. Et boolesk uttrykk er et utsagn ( en påstand eller en betingelse) som enten er sant eller usant (true eller false). For å finne ut om et gitt utsagn er sant eller usant, må det beregnes. Til denne type regning trenger vi noen operatorer: < og > «mindre» og «større enn» <= og >= «mindre eller lik» og «større eller lik» == «er lik»!= «er ulik» Legg merke til == - operatoren. I Java (og mange andre språk) har denne betydningen er lik. Grunnen til at det ikke brukes et enkelt likhetstegn, er at det betyr noe annet i Java (nemlig tilordning). La oss se på noen eksempler: int i, j; char c; i < 5 // i er mindre enn 5 c == B // c inneholder tegnet B j!= 5 // j er forskjellig fra 5; Felles for disse uttrykkene er at de enten er sanne eller usanne. Det er enten sant eller usant at i er mindre enn 5. Typen på høyre side av operatoren må stemme overens med typen på venstre. Det er ikke mulig å sammenlikne f.eks. en double med en int. Ofte vil det være behov for å teste flere betingelser. Det gjør man ved å slå sammen de enkelte betingelsene. Til dette har vi følgende operatorer 6 : && «OG» (på engelsk: «AND»). Hvis uttrykkene på høyre og venstre side av tegnet begge er sanne, blir verdien sann. Dvs uttrykket betingelse1 && betingelse2 er sant hvis både betingelse1 og betingelse2 er sanne. Hvis derimot minst én av dem er usann, får hele uttrykket ovenfor verdien usant. «ELLER» («OR») Hvis minst ett av uttrykkene på høyre og venstre side er sanne, blir verdien sann. Dvs uttrykket betingelse1 betingelse2 5 George Boole (1815-64), engelsk matematiker som grunnla utsagnsregning som matematisk disiplin. 6 Det finnes flere, men i dette kurset klarer du deg med disse. 19

er sant hvis minst en av betingelse1 og betingelse2 er sann. Hvis derimot begge betingelser er usanne, får hele uttrykket verdien usant. Så langt har vi vist deg operatorer som trenger to verdier for å virke en på høyre og venstre side. Tilslutt bør du kjenne til! -operatoren («not»). Den skiller seg fra de andre ved at den kun tar en verdi på høyre side. Resultatet er den motsatte verdien av verdien som beregnes. Altså:!true!false //gir verdien usann. //gir verdien sann. If-setninger En if-setning brukes til å utføre en eller flere setninger under gitte betingelser. Formen på setningen er som følger: if ( betingelse ){ Setninger som utføres hvis betingelsen er sann... ; Her er betingelse et boolesk uttrykk (en påstand), eller en boolesk variabel, som kan beregnes til sant eller usant. Slik bruker du if-setningen: class Hvis { public static void main(string[] args) { Inn stdin = new Inn ( ); // Innlesing fra tastatur int i = stdin.inint( ); // forklares nærmere i kap.5 if (i < 5 ) { // Skrives ut hvis i «er mindre enn» 5 System.out.println("Tallet er mindre enn 5"); System.out.println("Takk for nå."); Setningen «Tallet er mindre enn 5» skal bare skrives ut hvis det er sant. Det avgjøres av hvilken verdi brukeren oppgir til programmet. if else Ofte vil man ha behov for å gjøre én ting hvis betingelsen er sann og noe annet hvis den er usann. Til det brukes setningskonstruksjonen if else. Formen er som følger: if ( betingelse ){ gjør noe; else { gjør noe annet; Det vil også være situasjoner hvor man har behov for å gjøre en ny if-test hvis den foregående if-testen var usann. if ( betingelse1 ){ gjør ditt ; else if ( betingelse2 ){ gjør datt ; else if ( betingelse3 ){ 20

gjør dette... ; else if... Et eksempel class Hvis { public static void main(string[] args) { Inn stdin = new Inn ( ); int i = stdin.inint ( ); if (i < 5) { System.out.println("Tallet er mindre enn 5"); else if (i == 5) { System.out.println("Tallet er 5"); else { System.out.println("Tallet er større enn 5"); Dette programmet har følgende algoritme: 1. Hvis i er mindre enn fem så... 2. Skriv ut «Tallet er mindre enn 5» og hopp til nr. 6 3. Hvis i er lik 5 så... 4. Skriv ut «Tallet er 5» og hopp til nr. 6 5. Skriv ut «Tallet er større enn 5» 6. Ferdig med testen - fortsett videre i programmet. Resultatet er avhengig av hva brukeren oppgir. While-setninger Vi kan få maskinen til å repetere en handling så mange ganger vi vil. Ofte kan vi ikke vite hvor mange ganger vi ønsker å repetere en eller flere setninger. Derimot vet vi at den skal repeteres så lenge en betingelse er sann. Til dette brukes en while-løkke. En while-løkke har følgende form: while ( betingelse ){ setninger; betingelse setninger er et boolesk uttrykk eller en boolesk variabel som er true eller false. er den eller de setningene du ønsker utført så lenge betingelsen er sann. Det er viktig å oppdatere betingelsen inne i løkka. Hvis vi glemmer dette, vil betingelsen alltid være sann og programmet havner i en evig løkke. Hvis det skjer, må du avbryte programmet ved å trykke ctrl-c. Et eksempel på bruk av en while-løkke: class Kvadrattall { public static void main(string[] args) { int i = 1; int kvadrat = i * i; 21

while ( kvadrat < 1000 ){ System.out.println("Kvadratet av " + i + " er " + kvadrat ); i = i + 1; kvadrat = i * i; System.out.println("Takk for nå."); Dette programmet beregner alle kvadrattall under 1000, fra 1 og oppover. Vi vet i utgangspunktet ikke hvor hvor langt vi må gå med variablen i. Vi setter bare betingelsen at vi skal stoppe når kvadratet av i er blitt 1000 eller mer. For-setninger En for-løkke brukes når du ønsker å repetere en eller flere setninger et bestemt antall ganger. Formen på en for-løkke er: for ( startpunkt for teller ; betingelse; økning/minskning ){ setninger; La oss ta et eksempel som skriver ut kvadrattallene fra 1 tom 50 (jfr. eksemplet på while-løkke ovenfor): class Kvadrat { public static void main(string[] args) { for (int n=1; n<=50; n = n + 1) { int kvadrat = n * n; System.out.println("Kvadratet av " + n + " er " + kvadrat); For-setningen består av tre deler atskilt med ;. La oss ta dem en for en. int n = 1; Dette er initialiseringsdelen av for-løkken. Her deklarerer vi et heltall n og tilordner det verdien 1. n fungerer som teller i løkken. n <= 50; Denne delen kalles en betingelse. Den kan du lese som: «Hvis n er mindre eller lik 50 så...». n = n + 1 Denne delen utføres helt til slutt i løkken, og forteller at vi skal øke telleren med 1 for hvert gjennomløp. Hvis vi skulle si for-løkken med ord, ville vi altså få: 1) La en teller, kalt n, være lik 1 2) Hvis n er mindre eller lik 50 så 3) Beregn kvadratet av n og skriv ut verdien av kvadrat 4) Øk n med 1 5) Gå tilbake til punkt 2 22

Det er også mulig å øke telleren med mer enn 1 eller vi kan velge at den skal minke for hvert gjennomløp. Om vi, f.eks. ville beregne kvadratet av alle ulike tall (1, 3, 5,...), måtte vi skrive n=n+2 i for-setningen. do while-setninger Om vi vet at vi skal gjennomløpe en løkke minst én gang, kan vi velge å bruke do - while setningen. Formen på do - while løkken er: do { setninger ; while ( betingelse ); do - while løkken likner altså svært på en while-løkke. Forskjellen ligger i at innholdet i løkken utføres før betingelsen regnes ut og testes. Hvis betingelsen er sann, utføres løkken en gang til. Husk at betingelsen må oppdateres i do-delen ellers kan du få en evig løkke. Legg også merke til semikolonet på siste linje. Denne konstruksjonen brukes ofte i sammenheng med innlesing fra tastatur. Her er et eksempel: import inf101.*; class Repetisjon2 { public static void main(string[] args){ Inn stdin = new Inn( ); int n; do { System.out.println("Skriv inn heltall. "); System.out.println("Avslutt med et negativt tall."); n = stdin.inint( ); System.out.println("Du skrev: " + n); while (n >= 0); // end do while System.out.println("Takk for nå."); Switch-setninger Vi har tidligere sett på if og if-else setningen. Hvis vi for et gitt uttrykk har mange mulige handlinger, kan vi isteden bruke switch-setningen. Formen på switch-setningen er: switch ( uttrykk ){ case verdi1 : 1. setninger ; break; // valgfritt case verdi2 : 2. setninger; // break utelatt case...; default: setninger... ; break; Først beregnes verdien av uttrykket. Verdien som beregnes, må være av typen int eller char. case verdi: Så prøver programmet å «matche» verdien av uttrykket med en av verdiene etter case. Ved det tilfellet (case) hvor verdien av uttrykket stemmer, begynner programmet å utføre de setningene som følger. break; 23

Setningene utføres fram til programmet kommer til break.da er switch-setningen ferdig. Hvis et tilfelle (case) ikke avsluttes med en break vil setningene i de påfølgende tilfellene også bli utført fram til første break. Hvis break utelates bør du skrive en kommentar. default Hvis verdien av uttrykk ikke er listet opp som en av mulighetene, blir setningene etter default utført. Denne delen er valgfri, men bør i regelen være med. Et eksempel Switch-setningen er særlig anvendelig når brukeren av programmet taster inn et valg, og eksemplet under kan brukes som en mal for dette. import inf101.*; class Meny { public static void main(string[] args) { Inn stdin = new Inn( ); char valg; // brukers valg lagres her. do { System.out.print("Skriv inn en bokstav. Avslutt med x : "); valg = stdin.inchar( ); switch (Character.toLowerCase(valg)) { case a : System.out.println("Du skrev tegnet a "); System.out.println("Det er første bokstav i alfabetet."); break; case b : System.out.println("Du skrev tegnet b "); System.out.println("Det er andre bokstav i alfabetet."); break; case c : System.out.println("Du skrev tegnet c "); // ikke stopp her, men utfør neste setning også. default: System.out.println("Det kommer etter b i alfabetet."); break; // slutt switch while (valg!= x ); // slutt do while slutt main I eksemplet over er break utelatt i det siste tilfellet (case c ). Hvis brukeren av programmet taster inn c, vil altså følgende bli skrevet ut: Du skrev tegnet c Det kommer etter b i alfabetet. Det er svært fort gjort å få uventede resultater når man utelater break. Derfor anbefales det ikke. 24

Kapittel 5 - Objekter og klasser Ett av ordene som brukes, når man skal beskrive programmeringspråket Java, er objektorientert. I dette kapitlet skal vi se på hva som skjuler seg bak begrepet, og du vil få vite hva nøkkelordene class og static betyr. Objekter Vi har allerede vært inne på at en variabel kan tenkes på som en lagerplass - for eksempel kan en variabel av typen double tenkes på som en lagerplass for et desimaltall. Når vi lager store programmer er det ofte veldig mange variable (ofte tusenvis), og i mange tilfeller er det naturlig å tenke på hver variabel som tilhørende et objekt. Hvis vi f.eks. lager et program for universitetet som skal holde orden på opplysninger om alle studentene, så ønsker vi kanskje å lagre f.eks. navn, fødselsnummer og studentnummer for hver enkelt student (i tillegg til mange andre ting). Det kunne vi få til ved å bruke tre variable for hver student: String navn; int fnr; int studnr; Det er naturlig å gruppere sammen disse tre variablene siden de tilhører samme student. Vi kan tenke på hver student som et objekt med visse karakteristika, i vårt tilfelle begrenset til navn, fødselsnummer og studentnummer (virkelige studenter har naturligvis et utall forskjellige karakteristika som skiller dem fra andre studenter!). Allerede som små barn lærer vi å tenke på verden som bestående av atskilte objekter (selv om vi kanskje ikke kaller dem for det): hver bil, hver bok, hver person, hvert hus osv er et eget objekt. Hvert objekt har visse karakteristika; f.eks. har en bok en tittel, en eller flere forfattere, osv, mens en bil har et merke, et registreringsnummer, osv. Noe av filosofien bak objektorientert programmering går ut på at man i programmering kan dra nytte av at verden for oss mennesker oppfattes som bestående av atskilte objekter. Dersom vi lager et program som skal holde orden på opplysninger om biler, så er det naturlig at vi også i programmet (og ikke bare i det virkelige liv) tenker på hver bil som et objekt. Det kan vi få til ved å holde samlet alle dataene om en bil ett sted i programmet, dvs ved å legge alle dataene om en bil i samme objekt. Men hva mener vi med et objekt i Java? Når vi i Java snakker om et objekt så mener vi rett og slett en samling av variabler og metoder 7 som vi har bestemt skal høre sammen i en enhet. Det er helt opp til oss som programmerere å bestemme hvilke variable og metoder som skal høre sammen - her har vi full frihet. Vi vil imidlertid nesten alltid forsøke å lage disse enhetene slik at de avspeiler best mulig de virkelige objektene som vi prøver å modellere/representere i datamaskinen. For å forklare hvordan man lager objekter i Java, må vi først innom et annet begrep: klasser. Klasser Hvordan forteller vi Java at visse variable skal høre sammen i en enhet, f.eks. at variablene navn, fnr og studnr i eksemplet ovenfor skal danne en enhet? Svaret er at vi gjør det ved å deklarere en klasse som inneholder de tre variabeldeklarasjonene: class Student { String navn; int fnr; 7 metoder blir forklart i kap.6 og kap.11 25

int studnr; Navnet på klassen (i dette tilfellet: Student) er et navn vi selv velger. En klasse er en angivelse av (dvs en oppskrift for) hvordan en bestemt type objekter skal se ut. Klassen Student vil derfor inneholde variablene vi trenger for å lagre data om hver enkelt student, og metodene som beskriver hva slags operasjoner student-objektet kan gjøre. Det er viktig å få med seg at klassen Student ikke i seg selv utgjør et student-objekt; den beskriver bare hvordan student-objekter skal se ut i datamaskinen. For å få laget et objekt av typen (klassen) Student må vi skrive new Student(); Det som skjer når denne setningen eksekveres er at det settes av lagerplass i datamaskinen til tre nye variable som heter navn, fnr og studnr (det skjer også en ting til: Java gir tilbake adressen til det stedet i hukommelsen hvor objektet ligger; se neste seksjon). I den virkelige verden vil du som regel finne flere objekter av samme type. Det finnes mange studenter og mange biler. Vi kan tenke oss at alle studenter er del av en samlebetegnelse: Student. Denne samlebetegnelsen er det vi kaller en klasse. Vi sier at «studenter er objekter av klassen Student». Alle studentene har samme mulige handlinger og samme type data, men innholdet i dataene skiller dem fra hverandre. Klassen Student beskriver altså egenskaper og handlinger for alle studenter. For å lage flere objekter at klassen Student kan vi bruke new flere ganger: new Student(); new Student(); Når disse eksekveres settes det av lagerplass til to objekter som hver holder tre variable som heter navn, fnr og studnr. Normalt ønsker vi å ta vare på adressen til objektene vi lager (ellers kan vi ikke få tak i variabler og eventuelle metoder inne i objektene); vi skal nå se hvordan det gjøres. Referanser (pekere) Dersom vi ikke tar vare på adressen til et objekt vi har laget, har vi for alltid mistet kontakten med objektet (dvs muligheten til å få tak i variabler og kalle på eventuelle metoder inne i objektet). Adressen kan vi få tak i når objektet blir til, f.eks. ved å skrive Student stud = new Student(); Det som skjer her er først at det lages et objekt av klassen Student, og deretter settes variabelen stud lik adressen til det nye objektet. Variable av denne typen kalles referanser eller pekere i Java. Når vi først har en referanse til et objekt, kan vi lett få tak i variablene og metodene inne i objektet, f.eks. stud.navn = "Nina Alsgård"; stud.fnr = 15108357744; stud.studnr = 236393956; System.out.println("Studentens navn er " + stud.navn); Punktumet etter stud uttales «sin» eller «sitt», slik at første linje ovenfor uttales «student sitt navn settes lik Nina Alsgård». Med stud.navn mener vi altså den variabelen navn som ligger inni det objektet som stud refererer til. Vi kan godt ha flere referanser til samme objekt, slik som i følgende eksempel: Student stud2 = stud; 26

Nå refererer (peker) både stud og stud2 på samme objekt av klassen Student. Derfor gir følgende to setninger nøyaktig samme resultat: System.out.println("Studentens navn er " + stud.navn); System.out.println("Studentens navn er " + stud2.navn); Vi deklarerer referanser akkurat på samme måte som vi deklarerer variabler, men i stedet for typen (f.eks. int), skriver vi klassenavnet (f.eks. Student). En referanse kan ikke peke på et objekt av en annen klasse enn den er deklarert til å peke på. Retningslinjene for navn på referanser er de samme som for navn på variable. I alle objekter er det en svært nyttig peker som refererer til objektet selv. Denne pekeren heter this og er innebygd i objektet; denne pekeren trenger ikke (og skal ikke) deklareres av deg (du kan tenke deg at Java gjør det automatisk, bak kulissene). Klasse/objekt-diagrammer En sentral del av det å lage et program er å danne seg en mental modell for hva som skal skje når programmet eksekverer. Man kan tenke seg forskjellige detaljnivåer på en slik mental modell; i INF101 konsentrerer vi oss om såkalte klasse/objekt-diagrammer som viser grafisk hvilke klasser programmet består av, hvilke objekter vi har, og hvilke objekter som refererer til hvilke objekter (vi sier at et objekt refererer til et annet objekt dersom det første objektet inneholder en referansevariabel som peker på det andre objektet). Slike diagrammer kan være svært nyttige når vi prøver å forstå hva et komplisert program med mange klasser og objekter gjør, og ikke minst når vi holder på å lage et slikt program. La oss se på et eksempel. Anta at vi har følgende program: class BilRegister { public static void main (String [] args) { Bil bil1, bil2, bil3; bil1 = new Bil(); bil2 = new Bil(); bil3 = new Bil(); bil1.chassisnr = 436457877223; bil1.årsmodell = 95;... class Bil { int chassisnr; int årsmodell; Dette (ufullstendige) programmet består av to klasser: class BilRegister og class Bil. I klassen BilRegister er metoden main deklarert, og inne i denne metoden er det først deklarert tre referanser til objekter av klassen Bil. Deretter lager vi tre objekter av klassen Bil og gir deretter verdier til variablene i disse objektene. Et klasse/objekt-diagram for dette programmet vil se ut som i figur 6.1. 27

chassisnr BilRegister main bil1 bil2 bil3 årsmodell chassisnr årsmodell Bil chassisnr årsmodell Figur 6.1: Mental modell (=klasse/objekt-diagram) for BilRegister-programmet. Mange vil nok føle seg fristet til å «hoppe over» modelleringen og gå rett på programmeringen, men hensikten med tegningen er å lage en modell som danner grunnlag for programmet. Derfor skal tegningen lages før programmeringen tar til. Når man lager større programmer, opplever man fort at man har mange objekter som alle inneholder flere metoder og variabler. Hvis man i tillegg har mange pekere, blir tegningen fort uoversiktlig, og virker ikke etter hensikten. Hvis det er tilfellet, kan det være lurt å dele tegningen opp i flere deler. En del kan vise forholdene mellom objektene, en annen del kan vise innholdet i de forskjellige objektene. Bruk av static I de fleste tilfeller ønsker vi at variable og metoder skal tilhøre det enkelte objekt av en klasse. Det at en metode tilhører objektet betyr at metoden har direkte adgang til alle variable og metoder i objektet. For å få tak i slike variabler og metoder i et objekt, må vi enten befinne oss i objektet eller vi må bruke en sin-konstruksjon med en peker som peker på objektet (p.metode( ) ). Innimellom vil det være behov for å ha data som ikke er knyttet til de enkelte objektene, men til hele klassen. F.eks. er det unødvendig å lagre data om antall gir på biler i hvert enkelt bil-objekt. Dette er ikke data som skiller biler fra hverandre (vi later som om det bare er en type bil i hele verden), men data som beskriver egenskaper felles for alle biler. Hvis vi skulle ønske å forandre antall gir, vil vi at dette skal kunne gjøres ett sted og virke for alle objekter. Slike variabler kalles klassevariable (eng. fields) og har modifikatoren static. En static metode har bare tilgang til static variable og andre static metoder i klassen. dersom en static metode forsøker å få tilgang til en variabel eller metode som tilhører et objekt, får vi følgende feilmelding når vi kompilerer: Can t make a static reference to nonstatic variable <var. navn> in class klassenavn. Denne feilen oppstår fordi man prøver å få tilgang til en variabel eller metode som tilhører et objekt uten å ha laget objektet. Vanligvis er det i tilknytning til klassen som inneholder main-metoden at 28

feilen oppstår. En måte å løse problemet på er å lage et objekt av klassen. Når du lager objekter, får du tilgang til alle variable og metoder, og feilmeldingen blir borte. Mer om dette senere. 29

30

Kapittel 6 - Innlesing fra tastatur I svært mange programmer skal brukeren av programmet gi opplysninger som programmet deretter behandler. Normalt foregår denne kommunikasjonen via tastaturet. Når programmet forventer «input» fra brukeren, venter programmet på dette helt til brukeren taster [Enter]. Da først overføres det brukeren skrev, til programmet, som så fortsetter med behandlingen av teksten som brukeren skrev inn. Hvordan lese fra tastatur Siden innlesning fra tastatur er ganske tungvint i Java, har vi laget en egen verktøykasse for skriving og lesing, som er enklere i bruk: For å lese fra tastatur er det noen få kommandoer som må gjøres hver gang. La oss ta et eksempel: import inf101.*; class Innlesning { public static void main(string[] args) { Inn stdin = new Inn( ); int i; System.out.print("Skriv et tall: "); i = stdin.inint( ); System.out.println("Du skrev: " + i); For å lese fra tastatur må følgende være med: import inf101.*; Denne linja importerer verktøyet (eller hjelpeprogrammene) vi bruker i innlesingen. Inn stdin = new Inn( ); Her lages koplingen (eller referansen) til tastaturet som en peker til et objekt av klassen Inn. Koplingen kalles for stdin. Dette navnet velger du selv, men det er vanlig å kalle den for stdin (Standard in), eller bare in. Senere i programmet, når vi skal lese fra tastaturet, er det denne referansen vi bruker. Selve innlesingen skjer på linjen i = stdin.inint( ); Som du ser, er det en tilordning. Vi leser inn et tall og tilordner verdien til variabelen med navnet i. Hvis brukeren skulle taste noe annet enn et heltall, får hun automatisk en feilmelding fra Inn-objektet. Legg også merke til at det må være samsvar mellom hva vi leser inn, og tilordningen til variabelen der vi tar vare på den innleste verdien. Variabelen i må altså være av typen heltall (int). 31

Inn-klassen Verktøyene som importeres (inf101.*) er ikke en del av standardpakken til Java, men er laget ved IFI. Pakken inneholder bl.a. klassen Inn som bl.a. har følgende metoder for innlesing 8 : inint( ) - brukes for å lese inn et heltall. indouble( ) - brukes for å lese inn et desimaltall. inchar( ) - brukes for å lese inn et enkelt tegn. instring( ) - brukes for å lese inn et ord. Et ord, i denne sammenhengen, er en gruppe tegn uten blanke tegn mellom. Det er altså mulig å lese inn tall med denne metoden, men tallet er da representert som tekst (String), og må tilordnes til en String-variabel. Felles for disse metodene er at de hører til en kopling mot tastaturet (eller som vi senere skal se en fil). Denne koplingen oppnår vi ved å skrive navnet på koplingen, stdin, etterfulgt av punktum og tilslutt navnet på metoden. Hvis vi skal lese ett tegn, skriver vi altså: stdin.inchar( ); instringln( ) Denne metoden vil lese en hel linje, eller resten av linja dersom noe av den allerede er lest med noen av de andre metodene. Et eksempel der vi har bruk for å lese både hele linjer med mange ord og linjer med enkeltopplysninger (f.eks. et tall), kan se slik ut: import inf101.*; class Hei { public static void main(string[] args) { Inn stdin = new Inn( ); String navn; int alder; System.out.print("Skriv inn hele navnet ditt: "); navn = stdin.instringln( ); System.out.print("Skriv inn alder: "); alder = stdin.inint( ); System.out.println("Hei " + navn + ". Du er " + alder + " år gammel"); Inn-klassen kan også brukes til å lese fra filer. Det kommer vi tilbake til. Store og små bokstaver Ved innlesning fra tastatur vil det ofte være behov for å gjøre om fra store til små bokstaver (eller omvendt). Slik gjøres det for tegn: char u = A ; 8 En fullstendig beskrivelse av alle metodene til klassen Inn, fins bakerst i dette heftet. 32

char l = Character.toLowerCase(u); Dette vil føre til at variabelen l inneholder a. Hvis man ønsker det motsatte: char l = a ; char u = Character.toUpperCase(l); For tekster er notasjonen en litt annen: String low = "navn"; String up = low.touppercase( ); Vil føre til at teksten up inneholder «NAVN». Hvis man ønsker det motsatte: String up = "NAVN"; String low = up.tolowercase( ); 33