240 likes | 431 Views
Å 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
E N D
Å 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 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.
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. 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.
Å 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. 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.
En mulig løsning Flate Belegg Maling Tapet navn lengde bredde navn pris breddePåBelegg navn pris lengdePrRull breddePrRull navn prisantStrøk antKvmPrLiter finnNavn finnLengde finnBredde finnAreal finnOmkrets finnNavn finnPrisPrM finnBredde finnAntMeter finnTotalpris finnNavn finnPrisPrRull finnLengde finnBredde finnAntRuller finnTotalpris finnNavn finnPrisPrLiter finnAntStrøk finnAntKvmPrLiter finnAntLiter finnTotalpris Vi programmerer hver enkelt klasse for seg og lager testprogram som prøver ut klassen. 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.
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 navn lengde bredde finnNavn finnLengde finnBredde finnAreal finnOmkrets 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.
Klassen Flate ser slik ut 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 metodehode konstruktør Flate public double finnAreal() { return bredde * lengde; } navn lengde bredde metodekropp finnNavn finnLengde finnBredde finnAreal finnOmkrets klassens medlemmer = variabler + metoder objektmetoder 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); Gjør alle oppgavene side 95. 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.
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. 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.
Oppgave • 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 Vare varenavn varenr pris pr kg uten moms finn pris for et gitt antall kilo uten moms finn pris for et gitt antall kilo med moms sett ny pris 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. 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.
Tilgangsmodifikatorene private og public pakketilgang • 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; } …… } privat tilgang offentlig tilgang 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. 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.
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 metodene String 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) 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.
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. 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.
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() { } 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.
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. 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.
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. 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.
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. 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.
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) 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.
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. 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.
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. 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.
Appleter og grafikk import java.awt.*; // klassene Graphics og Container import javax.swing.*; // klassen JApplet og JPanel public 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 det på neste side). Alle appleter har en init()-metode. Nettleseren lager et objekt av klassen EnkelApplet, og sender meldingen init() til dette. (Vesens- forskjellig fra applikasjoner, som har klassemetoden main().) Tegningen vi skal lage beskriver vi i en egen klasse. Tegneprosedyren ligger i en metode som heter paintComponent(). 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.
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. 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.
superklassen til alle andre klasser Et utsnitt avklassetreet i Java Object setBackground() og getBackground() arves herfra Component subklasse til Object og Component Container add() arves herfra superklasse til JPanel og Tegning JComponent Panel JPanel Applet getContentPane() arves herfra Tegning JApplet EnkelApplet 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.
Objektene som de ulike klassenebeskriver utgjør mengder Container Panel JComponent JPanel Applet JApplet Tegning EnkelApplet 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.
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() 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.
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.Font Eksempel: 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.ITALIC Font.PLAIN Metoder: String getName() int getSize() int getStyle() boolean isBold() boolean isItalic() boolean isPlain() Klasser for farger og skrifttyper 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.