Innhold. INF1000 Høst Klasser og objekter. Uke 7: Mer objektorientert programmering Siri Moe Jensen

Like dokumenter
Mer objektorientert programmering

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

Introduksjon til objektorientert programmering

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

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

Fra problem til program

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

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

INF1000 Prøveeksamen Oppgave 7 og 9

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

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

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

INF Løsning på seminaropppgaver til uke 8

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

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

INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

INF1000 undervisningen INF 1000 høsten 2011 Uke september

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

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

Læreboken på 45 minutter

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

Forelesning inf Java 5

Forelesning inf Java 5

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

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

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

INF1000: Forelesning 7

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

UNIVERSITETET I OSLO

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

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

TDT4100 Objektorientert programmering

Leksjon 6. Objekt. Evt. importsetninger. public class Klasse { Konstruktør. Objektmetoder. Innkapsling (private): set-og get-metoder

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

INF1000: Forelesning 7. Konstruktører Static

UNIVERSITETET I OSLO

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

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

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

INF Uke 10. Ukesoppgaver oktober 2012

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

INF1000 : Forelesning 4

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

Løse reelle problemer

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

Klasser, objekter, pekere og UML. INF gruppe 13

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

UNIVERSITETET I OSLO

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

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

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

INF1000: Forelesning 4. Mer om arrayer Metoder

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

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

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

Oblig4 - forklaringer. Arne og Ole Christian

INF1000: noen avsluttende ord

INF Notat om I/O i Java

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

Seminaroppgaver IN1010, uke 2

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

INF 1010, vår 2005 Løsningsforslag uke 11

2 Om statiske variable/konstanter og statiske metoder.

Leksjon 7. Filer og unntak

Eksamen. Objektorientert Programmering IGR 1372

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

MAT-INF 1100: Obligatorisk oppgave 1

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

UNIVERSITETET I OSLO

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

IN Notat om I/O i Java

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

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

INF1000 : Forelesning 1 (del 2)

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

UNIVERSITETET I OSLO

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

Fra Python til Java, del 2

Blokker og metoder INF1000 (Uke 6) Metoder

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

Jentetreff INF1000 Debugging i Java

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

Dagens tema Kapittel 8: Objekter og klasser

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

Transkript:

Innhold INF1000 Høst 2015 Uke 7: Mer objektorientert programmering Siri Moe Jensen Oo: Hva skjer egentlig i programmene våre? Hva var det vi gjorde annerledes i Uke 5? Klassemetoder (deklarert som static) og objektmetoder Parametere og variable, objektvariable Pekere og objekter Nyttige grensesnitt-metoder; equal og tostring En tur innom primitive typer inkl char og arrayer Et nytt verktøy for å holde rede på flere objekter; ArrayList Eksempel med flere klasser og ArrayList Siri Moe Jensen INF1000 - Høst 2015 uke 7 1 Siri Moe Jensen INF1000 - Høst 2015 uke 7 2 public class Regne { En klasse er en arbeidsbeskrivelse for hvordan man skal lage objekter. Det finnes alltid nøyaktig ett eksemplar av klassen når programmet kjører. [static metoder kan kjøres uten at vi lager objekter av klassen. I INF1000: for main, eventuelt for å vise/ teste enkeltmetoder som vi gjorde i uke 1-4] Klasser og objekter Objekter er instanser laget utifra beskrivelsen i en klasse. Når programmet starter, er det ingen objekter; de lages etter hvert med new. Derfor kan det være vilkårlig mange objekter av hver klasse. Siri Moe Jensen INF1000 - Høst 2015 uke 7 3 public static void main (String[] arg) { int mitttall = 3; int dobbelt = doble (mitttall); System.out.println ("Doblet=" + dobbelt); public static int doble (int tall) { int svar = 2*tall; return svar; filen Regne.java dobbelt 6 main doble Kjøring $ javac Regne.java Regne $ java Regne doblet=6 $ Siri Moe Jensen INF1000 - Høst 2015 uke 7 4 tall arg mitttall 3 svar 3 6 1

public class TestTeller { public static void main (String[] arg) { Teller skritt = new Teller (); skritt.leggtil(); int antall = skritt.lesteller(); System.out.println ("Skritt: " + antall); public class Teller { private int antall = 0; public void leggtil () { antall = antall + 1; public int lesteller () { return antall; skritt main :Teller $ javac Teller.java $ javac TestTeller.java $ java Testteller Teller Skritt: 1 Siri Moe Jensen INF1000 - Høst 2015 uke 7 5 $ arg antall 1 TestTeller antall 01 leggtil lesteller Når er objekter «like»? Likhet mellom tallverdier sjekkes med == og!=. Kan vi sjekke pekere på samme måte? String tekst = "INF1000"; String kopi = new String(tekst); // lager en kopi av tekst if (tekst == kopi) {... == sjekker om tekst og kopi er samme objekt. Testen over vil derfor ikke slå til. tekst :String INF1000 kopi :String INF1000 Siri Moe Jensen INF1000 - Høst 2015 uke 7 6 Å sammenligne tekster String tekst = "Hei"; // Nytt objekt String kopi = new String (tekst); // Enda et nytt objekt // Denne testen gir true: if (kopi.equals(tekst)) { // to objekter, lik tekst Denne testen kaller en metode inne i String-objektet kopi peker på. Metoden tar en peker til en annen String som parameter og sammenligner de to tekstene tegn for tegn tekst :String INF1000 equals kopi :String INF1000 equals Siri Moe Jensen INF1000 - Høst 2015 uke 7 7 Semantisk likhet Ofte er vi mer interessert i om innholdet i to objekter er «like» i en eller annen betydning Vi kan skrive en metode tilsvarende equals i våre egne klasser der vi selv bestemmer hva som avgjør om objekter er «like». I uke 5 laget vi klassen Navn: public class Navn { private String fornavn, mellomnavn, etternavn; public String penform () { return (fornavn + ' ' + mellomnavn + ' ' + etternavn); //... => Oppgave: Hvordan er det naturlig å sammenligne to Navn-objekter? Siri Moe Jensen INF1000 - Høst 2015 uke 7 8 2

Sammenligning av Navn-objekter En ny metode i klassen Navn for sammenligning av innholdet i to Navn-objekter public class Navn { private String fornavn, mellomnavn, etternavn; //... public boolean erlik (Navn navn2) { // Gjør om begge navnene til tekster på samme form String tekst1 = penform(); String tekst2 = navn2.penform(); // Bruker equals-metoden i String for å sjekke om de er like return (tekst1.equals(tekst2)); Å representere innhold som tekst For utskrift og andre formål er det nyttig om et objekt kan oppgi innholdet sitt som en String For å få til det kan vi lage en metode public String tostring () { i klassene våre, der vi selv bestemmer hvordan dataene skal representeres som en tekst. I klassen Navn kan vi f eks velge å gjenbruke metoden penform public String tostring () { return penform(); Siri Moe Jensen INF1000 - Høst 2015 uke 7 9 Siri Moe Jensen INF1000 - Høst 2015 uke 7 10 De viktigste er: Primitive datatyper int et heltall int n = 5; long et stort heltall long v = 0L; double et flyt-tall double pi = 3.14; char et tegn char c =? ; boolean sann/usann boolean t = true; Verdier av primitive typer kan sammenlignes ved hjelp av!= og == (innenfor samme type) Datatypen char En String kan lagre vilkårlig lange tekster (og er et objekt av en sammensatt type (klasse) med en del "særheter") char er en primitiv type og lagrer kun ett tegn Nyttig til f eks behandling av ett og ett tegn fra en String: String tekst = "Java!"; for (int i=0; i<tekst.length(); i++) { tegn = tekst.charat(i); System.out.println (tegn); $ javac Demo.java $ java Demo J a v a! $ Siri Moe Jensen INF1000 - Høst 2015 uke 7 11 Siri Moe Jensen INF1000 - Høst 2015 uke 7 12 3

Arrayer (repetisjon) Arrayer er en viktig mekanisme som alle programmeringsspråk har. + Enkel og klar notasjon: a[i] +Rask i bruk Må oppgi antallet elementer når arrayen lages Hvis antallet er for stort, sløser vi med plassen. Hvis det er for lite, får vi ikke lagret det vi skal Må selv holde rede på hvor mange som er i bruk Samlinger av objekter Ofte har vi nytte av at vi kan lage så mage objekter vi ønsker av en klasse underveis i programmet For å få tak i disse objektene trenger vi en peker til hver enkelt For eksempel i form av en array av pekere..// Klassen navn har en konstruktør for å sette navnene Navn[] familie = new Navn[4]; familie[0] = new Navn ("Donald", "Mc", "Duck"); familie[1] = new Navn ("Ole", "Mc", "Duck"); familie[2] = new Navn ("Dole", "Mc", "Duck"); familie[3] = new Navn ("Doffen", "Mc", "Duck"); Siri Moe Jensen INF1000 - Høst 2015 uke 7 13 Siri Moe Jensen INF1000 - Høst 2015 uke 7 14 Hvordan kan vi se for oss familien? Klassen ArrayList familie 0 1 2 3 Navn[] familie = new Navn[4]; :Navn Donald Mc Duck :Navn Ole Mc Duck :Navn Dole Mc Duck :Navn Doffen Mc Duck Biblioteksklassen ArrayList er et forsøk på forbedre arrayer: Men vet ikke alltid når vi skriver programmet hvor mange objekter vi vil ønske å opprette under kjøring dvs hvor stort array vi skal opprette Siri Moe Jensen INF1000 - Høst 2015 uke 7 15 Siri Moe Jensen INF1000 - Høst 2015 uke 7 16 4

ArrayList sammenlignet m array + Vi trenger ikke oppgi størrelsen; et ArrayList-objekt vil øke i størrelse automatisk. + Vi trenger ikke selv holde rede på antallet + Vi kan enkelt plassere et nytt element der vi vil Litt kronglete notasjon. Fungerer best for å lagre pekere; verditypene int, float etc må gis særbehandling. Du som programmerer velger hva du vil benytte i hvert enkelt tilfelle. Java-biblioteket Inngår i Java Development Kit (JDK) Inneholder hundrevis av klasser, dokumentert i: http://docs.oracle.com/javase/7/docs/api Appendix D i læreboken (de som brukes i boken) Ingen kan (bør) lære seg eller bruke alle disse! Slå opp for konkrete spørsmål (typisk valg av argumenter til en metode), vent med å kikke rundt til du har god tid.. Siri Moe Jensen INF1000 - Høst 2015 uke 7 17 Siri Moe Jensen INF1000 - Høst 2015 uke 7 18 Eksempel: DVD-arkiv* Vi ønsker oss et arkiv over DVDene våre, med muligheter til å oppdatere arkivet. Designvalg Vi vil lagre arkivet på disk mellom hver gang vi benytter det. Vi vil ha et program der vi kan gi kommandoer som så blir utført av programmet. Skritt 1. Hvilke klasser trenger vi? Det virker naturlig å ha en klasse for DVDer class DVD for å lagre data om en DVD Vi trenger også å kunne utføre operasjoner som har med hele arkivet å gjøre class DVDArkiv for å representere et arkiv Og så lager vi et test-program (som kan utvikles til den endelige applikasjonen vår) class TestDVDArkiv for å sjekke det vi har laget * Basert på Dag Langmyhrs eksempel Høst 2014 Siri Moe Jensen INF1000 - Høst 2015 uke 7 19 Siri Moe Jensen INF1000 - Høst 2015 uke 7 20 5

Klassen DVD (skritt 2 og 3) Grensesnitt Konstruktør med tittel for DVD: public DVD (String tittel) {.. // for å angi tittel idet vi oppretter et nytt objekt // Merk: Ingen type, heller ikke void. Navn som klassen. En måte å hente ut tittelen på: public String tostring () {.. Datarepresentasjon En privat objektvariabel som husker tittelen private String tittel; Siri Moe Jensen INF1000 - Høst 2015 uke 7 21 Klassen DVD (skritt 4) this brukt inne i en klasse peker til objektet vi utfører en metode eller konstruktør på. Her trenger vi this for å skille objektvariabelen fra parameteren i metoden, siden vi bruker samme navn. public class DVD { private String tittel; public DVD (String tittel) { // Konstruktør this.tittel = tittel; // this peker til objektet vi er i public String tostring() { return tittel; Siri Moe Jensen INF1000 - Høst 2015 uke 7 22 Her burde vi laget et testprogram for DVD men jukser litt, siden dette er en veldig enkel klasse og timen er begrenset Grensesnitt Klassen DVDArkiv (skritt 2) Konstruktør med filnavnet der arkivet lagres: public DVDArkiv(String navn) {... Hent navnet på arkivet (til f eks utskrift): public String tostring() {... Les arkivet inn fra disk: public void lesarkiv() throws Exception {... Skriv arkivet tilbake til disk: public void skrivarkiv() throws Exception {... Utfør kommandoer brukeren gir: public void utfoerkommandoer() {... Siri Moe Jensen INF1000 - Høst 2015 uke 7 23 Siri Moe Jensen INF1000 - Høst 2015 uke 7 24 6

Klassen DVDArkiv (skritt 3) Hvordan kan vi se for oss et arkiv? Datarepresentasjon Navnet på arkivet (dvs filnavnet der det ligger lagret): private String arkivnavn; Alle DVDene: private ArrayList<DVD> arkiv; mittarkiv :ArrayList<DVD> : :DVD :DVD :DVD :DVD Trenger vi en variabel som holder rede på antall? Hvorfor (ikke)? <med mer> Siri Moe Jensen INF1000 - Høst 2015 uke 7 25 Siri Moe Jensen INF1000 - Høst 2015 uke 7 26 Klassen DVDArkiv I (skritt 4) import java.util.scanner; import java.util.arraylist; import java.io.*; public class DVDArkiv { private String arkivnavn; private ArrayList<DVD> arkiv = new ArrayList<DVD>(); DVDArkiv(String navn) { arkivnavn = navn; public String tostring() { return "DVD-arkivet " + arkivnavn; // fortsetter neste slide Klassen DVDArkiv II (skritt 4) public void lesarkiv() throws Exception { File f = new File(arkivnavn); if (f.exists()) { // sjekker om arkivet finnes fra før Scanner s = new Scanner(f); while (s.hasnextline()) { arkiv.add(new DVD(s.nextLine())); s.close(); System.out.println("Arkivet " + arkivnavn + " er lest."); else { System.out.println("Nytt arkiv " +arkivnavn+ " opprettet."); // fortsetter neste slide Siri Moe Jensen INF1000 - Høst 2015 uke 7 27 Siri Moe Jensen INF1000 - Høst 2015 uke 7 28 7

Klassen DVDArkiv III (skritt 4) public void skrivarkiv() throws Exception { PrintWriter p = new PrintWriter(arkivnavn); for (int i = 0; i < arkiv.size(); i++) { p.println(arkiv.get(i).tostring()); p.close(); // fortsetter neste slide Kommando-løkke (én variant) public void utfoerkommandoer() {... gi informasjon inkl meny/ valgmuligheter be om input les input while (input er forskjellig fra sluttkommando) håndter lovlige alternativer skriv feilmelding for ulovlige alternativer gi info om meny be om input les input eventuelle avsluttende operasjoner/ beskjeder Siri Moe Jensen INF1000 - Høst 2015 uke 7 29 Siri Moe Jensen INF1000 - Høst 2015 uke 7 30 Klassen DVDArkiv IV (skritt 4) Klassen DVDArkiv V (skritt 4) public void utfoerkommandoer() { private void vismeny () { Scanner s = new Scanner(System.in); System.out.println(); System.out.println("Lovlige kommandoer:"); vismeny(); // en egen metode for dette System.out.println(" A (Avslutt)"); System.out.print("Kommando: "); System.out.println(" N (Ny DVD)"); char kommando = s.nextline().charat(0); // ser kun på første tegn System.out.println(" V (Vis oversikt)"); while (kommando!= 'A') { // fortsetter inntil 'A' // end vismeny if (kommando == 'N') { // end DVDArkiv System.out.print("DVDens navn: "); arkiv.add (new DVD(s.nextLine())); else if (kommando == 'V') { for (int i = 0; i < arkiv.size(); i++) { System.out.println(i + ". " + arkiv.get(i)); else { System.out.println("'" + kommando + "' er ingen kommando!"); vismeny(); System.out.print("Kommando: "); kommando = s.nextline().charat(0); // end while // end utfoerkommandoer // Siri fortsetter Moe Jensen neste slide INF1000 - Høst 2015 uke 7 31 Siri Moe Jensen INF1000 - Høst 2015 uke 7 32 8

Klassen TestDVDArkiv Kjøring av TestDVDArkiv public class TestDVDArkiv { public static void main(string[] arg) throws Exception { DVDArkiv mittarkiv = new DVDArkiv("dvd-arkiv.text"); mittarkiv.lesarkiv(); mittarkiv.utfoerkommandoer(); mittarkiv.skrivarkiv(); // main // TestDVDArkiv $ java TestDVDArkiv Arkivet dvd-arkiv.text er lest. Lovlige kommandoer: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: V 0. Hobbiten 1-3 1. Louder than bombs 2. Oppdrag Nemo Lovlige kommandoer: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: N DVDens navn: The Martian Lovlige kommandoer: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: V 0. Hobbiten 1-3 1. Louder than bombs 2. Oppdrag Nemo 3. The Martian Lovlige kommandoer: A (Avslutt) N (Ny DVD) V (Vis oversikt) Kommando: A $ Siri Moe Jensen INF1000 - Høst 2015 uke 7 33 Siri Moe Jensen INF1000 - Høst 2015 uke 7 34 INF1000 fremover Obligatorisk innlevering 6 Det meste (alt) stoffet som trengs er gjennomgått nå start tidlig! Merk fuskesjekk!! Automatisk, på tvers av grupper og tidligere semestere håndteres av instituttet, ikke gruppelærer som vil rette besvarelsen og gi poeng som vanlig samarbeid ok men all kode skal skrives selv og forstås fusk kan gi alvorlige konsekvenser også utover det emnet og semesteret der det oppdages Siri Moe Jensen INF1000 - Høst 2015 uke 7 35 9