Å lage egne klasser

24
versjon 2001-05-18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8. Kapittel 4 Programmering i Java http://www.tisip.no/Javabok/ Å lage egne klasser Byggeklossprinsippet i programmering side 2 Å modellere klasser side 3- 4 Klassen Flate side 5- 6 Lokale variabler, parametre og objektvariabler side 7 Klassen Vare side 8 Innholdet i en klasse, detaljer og regler side 9 - 16 Noen nye operatorer side 17 Appleter og grafikk side 18-19

Upload: gordon

Post on 18-Jan-2016

45 views

Category:

Documents


0 download

DESCRIPTION

Å lage egne klasser. Byggeklossprinsippet i programmeringside 2 Å modellere klasserside 3-4 Klassen Flateside 5-6 Lokale variabler, parametre og objektvariablerside 7 Klassen Vareside 8 Innholdet i en klasse, detaljer og reglerside 9 - 16 Noen nye operatorerside 17 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Å lage egne klasser

versjon 2001-05-18Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal,

Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.Kapittel 4

Programmering i Javahttp://www.tisip.no/Javabok/

Å lage egne klasser

Byggeklossprinsippet i programmering side 2Å modellere klasser side 3-4Klassen Flate side 5-6Lokale variabler, parametre og objektvariabler side 7

Klassen Vare side 8

Innholdet i en klasse, detaljer og regler side 9 - 16

Noen nye operatorer side 17

Appleter og grafikk side 18-19

Subklasser og ”extends” side 20-22

Ferdige klasser for grafikk side 23-24

Page 2: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 2

Byggeklossprinsippet i programmering

• Vi deler problemet opp i mindre deler og kan dermed konsentrere oss om en ting avgangen.

• Flere personer kan samarbeide ved å jobbe med hver sine deler, uavhengig av hverandre.

• Byggeklossene kan testes og forandres uavhengig av hverandre. Dersom grensesnittet til klassen ikke forandres, kan vi endre implementasjonen uten at dette berører de øvrige klassene.

• Ekstra omtanke når en klasse konstrueres kan gjøre den mer generell og brukbar også ved en senere anledning.

Page 3: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 3

Å modellere klasser

• Oppussingseksemplet fra kapittel 2– Du har nettopp kjøpt deg en gammel leilighet som du skal pusse opp. Du

har bestemt deg for at bad og kjøkken, samt elektriske installasjoner, holder mål. Du ønsker imidlertid å legge nytt golvbelegg i et par av rommene, samt male og tapetsere en del. Du trenger å utføre en del beregninger:

• Hvor mye maling, eventuelt tapet, trengs det til en bestemt vegg?• Hvor mange meter golvbelegg, trengs det til et golv?• Hva koster oppussingen av hver enkelt av flatene?

• Oppgaver– Finn objekter ved å se på substantiver.– Finn fram til den kunnskapen som må lagres i systemet. Dette blir

attributter til objektene. Sett opp en liste over attributter og objekter som hører sammen.

– Finn ut hvilke beregninger som må utføres.– Fordel ansvaret for beregningene mellom objektene (kan være vanskelig!)– Tegn klassediagram.

Page 4: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 4

En mulig løsning

Belegg

navnprisbreddePåBelegg

finnNavnfinnPrisPrMfinnBreddefinnAntMeterfinnTotalpris

Tapet

navnprislengdePrRullbreddePrRull

finnNavnfinnPrisPrRullfinnLengdefinnBreddefinnAntRullerfinnTotalpris

Maling

navnprisantStrøkantKvmPrLiter

finnNavnfinnPrisPrLiterfinnAntStrøkfinnAntKvmPrLiterfinnAntLiterfinnTotalpris

Flate

navnlengdebredde

finnNavnfinnLengdefinnBreddefinnArealfinnOmkrets

Vi programmerer hver enkelt klasse for seg og lager testprogram som prøver ut klassen.

Page 5: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 5

Klientprogram som tester klassen Flate

class Golvberegninger { public static void main(String[] args) { JavabokGUI gui = new JavabokGUI("Arealet av et golv"); gui.show();

/* Trinn 1: Lager et objekt av klassen Flate. */ Flate etGolv = new Flate("Torils golv", 4.8, 2.3);

/* Trinn 2: Henter ut data og får utført beregninger på objektet */ String navnetPåGolvet = etGolv.finnNavn(); double bredden = etGolv.finnBredde(); double lengden = etGolv.finnLengde(); double arealet = etGolv.finnAreal(); double omkretsen = etGolv.finnOmkrets();

/* Trinn 3: Skriver ut resultatene slik at de kan kontrolleres */ gui.skrivResultater("Data om golvet med navn: " + navnetPåGolvet + ":"); gui.skrivResultater("Bredde: " + bredden); gui.skrivResultater("Lengde: " + lengden); gui.skrivResultater("Areal: " + arealet); gui.skrivResultater("Omkrets: " + omkretsen); }}

