Inf1000 (Uke 7) Objekter, klasser og pekere

Like dokumenter
Oversikt. Inf1000 (Uke 7) Objekter, klasser og pekere. Variable, deklarasjon og tilordning. Løkker gjør setninger flere ganger

Inf1000 (Uke 7) Objekter, klasser og pekere

Oversikt. Inf1000 (Uke 7) Objekter, klasser og pekere. Løkker gjør setninger flere ganger. Variable, deklarasjon og tilordning

Verden består av mange objekter, noen ganske like, noen ulike

26. Sept. 2012, Arne Maus Inst. for informatikk, UiO

Først: Parametre til oppstart av programmet, Hvordan kan vi bruke args[]? String [] args. Parameteren args[] blir laget av deg

Objekter. Uke 7 - Objekter, klasser og pekere. Verden består av mange objekter, noen ganske like, noen ulike. Klasser og objekter i verden

Uke 7 - Objekter, klasser og pekere (+ litt først om args[])

Objekter. Uke 8 - Objekter, klasser og pekere. Verden består av mange objekter, noen ganske like, noen ulike. Klasser og objekter i verden

Oblig 3 to versjoner. INF Forelesning 8: Objekter, klasser og pekere. Verden består av mange objekter: noen ganske like, andre ulike

To måter å programmere på. Java 12. Programmering med objekter. Statisk programmering

INF1000: Forelesning 6. Klasser og objekter del 1

Inf1000 (Uke 7) Objekter, klasser og pekere

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

INF1000: Forelesning 7. Konstruktører Static

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

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

INF1000: Forelesning 7

(! )! #!! *#+,$&!! &#$

3 #$ *#+,$&!! &#$ (! )! #! 6 &#)%#. / 5$ #%#.67 / "## #&! %# # & #!!& %&$ # $!!!!# $#

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

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

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

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

Innhold. INF1000 (Uke 11) Programmering. Rep: Metoder. Rep: Hva er en metode? Litt repetisjon. To måter å programmere på

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

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

INF1000 Metoder. Marit Nybakken 16. februar 2004

Introduksjon til objektorientert programmering

Blokker og metoder INF1000 (Uke 6) Metoder

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

Inf1000 (Uke 10) Oppgaveløsning. Hashmap

INF1000 (Uke 6) Mer om metoder, tekster

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

To måter å programmere på. INF1000 : Forelesning 9. Programmering uten objekter. Programmering med objekter: Eksempel på programmering uten objekter

Inf1000 uke 5 18.sept. 2007

