Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

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

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon 2001-05-18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik."— Utskrift av presentasjonen:

1 Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 4 Å 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 Noen nye operatorerside 17 Appleter og grafikkside Subklasser og ”extends”side Ferdige klasser for grafikkside 23-24

2 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

3 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

4 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 4, side 4 En mulig løsning Belegg navn pris breddePåBelegg finnNavn finnPrisPrM finnBredde finnAntMeter finnTotalpris Tapet navn pris lengdePrRull breddePrRull finnNavn finnPrisPrRull finnLengde finnBredde finnAntRuller finnTotalpris Maling navn pris antStrøk antKvmPrLiter finnNavn finnPrisPrLiter finnAntStrøk finnAntKvmPrLiter finnAntLiter finnTotalpris Flate navn lengde bredde finnNavn finnLengde finnBredde finnAreal finnOmkrets Vi programmerer hver enkelt klasse for seg og lager testprogram som prøver ut klassen.

5 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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 navn lengde bredde finnNavn finnLengde finnBredde finnAreal finnOmkrets

6 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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 navn lengde bredde finnNavn finnLengde finnBredde finnAreal finnOmkrets

7 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

8 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 4, side 8 Oppgave 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 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.

9 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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 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.

10 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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 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)

11 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

12 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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() { }

13 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

14 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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)

17 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 4, side 17 Noen nye operatorer inkrementoperatoren ++ dekrementoperatoren -- sammensatte tilordningsoperatorer tall++er det samme somtall = tall + 1 tall--er det samme somtall = tall - 1 tall += 3er det samme somtall = tall + 3 tall -= 3er det samme somtall = tall - 3 tall *= 3er det samme somtall = tall * 3 tall /= 3er det samme somtall = tall / 3 tall %= 3er det samme somtall = tall % 3 Gjør oppgave 2, side 110.

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 ISBN Kapittel 4, side 18 Grafikk Skjermflaten er delt inn i piksler i henhold til den oppløsningen den har, eks x 1024 piksler. Ved tegning må vi oppgi x- og y-koordinater i henhold til et aksekors med origo i øverste venstre hjørne.

19 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 4, side 19 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().

20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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.

21 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 4, side 21 Et utsnitt av klassetreet i Java setBackground() og getBackground() arves herfra getContentPane() arves herfra add() arves herfra superklassen til alle andre klasser superklasse til JPanel og Tegning subklasse til Object og Component Object Component Container Panel Applet JApplet JComponent JPanel Tegning EnkelApplet

22 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN Kapittel 4, side 22 Objektene som de ulike klassene beskriver utgjør mengder Container JComponent Panel Applet JApplet EnkelApplet JPanel Tegning

23 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk ISBN 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()

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 ISBN 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.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()


Laste ned ppt "Programmering i Java versjon 2001-05-18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik."

Liknende presentasjoner


Annonser fra Google