Flate

navnlengdebredde

finnNavnfinnLengdefinnBreddefinnArealfinnOmkrets

Page 6: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 6

Klassen Flate ser slik ut

public double finnAreal() { return bredde * lengde; }

metodehode

metodekropp

Gjør alle oppgavene side 95.

klassens medlemmer = variabler + metoder

Utdrag av klientprogrammet:Flate etGolv = new Flate("Torils golv", 4.8, 2.3);….double arealet = etGolv.finnAreal();double omkretsen = etGolv.finnOmkrets();….gui.skrivResultater("Areal: " + arealet);gui.skrivResultater("Omkrets: " + omkretsen);

class Flate { private String navn; private double lengde; private double bredde; public Flate(String startNavn, double startLengde, double startBredde) { navn = startNavn; lengde = startLengde; bredde = startBredde; } public String finnNavn() { return navn; } public double finnLengde() { return lengde; } public double finnBredde() { return bredde; } public double finnAreal() { return bredde * lengde; } public double finnOmkrets() { return 2 * (lengde + bredde); }}

objektvariabler

konstruktør

objektmetoder

Flate

navnlengdebredde

finnNavnfinnLengdefinnBreddefinnArealfinnOmkrets

Page 7: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 7

Sammenheng: Lokale variabler, parametre og objektvariabler

• Lokale variabler deklareres inne i en metode og kan bare brukes inne i den blokken der de deklareres.

• Parametre fungerer som lokale variabler med startverdier gitt av argumentlisten ved metodekallet.

• Lokale variabler gis ingen bestemt startverdi, dette er programmererens ansvar.

• Objektvariabler deklareres inne i en klasse, men utenfor alle metoder. De kan brukes av alle metodene i klassen.

• Objektvariabler gis startverdien 0 (eller null dersom variabelen tilhører en referansetype).

• Oppgave 1: Endre metoden finnOmkrets() slik at summen av lengde og bredde lagres i en lokal variabel før omkretsen beregnes og returneres.

• Oppgave 2: Se på testprogrammet foran. Finn alle lokale variabler og alle argumenter.

Page 8: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 8

Oppgave

Vare

varenavnvarenrpris pr kg uten moms

finn pris for et gitt antall kilo uten momsfinn pris for et gitt antall kilo med momssett ny pris

• Programmer klassen Vare etter spesifikasjonene gitt i klassediagrammet til venstre. Husk å lage konstruktør.

• Lag et lite, svært enkelt klientprogram.

• Se på programkoden du har laget, og vis eksempler på:

– objektvariabel– objektmetode– parameter– argument– return-setning– setning der et objekt blir laget

Gjør oppgave 3 side 104. Denne oppgaven bygger videre på klassen Vare som du nettopp har laget.

Etter disse praktiske oppgavene skal vi se noe mer i detalj på de enkelte delene av en klasse.

Page 9: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 9

Tilgangsmodifikatorene private og public

• Tilgangsmodifikatorer styrer tilgjengeligheten til klasser, konstruktører og medlemmer.

• private: kun tilgjengelig innenfra klassen, for eksempel fra alle metoder i klassen.

• public: tilgjengelig fra overalt, for eksempel fra et klientprogram.

• ingen tilgangsmodifikator = pakketilgang, kun tilgjengelig innenfor den pakken som klassen tilhører.

class Flate { private String navn; // til identifikasjon private double lengde; private double bredde;

public Flate(String startNavn, double startLengde, double startBredde) { navn = startNavn; lengde = startLengde; bredde = startBredde; }……}

pakketilgang

privattilgang

offentligtilgang

Dersom tilgangen til klassen er strengere enn tilgangen til en konstruktør eller et medlem,vil klassetilgangen gjelde for konstruktøren/medlemmet. Ellers gjelder den tilgangen som konstruktøren/medlemmet har.

Page 10: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 10

Overloading av navn

• Flere metoder kan ha samme navn dersom de har forskjellig signatur– (Signaturen til en metode består av metodenavnet, samt antall og type

parametre. Returtypen og parameternavnene er ikke en del av signaturen.)

• Eksempel fra klassen String– int indexOf(int tegn)

– int indexOf(int tegn, int fraIndeks)

– int indexOf(String str)

– int indexOf(String str, int fraIndeks)

• Eksempel på bruk av disse metodeneString tekst = "Det er 9.august i dag. Om to uker er skolen i full gang.";

int pos1 = tekst.indexOf('.'); // pos1 blir 8

int pos2 = tekst.indexOf('9'); // pos2 blir 7