En klasse er noe - en metode gjør noe (! / # <= (! * +!! ",-' %. "- -/ %.!#) )! " 0'%! * *$! "1-)) '' % '. 22!'( 7/ /! * 2 2! "*"% 8"%% 9 - -!

Objekter. Uke 6 - Objekter, klasser og pekere. Verden består av mange objekter, noen ganske like, noen ulike. Klasser og objekter i verden

UNIVERSITETET I OSLO

INF1000 (Uke 6) Mer om metoder, tekster

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

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

Orakeltjeneste på Abel Hjelp til Obligatorisk oppgave 2. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. Rep: Metoder

INF Forelesning oppsummering forts. Et meget enkelt banksystem. Oppsummering om klasser, objekter, pekere og.

Objekter. Uke 7 og 9 - Objekter, klasser og pekere. Verden består av mange objekter, noen ganske like, noen ulike. Klasser og objekter i verden

INF1000: Forelesning 4. Mer om arrayer Metoder

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

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

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

UNIVERSITETET I OSLO

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

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

INF1000 Variable. Marit Nybakken 27. januar 2004

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

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

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Klasser, objekter, pekere og UML. INF gruppe 13

Uke 6 og 7 - Objekter, klasser og pekere; 23. og 30. sept. 2008, Arne Maus Inst. for informatikk, UiO

Uke 6 og 7 - Objekter, klasser og pekere; 22. og 29. sept. 2009, Arne Maus Inst. for informatikk, UiO

INF1000: noen avsluttende ord

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oversikt. INF1000 Forelesning 6. Variable Deklarasjon. Variabel en plass i lageret int radius;

Uke 6 og 7 - Objekter, klasser og pekere; Verden består av mange objekter, noen ganske like, noen ulike

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

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

2 Om statiske variable/konstanter og statiske metoder.

Teste om to tekster er like. Inf1000 uke 6 26.sept Alfabetisk ordning. Inneholder en tekst en annen? Litt om tekster Metoder

Forelesning inf Java 5

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Forelesning inf Java 5

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

Inf1000 (Uke 10) HashMap og ArrayList

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

Inf1000 (Uke 9) UML og enda mer om klasser

Hva skal vi lære i dag? Inf1000 (Uke 9) UML og enda mer om klasser. Hvilke lesemetoder finnes? Filbehandling

PRØVEEKSAMEN (rettet versjon 27/11)

UNIVERSITETET I OSLO

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

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

Oblig 4Hybelhus litt mer tips enn i oppgaven

Eksamen høsten 2003 Den store bøygen i INF1000 er de obligatoriske oppgavene.

Repetisjon. INF gruppe 13

Løse reelle problemer

Hva er en metode? INF1000 Forelesning 8. Hva skjer når vi kaller en metode? Hvorfor bruke metoder?

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

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

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

Oppgave 1 (Programtolkning) INF1000 Eksamen V06. Oppgave 1 (Programtolkning) Oppgave 1 (Programtolkning)

INF1000 Forelesning 8. Litt repetisjon: Metoder og klasser Innkapsling av variable og metoder Hvordan gripe an et stort problem?

Transkript:

Inf1000 (Uke 7) Objekter, klasser og pekere Grunnkurs i programmering Institutt for Informatikk Universitetet i Oslo Anja Bråthen Kristoffersen og Are Magnus Bruaset

Oversikt Repetisjon Variable deklarasjoner, tilordnings-setningen Løkker (for, while, do) valgsetninger (if.. else, switch case) arrayer (array-peker og array-objekt) metoder Objekter og klasser i verden i programmet, hvorfor og hvordan Pekere, og hvordan lage objekter fra klasser Programeksempler med Objekt Orientert programmering Static 27.02.2006 2

Variable, deklarasjon og tilordning En variabel er en navngitt plass i lageret som inneholder en verdi av en viss type. Variable deklareres og får da sitt navn og type. (+ mulig startverdi) double rente; int i = 4, j = i+1; rente = 2.5; rente = rente - 0.5; Tilordningssetningen gir en ny verdi til en variabel den gamle verdien overskrives 27.02.2006 3

a) b) c) d) Løkker gjør setninger flere ganger int[] primtall = {2,3,5,7; int sum1 = 0; for (int i = 0; i < primtall.length; i++) { sum1 = sum1 + primtall[i]; int sum2 = 0; for (int tall : primtall) { sum2 = sum2 + tall; int sum3 = 0, i = -1; while (++i < primtall.length) { sum3 += primtall[i]; int sum4 = 0, i = 0; do { sum4 += primtall[i]; while (++i < primtall.length ); for-løkke med lokal løkkevariabel i for-løkke med lokal løkkevariabel tall while-løkke do-while løkke går minst en gang (feiler hvis length = 0) 27.02.2006 4

array En array betår av to deler arraypekeren arrayobjektet primtall tilordningen primtall = new.. plasserer adressen til arrayobjektet i primtall int[] primtall ; primtall= new int[4]; primtall[0] = 2; primtall[1] = 3; primtall[2] = 5; primtall[3] = 7; primtall new lager array-objektet og returnerer adressen 27.02.2006 5 0 0 0 0

array Her lager vi en peker som kan peke på et objekt av typen int[] Her lager vi arrayobjektet primtall skal peke på, og definerer størrelsen på arrayobjektet int[] primtall; primtall= new int[4]; primtall[0] = 2; primtall[1] = 3; primtall[2] = 5; primtall[3] = 7; primtall[1] = 3; betyr at plassen hvor primtall peker + 1 får verdien 3 primtall 27.02.2006 6 2 3 5 7 Programmet kan lese og skrive alle heltalls variablene i arrayobjektet ved å starte der primtall peker, og så evt. legge til 0,1,2 eller 3 (= length -1)

import easyio.*; class ArrayTest{ public static void main(string args[]) { In tastatur = new In(); Out skjerm = new Out(); double s1 =0.0,s2=0.0; // registrer temeraturen 2 ganger om dagen i en uke double[][] temp = new double[7][2]; String[] ukedag ={"mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag", "søndag"; for(int i = 0; i < 7; i++) { skjerm.out("gi morgen-temp for " +ukedag[i] +" :"); temp[i][0] = tastatur.indouble(); skjerm.out("gi kvelds-temp for " + ukedag[i] +" :"); temp[i][1] = tastatur.indouble(); for(int i = 0;i<7;i++) { s1 += temp[i][0]; s2 += temp[i][1]; skjerm.outln(" Gjennomsnitt morgen-temp = " + s1/7); skjerm.outln(" Gjennomsnitt kvelds-temp = " + s2/7);

Valgsetninger if.. else og switch/case Out skjerm = new Out(); In tastatur = new In(); int alder = tastatur.inint(); if (alder > 15) skjerm.out("voksenbillett ); else skjerm.out("barnebillett"); Hadde vi hatt flere setninger, måtte vi brukt {.. rundt disse 27.02.2006 8

import easyio.*; class Utskrift{ static void meny (Out ut) { ut.outln(" Velg:"); ut.outln(" 1 - les data"); ut.outln(" 2 - skriv ut"); ut.outln(" 3 - avslutt"); public static void main ( String[] args) { int alder = 0, valg; Out skjerm = new Out(); In tastatur = new In() kall på metoden meny(..) som skriver ut valgmulighetene do{ meny(skjerm); valg = tastatur.inint(); switch(valg) { case 1: // les data skjerm.outln("skriv inn din alder: "); alder = tastatur.inint(); break; case 2: // skriv data skjerm.outln("alder = " + alder); break; case 3: // avslutt skjerm.outln("systemet avslutter"); break; default: // feil skjerm.outln("du valgte " + valg + " gyldige valg er: 1-3"); while (valg!= 3); switch /case setning. velger mellom 1,2,3 og gal verdi

metoder Brukes til å dele opp programmet i så små deler at de er lette å programmere riktig vi velger selv hvilke setninger vi legger i en metode En metode gis et navn vi selv velger Noen metoder skal returnere et svar Der setter vi typen til svaret (int, double, int [],..) foran metodenavnet Noen metoder bare gjør noe da setter vi void foran metodenavnet 27.02.2006 10

kall av metoder Kall av en metode er: At vi skriver navnet på en metode som (del av) en setning i en annen metode (f.eks i main ) Når vi gjør det, hopper programutførelsen til starten på den kalte metoden. Når den kalte metoden er ferdig (returnerer), hopper programutførelsen tilbake til rett etter der metoden ble kallet. Metoder kan ha parametere (navngis i parentes bak metodenavnet) disse oppfører seg som lokale variable i metoden når vi kaller metoden, får vi kopier av verdiene som ble brukte i kallet på parameterplassene før man hopper til den kalte metoden (se neste foil). Når vi lærer om klasser, skal vi se at vi ofte ikke behøver å ha static foran metoden (static= klassemetode) 27.02.2006 11

import easyio.*; class MetodeTest { static int leggsammen(int a, int b) { int svar = a + b; return svar; static void skrivtegn(out ut, int ant, char c) { for (int i = 0; i < ant; i++){ ut.out(c); ut.outln(); static void skrivadvarsel(out u, String s) { skrivtegn(u, s.length() + 12, '*'); u.outln("advarsel:" + s + "!!!!"); skrivtegn(u, s.length() + 12, '*'); public static void main ( String[] args) { int i=14, abc = 22, c; Out skjerm = new Out(); 3 kall på leggsammen(..) c = leggsammen(i,abc); skjerm.outln("svaret er:" + c); skjerm.outln("nytt svar:" + leggsammen(c,abc)); skjerm.outln("enda ett svar:" + leggsammen(i+c,i)); String x = "" + c; skrivadvarsel(skjerm, x); kall på skrivadvarsel(..) som igjen kaller skrivtegn(..)

Objekter Vi deler verden inn i enheter for å bedre kunne tenke på, snakke om og forstå verden. Eksempler på slike enheter Levende organismer Planter Blomst Trær Mennesker Studenter Jenter Gutter Voksne Barn 27.02.2006 13

Verden består av mange objekter, noen ganske like, noen ulike Ser vi rundt oss i auditoriet, ser vi Studenter, stoler, murstein, lysarmatur, blyanter,... Vi ser at når vi betrakter verden, deler vi den opp i et passe antall enheter/deler som vi har egne navn for. De enheter vi deler programmeringsverden inn i, kalles objekter Mange av objektene i verden er av samme type. Vi kan skille dem fra hverandre med f.eks. ulike navn Studentene Kai og Espen to bøker med ulik tittel/forfatter Objekter som kan ses på som like sier vi at tilhører samme klasse De beskrives av samme sett variable, men har ulike verdier på noen av variablene (to biler av samme bilmerke og farge men med ulike registreringsnummer) 27.02.2006 14

Klasser og objekter i verden To objekter kan også være helt forskjellige (f.eks et tre og en lastebil) De er da to objekter av hver sin klasse (klassen Tre og klassen Lastbil) Hva vi velger å betrakte som et objekt, og hvilke klasser vi bruker for å beskrive en problemstilling, er ikke bestemt på forhånd. Innenfor vide rammer bestemmer vi det selv. Som Objekt orientert programmerer, hevder jeg : Klasser er generelle begreper som egentlig ikke eksisterer i verden det som eksisterer er objektene. Klasser er menneskenes måte å beskrive og strukturere verden, ikke gitt en gang for alle og vi kan godt lage oss nye begreper. 27.02.2006 15

Hvor mange klasser (og objekter) er det? Hvilke klasser vi bruker til å beskrive et problem, varierer ofte etter hvor detaljert vi betrakter en problemstilling og hvilke spørsmål vi ønsker å kunne gi svar på: Beskriver vi problemet med veitrafikk og køer på veiene, er vi neppe interessert i mer enn å telle antall biler og kanskje skille mellom lastebiler, busser og personbiler. Beskriver vi problemet til en bilfabrikk, trenger vi en meget detaljert og komplisert beskrivelse av hver bil (bestående av motor, hjul, karosseri, lys,..., hver beskrevet med sin klasse) og mange ulike typer av biler. Vi se da en rekke klasser som hver beskriver sine objekter. 27.02.2006 16

Objektorientert Programmering Når vi betrakter et problem vi skal lage et datasystem for, gjør vi to avgrensninger: 1. Vi ser bare på en del av verden (vårt problemområde) 2. Innenfor problemområdet betrakter og beskriver vi bare det som er der med en viss detaljeringsgrad - bare så mange detaljer vi trenger for å svare på de spørsmål datasystemet skal kunne gi svar på. Eks: Hvordan beskrive en student? Skal vi lage: a) Et Studentregister, registrerer vi bare navn, personnummer, adresse, tidligere utdannelse og kurs (avlagte og kurs vedkommende tar nå) b) Et legesystem for studenter, ville vi ta med svært mange opplysninger om hver student (medisiner, sykdommer, resultat fra blodprøver, vekt...) som vi ikke ville drømme om å ha i et vanlig studentregister 27.02.2006 17

Hvordan lage klasser og objekter i et program. Klasser deklarerer vi med class Vi lager pekere til objekter ved å deklarere dem med klassenavnet Vi lager et objekt med åsi new foran et klassenavn Forholdet mellom et objekt og en peker er som en array-peker og et array-objekt class Student { String navn, adresse; class StudentRegister { public static void main(string args []) { Student s1, s2; s1 = new Student(); s2 = new Student(); 27.02.2006 18

Hva er et objekt i programmet? Et objekt er et område i lageret som inneholder en kopi av alle de metodene og variable i en klasse det ikke står static foran Klassene er en slags mal/form/oppskrift som vi kan lage objekter med. Vi kan lage så mange objekter av en klasse som vi vil. De variable og metode det ikke står static foran, kalles objekt-variable og objektmetoder De variable og metoder det står static foran, kalles klasse-metoder og klassevariable, og blir ikke med i objektene (men ligger lagret i bare ett eksemplar et annet sted) 27.02.2006 19

Peker og objekter class Student { String navn, adresse; class StudentRegister { public static void main(string args []) { En peker inneholder adressen til hvor et objekt ligger i lageret eller den inneholder null (= ikkeobjekt) Vi tegner adressen som en pil (peker) Student s1, s2; s1 = new Student(); s2 = new Student(); s1 s2 s1 s2 navn adresse navn adresse 27.02.2006 20

Programmer i Java består av en eller flere klasser Vi deler opp programmet vårt i flere klasser fordi hver programdel (klasse) skal være mulig å holde oversikt over ikke for stor. fordi en klasse skal være en god modell på en del av problemet vi lager program for. Anta at vi hadde et datasystem som omhandlet kurs og studenter. Da ville vi ha en klasse Student og en klasse Kurs i programmet. En klasse inneholder deklarasjon av null eller flere variable som beskriver ett eksemplar av det klassen er modell av null eller flere metoder En klasse representer et generelt begrep som: Eksempler kan være: Student, Kurs, 27.02.2006 21

Objekter og pekere, og hvordan få adgang til innmaten av et objekt (.) Når vi har laget et objekt med new, har vi altså fått en kopi av objekt-variablene og objektmetodene, men hvordan får tak i dem? Vi bruker operatoren. (punktum). Foran punktumet har vi navnet på en peker til et objekt. Etter punktum har vi navnet på en variabel eller metode inne i objektet Punktumet leses som sin eller sitt eks: La s1 peke på et Student-objekt. s1.navn = "Ola N"; 27.02.2006 22

class Student { String navn, adresse; void skrivut() { System.out.println("Student med navn:" + navn + ", adr:" + adresse); class StudentRegister { public static void main(string args []) { Student s1, s2; s1 = new Student(); s1.navn = "Ola N"; s1.adresse = "Storgt. 12, 1415 Nordby"; s2 = new Student(); s2.navn = "Åsne S"; s2.adresse ="bokhandelen i Kabul"; s1.skrivut(); s2.skrivut();

class Kurs { String kurskode; int studiepoeng; objektvariable void skrivut() { System.out.println("Kurs med kode:" + kurskode+ ", og stp:" + studiepoeng); Objekt -metode class KursRegister { public static void main(string args []) { Klasse - metode Kurs inf, mat; inf = new Kurs(); inf.kurskode = "INF1000"; inf.studiepoeng = 10; inf.skrivut(); Lager to objekter av klassen Kurs mat = new Kurs(); mat.kurskode = "MAT1000"; mat.skrivut(); 27.02.2006 24

Stringer er objekter String er en klasse i Java-biblioteket, men har en egen spesiell syntaks (skrivemåte) så det ser ut som den er en av de basale typene (som int, double,..). Når vi har en string, har vi både en peker (den vi deklarerer navnet på) og et string-objekt. Egen skrivemåte for stringkonstanter: String s = En fin dag i mai ; Er det samme som: String s = new String( En fin dag i mai ); Klassen String inneholder mer enn 50 metoder for konvertering mellom ulike datatyper og tekst, samt tekstsøking. 27.02.2006 25

Klassen String String tekst = kake ; String t = ake ; int lengde = tekst.length(); boolean b = tekst.equals(t); char c = tekst.charat(1); String t = tekst.replace( k, r ); String delstreng = tekst.substring(1); String store = tekst.touppercase(); String smaa = tekst.tolowercase(); int k = tekst.compareto(t); Alle metodene vi har sett på for String begynte med NavnPåString. Dette fordi String er en klasse. Når vi skriver String s = Hei ; lager vi en peker s som peker på et objekt av klassen String. Der pekeren peker i minne blir teksten Hei lagret. int k = tekst.indexof(t); boolean b = tekst.startswith( K ); boolean b = tekst.endswith( e ); 27.02.2006 26

Klasse-variabel (=statisk variabel) Setter vi static foran en variabel, er det er bare én felles variabel med det navnet for alle objektene. Setter vi static foran en metode, har den bare utsikt til : sine egne lokale variable og parametere andre statiske variable og metoder klassenavnene Statiske metoder og variable kan man få adgang til både via klassenavnet og punktum via peker til et objekt av klassen og punktum 27.02.2006 27

class B { static int i = 0; double x = 0.0; class A { int k; public static void main ( String[] args) { B b1 = new B(); B b2 = new B(); System.out.println("b1.i :"+ b1.i+", b2.i:" + b2.i); b1.i = 4; //her endres b1 sin klassevariabelen (felles). System.out.println("b1.i :"+ b1.i+", b2.i:" + b2.i); System.out.println("b1.x :"+ b1.x+", b2.x:" + b2.x); b1.x = 2; //her endres b1 sin objektvariabel (en hver). System.out.println("b1.x :"+ b1.x+", b2.x:" + b2.x); 27.02.2006 28

class A2 { int k; // objektvariabel k public static void main ( String[] args) { k = 1; >javac A2.java a2.java:6: non-static variable k cannot be referenced from a static context k = 1; ^ 1 error class A2 { int k; public static void main ( String[] args) { A2 aa = new A2(); aa.k = 1; >javac A2.java > 27.02.2006 29

Arrayer av pekere til objekter Vi kan lage arrayer av pekere til objekter (men ikke av objektene direkte) omlag på samme måte som vi lager arrayer av int, double og String Har vi deklarert klassen Kurs{... kan vi lage array som følger: Kurs[] ifikurs; ifikurs = new Kurs[120]; ifikurs[0] = new Kurs(); Her deklareres bare array-pekeren Her lages arrayobjektet med 120 tomme pekere Her settes det første pekeren i array-objektet til å peke på et nytt Kurs-objekt 27.02.2006 30

class Kurs { String kurskode; int studiepoeng = 10; void skrivut() { System.out.println("Kurs med kode:" + kurskode + ", og stp:" + studiepoeng); "INF1000 class KursRegister2 { public static void main(string args []) { String[] kurskoder= {"INF1000","INF1010", "INF1020","INF1040","INF1050", "INF1060","INF1070","INF1400"; Kurs[] ifi1000kurs = new Kurs[8]; "INF1010 "INF1400 for(int i = 0; i < kurskoder.length; i++) { ifi1000kurs[i] = new Kurs(); ifi1000kurs[i].kurskode = kurskoder[i]; ifi1000kurs[i].skrivut(); arraypekeren ifi1000kurs peker til et array-objekt med 8 Kurs-pekere 27.02.2006 31

this Ethvert objekt inneholder en peker til seg selv: this Noen ganger trenger vi å bruke this for å referere til objektvariablene: class Person { String navn = Andre Bjerke ; String adr = Oslo ; void byttadresse (String adr) { this.adr = adr; parameteren adr objektvariabelen adr Merk: vi kunne sluppet unna bruk av this ovenfor ved å kalle parameteren i metoden byttadresse for noe annet (f.eks. String adresse) - men ofte er det mer oversiktlig å gjøre som over. 27.02.2006 32

Initialisering av variable i et objekt Anta at programmet vårt inneholder denne klassen: class Person { String navn; String fnr; Når vi har laget et objekt (med new) ønsker vi normalt å gi variablene i objektet fornuftige verdier med en gang. Noen muligheter: Sett verdiene til objektvariablene direkte med prikk-notasjon: Person p = new Person(); p.navn = Petter ; p.fnr = 15108559879 ; Lag en init-metode i klassen: Person p = new Person(); p.init( Petter, 15108559879 ); Benytt en konstruktør: Person p = new Person( Petter, 15108535738 ); 27.02.2006 33

Konstruktører En konstruktør er en spesiell type objektmetode som du kan bruke for å sikre at objektet starter sitt liv med fornuftige verdier i objekt-variablene. Konstruktører har alltid samme navn som klassen de ligger i utføres automatisk når et objekt opprettes med new har ingen returverdi, men skal ikke ha void foran seg overlastes ofte, dvs det er ofte flere konstruktører i en og samme klasse, hvor konstruktørene skiller seg fra hverandre ved antall parametre og/eller typen på parametrene. 27.02.2006 34

Eksempel overlasting av konstruktør class TestSirkel { public static void main (String [] args) { Sirkel s1 = new Sirkel(); System.out.println("Radius: " + s1.radius); Sirkel s2 = new Sirkel(5.0); System.out.println("Radius: " + s2.radius); class Sirkel { double radius; Sirkel () { radius = 1.0; Konstruktør 1 Sirkel (double r) { radius = r; Konstruktør 2 27.02.2006 35

Når det ikke er noen konstruktør Når en klasse ikke inneholder noen konstruktør, vil Java selv føye på en "tom konstruktør" uten parametre når programmet kompileres. Dermed er følgende to klassedeklarasjoner ekvivalente: class Sirkel { class Sirkel { double radius; double radius; Sirkel () { Merk: dersom klassen inneholder en eller flere konstruktører, vil Java ikke føye på en "tom konstruktør" uten parametere. 27.02.2006 36

Oppgave: virker dette? Lar dette programme seg kompilere og kjøre? class Oppgave1 { public static void main (String [] args) { Bil b = new Bil(); class Bil { String regnr; Bil (String regnr) { this.regnr = regnr; 27.02.2006 37

Pekerlikhet og innholdslikhet class Likhet { public static void main (String [] args) { Student stud1 = new Student("Petter", "01018926324"); Student stud2 = new Student("Petter", "01018926324"); if (stud1 == stud2) { System.out.println("Samme objekt"); if (stud1.navn.equals(stud2.navn) && stud1.fnr.equals(stud2.fnr)) { System.out.println("Samme innhold"); class Student { String navn; String fnr; Student (String navn, String fnr) { this.navn = navn; this.fnr = fnr; 27.02.2006 38

enum: oppramsingstyper I java 1.5 er det kommet en ny type variabel som bare skiller mellom ulike navngitte verdier. Eksempel: enum Hverdag {mandag, tirsdag, onsdag, torsdag, fredag Class EnumEks{ public static void main(string[] args){ Hverdag d = Hverdag.mandag System.out.println( I dag er det + d); 27.02.2006 39

Eksempel: iterer over elementene i enum enum Hverdag {mandag, tirsdag, onsdag, torsdag, fredag Class EnumEks2{ public static void main(string[] args){ for (Hverdag d: Hverdag.values()){ System.out.println( dag: + d + ukedagnummer: + d.ordinal()); Metodene values() og ordinal() er forhåndslagde metoder i Java 1.5. Metoden values() itererer over alle verdiene i oppramsningstypen. Plasseringen det elementet vi ser på har i oppramsingen finner vi med metoden ordinal(). 27.02.2006 40

Eksempel: verdi på elementene i enum enum Hverdag { mandag(4), tirsdag(3), onsdag(2), torsdag(1), fredag(0); final int dagerigjentilhelgen; Hverdag (int v){ dagerigjentilhelgen = v; class EnumEks3{ public static void main(string[] args){ for (Hverdag d: Hverdag.values()){ System.out.println( dag: + d +, antall dager igjen til helgen er: + d.dagerigjentilhelgen); 27.02.2006 41

Hvorfor programmere med objekter? Med objekter kan vi ofte organisere dataene våre bedre. Eksempel Personreigster: Uten Objekt Orientert programmering: String[] navn = new String[100]; String[] fnr = new String[100]; int[] tlfnr = new int[100]; Informasjonen knyttet til en bestemt person er splittet opp i tre arrayer. Med Objekt Orientert programmering: class Person { String navn; String fnr; int tlfnr; Person[] personreg = new Person[100]; Informasjonen knyttet til en bestemt person er samlet i et objekt. Bedre organisering særlig når det er mye data å holde orden på. 27.02.2006 42

Hvorfor programmere med objekter? Med objekter kan vi samle data og operasjoner på dem.... data om studenter...... data om kurs...... student-metoder...... kurs-metoder... Her ligger alle data og alle metoder samlet ett sted class Student {... data om studenter...... student-metoder... class Kurs {... data om kurs...... kurs-metoder... Metoder og data som hører sammen er samlet. Lett å se hvilke metoder som jobber på hvilke data (strukturering av koden). Lett å kopiere alt som har med personer å gjøre (data+metoder) til andre programmer (gjenbruk). 27.02.2006 43

Viktige prinsipper En metode skal bare bruke objektvariable deklarert i egen klasse. selv om man lett kan få tak i variable fra andre klasser, men bruk av variable fra andre klasser vil føre til rotete programmering hvor det senere blir vanskelig å endre på programmet. For eksempel slette en variabel (som viser seg å være brukt av en annen klasse). Hvis en metode viser seg vanskelig eventuelt lang å programmere del den i mindre metoder. små enkle metoder som hovedsakelig kun gjør en oppgave (høyden noen få som klart hører sammen) gjør programmet lett lesbart for andre i ettertid. 27.02.2006 44

Oppsummering om klasser, objekter, pekere og. Vi lager OO-programmer ved å lage en modell av problemområdet ett objekt i verden gir ett tilsvarende Java-objekt i programmet Objekter kan være av ulik type, og for hver slik type deklarerer vi en klasse Et Javaprogram består av en eller flere klasser Vi lager objekter fra klassen med new s1 = new Student(); Et objekt inneholder en kopi av alle ikke-statiske variable og metoder i klassen Vi får adgang (lese, skrive og kalle metoder) til det som er inni et objekt ved. operatoren: s2.adresse ="bokhandelen i Kabul"; s1.skrivut(); 27.02.2006 45