int pos3 = tekst.indexOf('.', pos1 + 1); // pos3 blir 21

int pos4 = tekst.indexOf("Om"); // pos4 blir 23

int pos5 = tekst.indexOf("Om", pos4 + 1);// pos5 blir -1 (=finnes ikke)

Page 11: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 11

Konstruktører og initiering av objektvariabler

• Også konstruktørnavnet kan overloades. En klasse kan ha flere konstruktører dersom de har forskjellig signatur.

• En standardkonstruktør er en konstruktør med tom parameterliste.

• Dersom vi ikke lager noen konstruktører selv, blir det automatisk laget en standardkonstruktør med tom kropp.

• Dersom vi lager egne konstruktører, og vi ønsker at en standardkonstruktør skal eksistere, må vi lage den.

• Vi kan initiere objektvariabler samtidig med deklarasjonen:– private String navn = ““;

– private double lengde = 5;

• Dersom vi gir verdi til disse variablene i en konstruktør, vil verdiene i konstruktøren overstyre de initierte verdiene.

• En konstruktør kan, men må ikke, gi verdier til alle objektvariabler.

Page 12: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 12

Eksempler på konstruktører for klassen Flate

public Flate(String startNavn, double startLengde, double startBredde) {

navn = startNavn; lengde = startLengde; bredde = startBredde; } public Flate(double startLengde) { lengde = startLengde; } public Flate() { }

Page 13: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 13

Objektmetoder

• Eksempler:public double finnOmkrets() { // returtypen er en primitiv datatype return 2 * (lengde + bredde); // returnerer en verdi som passer til returtypen}public String finnNavn() { // returtypen er en referansetype return navn; // returnerer referansen til et objekt}public void settBredde(double nyBredde) { // ingen verdi returneres bredde = nyBredde; // metoden endrer en objektvariabel}

• Eksempel på bruk av den siste metoden:stuegolv.settBredde(5.3); // Melding: ”Hei, stuegolv! Du skal ha ny bredde lik

5.3!”

• Metoder som henter ut verdier fra objektvariabler, eller beregner resultater med utgangspunkt i disse verdiene, kalles tilgangsmetoder (her: finnOmkrets() og finnNavn()). Metodene endrer ikke på objektvariablene.

• Metoder som endrer på objektvariabler kalles mutasjonsmetoder (her: settBredde()).

• En immutabel klasse er en klasse som bare inneholder tilgangsmetoder.• En mutabel klasse inneholder begge typer metoder.

Page 14: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 14

Metoder og konstanter felles for hele klassen

• Modifikatoren static betegner at noe er felles for alle objekter av klassen.• klassekonstant

– en konstant som er felles for alle objekter av en klasse– deklareres på samme måte som en objektvariabel med initiering, men med

modifikatorene static og final i tillegg:• static final double moms = 23.0;

• klassemetode– en metode som ikke trenger kalles på vegne av et objekt. – deklareres med modifikatoren static– kalles på vegne av klassen– eksempler på metoder:

• public static void main(String[] args) {.... // velkjent!• public static double sqrt(double tall) // i klassen java.lang.Math• public static double random() // i klassen java.lang.Math

– bruk:• double kvadratrot = Math.sqrt(15678); • double tilfeldig = Math.random(); // tilfeldig tall i intervallet [0.0,1.0>

– med unntak av main() lager vi svært få klassemetoder i denne boka. Klassemetoder har lite med objektorientering å gjøre.

Page 15: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 15

Skjuling av navn

• Hvorfor fungerer ikke følgende metode?public void settLengde(double lengde) {

lengde = lengde;

}

• Parameternavnet lengde skjuler objektvariabelen med samme navn.

• Vi må passe på at vi ikke gir samme navn til parametre og objektvariabler.

• Dersom vi absolutt ønsker å bruke samme navn, kan vi skille navnene fra hverandre ved å bruke det reserverte ordet this:public void settLengde(double lengde) {

this.lengde = lengde;

}

• this er en referanse som alltid peker til det objektet Java-tolkeren holder på med i øyeblikket.

Page 16: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 16

Programmeringskonvensjoner for klasser

• Dette er retningslinjer, ikke syntaksregler.

• Klassenavn har stor forbokstav.

• Navn på variabler og metoder har liten forbokstav.

• Dersom navnet består av flere ord, benyttes stor forbokstav fra og med ord nummer to. Understrekingstegn og $ benyttes ikke.

• Objektvariabler har tilgangsmodifikator private.

• Konstruktører har tilgangsmodifikator public.

• Metoder har tilgangsmodifikator public eller private.

• Klassevariabler og klassemetoder brukes sjelden.

• Tilgangs- og mutasjonsmetoder som har som oppgave å hente ut eller forandre på et attributt, har standardiserte navn på engelsk. Med tilpasning til norsk får vi følgende, vist ved eksempler:

public void settLengde(double nyLengde)

public double finnLengde()

public boolean erFerdig()

public void settFerdig(boolean nyFerdig)

Page 17: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 17

Noen nye operatorer

• inkrementoperatoren ++

• dekrementoperatoren --

• sammensatte tilordningsoperatorer

tall++ er det samme som tall = tall + 1

tall-- er det samme som tall = tall - 1

tall += 3 er det samme som tall = tall + 3

tall -= 3 er det samme som tall = tall - 3

tall *= 3 er det samme som tall = tall * 3

tall /= 3 er det samme som tall = tall / 3

tall %= 3 er det samme som tall = tall % 3

Gjør oppgave 2, side 110.

Page 18: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 18

Grafikk

• Skjermflaten er delt inn i piksler i henhold til den oppløsningen den har, eks. 1280 x 1024 piksler.

• Ved tegning må vi oppgi x- og y-koordinater i henhold til et aksekors med origo i øverste venstre hjørne.

Page 19: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 19

Appleter og grafikk

import java.awt.*; // klassene Graphics og Container

import javax.swing.*; // klassen JApplet og JPanelpublic class EnkelApplet extends JApplet { public void init() { Container innhold = getContentPane(); Tegning tegningen = new Tegning(); innhold.add(tegningen); }}class Tegning extends JPanel { public void paintComponent(Graphics vindu) { super.paintComponent(vindu); // Husk denne! setBackground(Color.green); vindu.drawString("Hei hei", 50, 50); vindu.drawOval(40, 30, 55, 40); }}

Alle appleter må være offentlige,og subklasse til JApplet (mer om detpå neste side).

Alle appleter har en init()-metode.Nettleseren lager et objekt avklassen EnkelApplet, og sendermeldingen init() til dette. (Vesens-forskjellig fra applikasjoner, somhar klassemetoden main().)

Tegningen vi skal lage beskriver vii en egen klasse.

Tegneprosedyren ligger i en metodesom heter paintComponent().

Page 20: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 20

Subklasser og ”extends”

• EnkelApplet er subklasse (extends) til JApplet:– Klassen JApplet beskriver mengden av (nesten) alle mulige appleter.

– Klassen EnkelApplet beskriver bare appleter som ser ut akkurat som vår lille, enkle. Dette vil være en delmengde, eller submengde, av den første, store mengden med appleter.

– Alt som er sant for mengden av alle appleter, er også sant for vår spesielle applet. Vi sier at klassen EnkelApplet arver det som gjelder for alle appleter.

• Tegning er subklasse (extends) til JPanel.

• Alle klasser i Java henger sammen i et klassetre.– Klassen Object beskriver absolutt alle objekter.

– De øvrige klassene henger sammen med klassen Object i et klassetre.

Page 21: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 21

Et utsnitt avklassetreet i Java

setBackground() og getBackground() arves herfra

getContentPane()arves herfra

add() arves herfra

superklassentil alle andre klasser

superklasse tilJPanel og Tegning

subklasse tilObject og Component

Object

Component

Container

Panel

Applet

JApplet

JComponent

JPanel

Tegning

EnkelApplet

Page 22: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 22

Objektene som de ulike klassenebeskriver utgjør mengder

Container

JComponent Panel

Applet

JApplet

EnkelApplet

JPanel

Tegning

Page 23: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 23

Klassen java.awt.Graphics

Noen metoder:

void drawLine(int x1, int y1, int x2, int y2)

void drawOval(int x, int y, int bredde, int høyde)

void fillOval(int x, int y, int bredde, int høyde)

void drawRect(int x, int y, int bredde, int høyde)

void fillRect(int x, int y, int bredde, int høyde)

void drawString(String tekst, int x, int y)

void setFont(Font skrifttype)

void setColor(Color farge)

Font getFont()

Color getColor()

Page 24: Å lage egne klasser

Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk 2000. ISBN 82-417-1132-8.

Kapittel 4, side 24

Klasser for farger og skrifttyper

Klassen java.awt.Color

Eksempel:Color farge = Color.gray;

farge = farge.brighter();

vindu.setColor(farge);

Klassekonstanter:

Color.black Color.blue Color.cyan, ...

Metoder:Color brighter()

Color darker()

Klassen java.awt.FontEksempel:

Font skrift = new Font("Serif", Font.BOLD, 16);vindu.setFont(skrift);

Konstruktør:Font(String navn, int stil, int størrelse)

Klassekonstanter:Font.BOLD Font.ITALICFont.PLAIN

Metoder:String getName()int getSize()int getStyle()boolean isBold()boolean isItalic()boolean isPlain()