Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon 2000-08-15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.

Liknende presentasjoner


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

1 Programmering i Java http://www.tisip.no/Javabok/ versjon 2000-08-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 2000. ISBN 82-417-1132-8. Kapittel 12 Arv og polymorfi Repetisjon fra kap. 4side 2-3 Generalisering og spesialiseringside 4-5 Arvside 6-7 Polymorfiside 8-10 Oppussingseksempletside 11-12 Hva hvis polymorfi ikke hadde eksistert?side 13 Når har vi behov for å bruke instanceof?side 14 Tilgangsmodifikatorerside 15-17 Arv i to nivåerside 18 Definisjoner og reglerside 19-24 Interfaceside 25-28

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 2 Et utsnitt av klassetreet i Java Object Component Container Panel Applet JApplet JComponent JPanel Tegning 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 Repetisjon fra kapittel 4 EnkelApplet

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 3 Objektene som de ulike klassene beskriver utgjør mengder Container JComponent Panel Applet JApplet EnkelApplet JPanel Tegning Repetisjon fra kapittel 4

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 4 Generalisering og spesialisering 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 Belegg -breddePåBelegg +finnBredde +finnMaterialbehov Tapet -lengdePrRull -breddePrRull +finnLengde +finnBredde +finnMaterialbehov Maling -antStrøk -antLiterPrKvm +finnAntStrøk +finnAntLiterPrKvm +finnMaterialbehov Materiale -navn -pris +finnNavn +finnPrisPrEnhet +finnTotalpris +finnMaterialbehov generalisering, superklasse spesialiseringer, subklasser

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 5 Hva forteller klassetreet? Materiale TapetMalingBelegg Et belegg er et materiale. En maling er et materiale. En tapet er et materiale. Alle belegg er en delmengde av alle materialer. Alle malinger er en delmengde av alle materialer. Alle tapeter er en delmengde av alle materialer. Et klassetre viser et forhold som eksistererer mellom klasser. En klasse er en generalisering/spesialisering av en annen klasse. Pilen går fra den spesialiserte klassen til den generaliserte klassen. Må ikke forveksles med assosiasjon. En assosiasjon mellom to klasser uttrykker at det eksisterer et forhold mellom objektene av de involverte klassene. Gjør oppgaven side 332.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 6 Arv En subklasse arver ikke-private medlemmer fra superklassen. Eksempel på konsekvenser: Til et objekt av klassen Belegg kan en klient sende følgende meldinger: –finnNavn() –finnPrisPrEnhet() –finnTotalpris() –finnBredde() –finnMaterialbehov() Belegg -breddePåBelegg +finnBredde +finnMaterialbehov Tapet -lengdePrRull -breddePrRull +finnLengde +finnBredde +finnMaterialbehov Maling -antStrøk -antLiterPrKvm +finnAntStrøk +finnAntLiterPrKvm +finnMaterialbehov Materiale -navn -pris +finnNavn +finnPrisPrEnhet +finnTotalpris +finnMaterialbehov

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 7 Hva med dataene i superklassen? Et objekt av klassen Tapet har også objektvariablene fra Materiale (navn og pris) inne i seg, men de kan bare nås via metoder arvet fra Materiale. Brokade 500 12 0.6 Tapet tapeten = new Tapet(”Brokade”, 500, 12, 0.6); kun tilgjengelig via finn-metoder private i klassen Tapet

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 8 Polymorfi Formlene for å regne ut materialbehov er forskjellig for belegg, maling og tapet. Men behovet kan beregnes for alle typer materiale. Metoden finnMaterialbehov() er polymorf (= ”mangeformet, som opptrer i mange former”). Metoden er abstrakt i klassen Materiale (ikke mulig å finne en formel som gjelder for alle materialer). Klassen er abstrakt fordi den inneholder en abstrakt metode. Det er ikke mulig å lage objekter av en abstrakt klasse. Belegg -breddePåBelegg +finnBredde +finnMaterialbehov Tapet -lengdePrRull -breddePrRull +finnLengde +finnBredde +finnMaterialbehov Maling -antStrøk -antLiterPrKvm +finnAntStrøk +finnAntLiterPrKvm +finnMaterialbehov Materiale -navn -pris +finnNavn +finnPrisPrEnhet +finnTotalpris +finnMaterialbehov En subklasse må implementere metoden for at det skal være mulig å lage objekter av subklassen. Klassen blir konkret. At metoden står i klassen Materiale forteller at vi kan sende meldingen finnMaterialbehov() til alle objekter som tilhører konkrete subklasser av Materiale.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 9 double areal = enFlate.finnAreal(); double antLiter = areal * antStrøk / antKvmPrLiter; int heltAntallLitere = (int) antLiter; double overLiteren = antLiter - heltAntallLitere; if (overLiteren >= 0.5 + grense) return heltAntallLitere + 1.0; else if (overLiteren >= grense) return heltAntallLitere + 0.5; else return heltAntallLitere; double lengdeFlate = enFlate.finnLengde(); double høydeFlate = enFlate.finnBredde(); /* finner antall høyder vi trenger: */ int antHøyder = (int) (lengdeFlate / breddePrRull); double rest = lengdeFlate % breddePrRull; if (rest >= grense) antHøyder++; /* finner antall ruller som trengs */ int antRuller; int antHøyderPrRull = (int) (lengdePrRull / høydeFlate); if (antHøyderPrRull > 0) { antRuller = antHøyder / antHøyderPrRull; rest = antHøyder % antHøyderPrRull; if (rest >= grense) antRuller++; } else { // rullen er for kort til å dekke en høyde (sjelden!) …osv... return antRuller; klient beregnMaterialbehov(flaten) enMaling etBelegg enTapet double lengdeFlate = enFlate.finnLengde(); double breddeFlate = enFlate.finnBredde(); int antBredder = (int)(lengdeFlate / breddePåBelegg); double rest = lengdeFlate % breddePåBelegg; if (rest >= grense) antBredder++; return antBredder * breddeFlate; Gjør oppgavene side 334.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 10 Vis programliste 12.1 (s. 336-339) og 12.2 (s. 341). Gjør oppgavene 2-4 side 340. Gjør oppgavene 1, 3 og 4 side 343.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 11 Oppussingseksemplet med mange flater og mange typer materialer Belegg -breddePåBelegg {frozen} +finnMaterialbehov( enFlate: Flate) Tapet -lengdePrRull {frozen} -breddePrRull {frozen} +finnMaterialbehov( enFlate: Flate) Maling -antStrøk {frozen} -antLiterPrKvm {frozen} +finnMaterialbehov( enFlate: Flate) Materiale -navn {frozen} -pris {frozen} +finnTotalpris(enFlate: Flate) +finnMaterialbehov(enFlate: Flate) Flate +settMateriale( nyttMateriale: Materiale) +finnMateriale() +finnAreal() +finnOmkrets() -navn {frozen} -lengde {frozen} -bredde {frozen} * 1 * 1 trenger består av 1 * bruker Materiale Oppussingsprosjekt finnNavn() registrerNyFlate( nyFlate: Flate) finnFlate(navn: String) finnAntFlater() finnFlate(indeks: int) registrerNyttMateriale( nyttMateriale: Materiale) finnMateriale(navn: String) finnAntMaterialer() finnMateriale(indeks: int) finnTotalpris() navn: String {frozen}

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 12 Oppussingseksemplet med mange flater og mange typer materialer, programmering Utsnitt fra kap 10: class Oppussingsprosjekt { private String navn; private ArrayList alleFlater = new ArrayList(); private ArrayList alleMalinger = new ArrayList(); public Maling registrerNyMaling(Maling nyMaling) { Maling denne = finnMaling(nyMaling.finnNavn()); if (denne == null) { alleMalinger.add(nyMaling); return nyMaling; } else return denne; } Nå, i kap. 12: class Oppussingsprosjekt { private String navn; private ArrayList alleFlater = new ArrayList(); private ArrayList alleMaterialer = new ArrayList(); public Materiale registrerNyttMateriale(Materiale nyttMateriale) { Materiale dette = finnMateriale(nyttMateriale.finnNavn()); if (dette == null) { alleMaterialer.add(nyttMateriale); return nyttMateriale; } else return dette; } En referanse til Materiale kan settes til å peke til et objekt av en hvilken som helst subklasse. Vårt nye program kan håndtere mange forskjellige materialer, til tross for få endringer i forhold til programmet i kapittel 10. Vi utnytter arv og polymorfi.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 13 Hva hvis polymorfi ikke hadde eksistert? Hva gjør polymorfien for oss? –I vårt eksempel lar den oss håndtere ulike materialtyper under ett. –Vi sender en melding til et objekt som tilhører en subklasse av Materiale. –Objektet vet selv hvordan behovet skal regnes ut. Hva hvis objektet ikke selv visste hvilken formel som skulle brukes? –Da måtte vi bruke if-else-if, omtrent slik: if (materiale instanceof Maling) {....formler for å beregne malingsbehov } else if (materiale instanceof Belegg) {....formler for å beregne behov av belegg } else {....formler for å beregne behov av tapet } Tenk deg om en gang til dersom du tror at du trenger å bruke instanceof kombinert med en if-else-if-else-sekvens. –Du bør da vurdere om det er bedre å lage en abstrakt metode i en felles superklasse for de involverte klassene, og så la hver enkelt klasse få sin egen implementasjon av metoden

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 14 Når har vi behov for å bruke operatoren instanceof? Vi trenger å bruke instanceof i i de tilfellene der vi skal sende melding til kun en del av et subtre. Vi lager følgende objekter: A objekt1 = new C(); A objekt2 = new E(); Vi kan trygt sende meldingen metode1() til begge objektene: objekt1.metode1(); objekt2.metode1(); Meldingen metode2() kan vi bare sende til subklasser til klassen B: if (objekt1 instanceof B) { B etObjekt = (B) objekt1; etObjekt.metode2(); } A DCB FE metode1() abstrakt i A metode2() abstrakt i B metode1() implementert her metode2() implementert her

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 15 Tilgangsmodifikatorer Definisjonsområdet til et navn er den delen av programmet der navnet kan brukes uten at det må kvalifiseres. Tilgjengeligheten til et navn utenfor definisjonsområdet er bestemt av om det står private, public, protected eller ingenting foran navnet (ingenting = package). Klasser: –Alle klasser vi har laget hittil, unntatt appletene, har vært tilgjengelig kun i den pakken der de var deklarert. –Appletene har hatt public foran seg. De er tilgjengelig fra overalt. Medlemmer og konstruktører: –private int antall; // privat –protected int finnMinsteVerdi() { // tilgjengelig fra samme pakke // og fra subklasser (under // bestemte betingelser) –public int finnAntall { // offentlig –int finnHemmeligNummer() { // pakketilgang Klassetilgang overstyrer medlems/konstruktør-tilgang: –Eksempel: For at et medlem (en konstruktør) skal være offentlig tilgjengelig må både medlemmet (konstruktøren) og klassen det tilhører være deklarert public.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 16 pakke Apakke B klasse C subklasse til klasse C private package* protected public *) package betyr ingen tilgangsmodifikator Tilgjengeligheten til konstruktører og medlemmer deklarert i klassen C

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 17 Anbefalt bruk av tilgangsmodifikatorer Objektvariabler og klassevariabler er alltid private. Konstanter er vanligvis offentlige, men kan være private dersom de ikke er av interesse for andre enn klassen selv. Konstruktører er vanligvis offentlige. Metoder er vanligvis private eller offentlige. Konstruktører og metoder kan være beskyttede dersom det ikke har noen mening å bruke dem utenfor subklasser. Klasser har i utgangspunktet pakketilgang (ingen tilgangsmodifikator). Dette begrenser også tilgangen til offentlige konstruktører og medlemmer i klassen. Klasser som skal tas i bruk generelt, gjøres offentlige og legges i en navngitt pakke. Da vil automatisk alle offentlige konstruktører og medlemmer også bli offentlige.

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 12, side 18 Arv i to nivåer Belegg2 -breddePåBelegg +finnBredde() +finnMaterialbehov(enFlate: Flate) Materiale -navn -pris +finnNavn() +finnPrisPrEnhet() +finnTotalpris(enFlate: Flate) +finnMaterialbehov(enFlate: Flate) ForsteSortBelegg AnnenSortBelegg +finnTotalpris(enFlate: Flate) +finnMaterialbehov(enFlate: Flate) Tapet -lengdePrRull -breddePrRull Maling -antStrøk -antKvmPrLiter +finnAntStrøk() +finnAntKvmPrLiter() +finnMaterialbehov( enFlate: Flate) +finnLengde() +finnBredde() +finnMaterialbehov( enFlate: Flate) Vis programliste 12.4 side 354-355.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 19 Modifikatoren abstract Abstrakt klasse: abstract class Materiale { ….osv. –kan ikke lage objekter av en abstrakt klasse –behøver ikke inneholde eller arve abstrakte metoder –kan inneholde både abstrakte og konkrete metoder Abstrakt metode: abstract metodehode; –En klasse som arver, eller selv deklarerer en abstrakt metode, må deklareres som abstrakt.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 20 Det reserverte ordet super super kan brukes på to måter: –I en konstruktør for å anrope konstruktøren rett over i klassetreet, eksempel: public AnnenSortBelegg(String startNavn, double startPris, int startBredde) { super(startNavn, startPris, startBredde); } Kallet på super() må være første setning i konstruktøren. Argumentlisten til super() må være i samsvar med parameterlisten til en konstruktør i superklassen. –I en hvilken som helst metode kan vi bruke super som kvalifikator for å henvise til et skjult eller erstattet navn i en superklasse, eksempel: public double finnMaterialbehov(Flate enFlate) { double grunnBehov = super.finnMaterialbehov(enFlate); return grunnBehov * materialTillegg; } Vi kan ikke skrive super.super() eller lignende for å anrope konstruktør eller metode på mer enn ett nivå over i klassetreet.

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 21 Konstruktører Dersom vi ikke kaller en bestemt konstruktør i den direkte superklassen ved å anrope super(), vil standardkonstruktøren i superklassen anropes. Dersom denne ikke eksisterer, vil kompilatoren gi en feilmelding. Dersom det ikke har mening å lage objekter av en klasse, kan det forhindres på to måter: –Lag klassen abstrakt. Dette brukes dersom klassen har eller kan ha subklasser. –Lag alle konstruktører private. Dette brukes dersom klassen ikke kan ha subklasser (den er final, se nedenfor).

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 22 Referanser og casting Alle klassene på figuren er konkrete. En referanse til en klasse kan settes til å peke til objekter av en subklasse til klassen. Den kan ikke settes til å peke til objekter av en superklasse. Materiale etMateriale = new ForsteSortBelegg(“SuperDuper”, 140, 5); // ok ForsteSortBelegg fintBelegg = new AnnenSortBelegg(“SuperDuper2”, 140, 6); // ikke ok ForsteSortBelegg etBelegg = new Belegg2(“SuperDuper1”, 140, 5); // ikke ok Anta at vi har en referanse til et objekt. –Referansen kan castes til den klassen objektet tilhører, eller til superklasser av denne klassen. –Det er ikke tillatt å caste referansen til en subklasse av den klassen som objektet tilhører. –Ugyldig casting gir ClassCastException. Object etObjekt = new Belegg2(“SuperDuper”, 140, 5); // ok Belegg2 etBelegg = (Belegg2) etObjekt; // ok ForsteSortBelegg etFintBelegg = (ForsteSortBelegg) etBelegg; // ikke ok ForsteSortBelegg etFintBelegg = (ForsteSortBelegg) etObjekt; // ikke ok Belegg2 AnnenSortBeleggForsteSortBelegg

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 2000. ISBN 82-417-1132-8. Kapittel 12, side 23 Modifikatoren final final forhindrer subklassing og erstatning. En final metode kan ikke erstattes eller skjules: public final double finnBredde() { return breddePåBelegg; } Det er ikke mulig å subklasse en final klasse: final class AnnenSortBelegg extends Belegg2 { ….osv.

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. Kapittel 12, side 24 Å erstatte eller skjule et navn Å erstatte en arvet objektmetode –Hvis en klasse deklarerer en objektmetode, vil denne deklarasjonen erstatte en eventuell arvet metode med samme signatur. –Kompilatoren gir feilmelding dersom returtypen ikke stemmer og/eller tilgangsnivået er mindre strengt enn i den erstattede metoden. –En objektmetode kan ikke erstatte en arvet klassemetode. class AnnenSortBelegg extends Belegg2 { ….. public double finnMaterialbehov(Flate enFlate) { double grunnBehov = super.finnMaterialbehov(enFlate); return grunnBehov * materialTillegg; } Denne metoden erstatter den arvede utgaven av finnMaterialbehov() Vi kan skjule arvede variabelnavn og klassemetoder. Dette brukes ikke i denne boka. Her refererer vi til den erstattede metoden.

25 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 12, side 25 Interface Et interface er en samling med metodehoder. En klasse kan velge å implementere et interface. Den må da programmere alle metodene i interfacet. Eksempel på interface: public interface Comparable { // tilhører pakken java.lang public int compareTo(Object obj); } Eksempel på klasse som implementerer interfacet: class Flate implements Comparable {....objektvariabler.... public int compareTo(java.lang.Object obj) { // sammenligner arealene Flate denAndreFlaten = (Flate) obj; double areal1 = finnAreal(); // arealet til this double areal2 = denAndreFlaten.finnAreal(); if (areal1 < areal2 - 0.0001) return -1; else if (areal1 > areal2 + 0.0001) return 1; else return 0; }.....andre metoder i klassen.... } Repetisjon fra kapittel 10.

26 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 12, side 26 Å lage egne interface interface Sammenligningsbar { boolean størreEnn(Object obj); boolean mindreEnn(Object obj); boolean lik(Object obj); } interface Konstanter { int min = 1000; int maks = 9999; } Tilgangsmodifikator public eller ingenting (pakketilgang) public abstract underforstått for metoder public static final underforstått for variabler Et interface er abstrakt, vi kan ikke lage objekter av et interface.

27 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 12, side 27 Implementasjon av interfacene class FireSifretHeltall implements Konstanter, Sammenligningsbar { private int verdi; public FireSifretHeltall(int startVerdi) { if (startVerdi < min) verdi = min; else if (startVerdi > maks) verdi = maks; else verdi = startVerdi; } public int finnVerdi() { return verdi; } public boolean størreEnn(Object obj) { FireSifretHeltall tall = (FireSifretHeltall) obj; return (verdi > tall.finnVerdi()); } public boolean mindreEnn(Object obj) { FireSifretHeltall tall = (FireSifretHeltall) obj; return (verdi < tall.finnVerdi()); } public boolean lik(Object obj) { FireSifretHeltall tall = (FireSifretHeltall) obj; return (verdi == tall.finnVerdi()); } Klassen kan bruke alle konstantene i interfacet Konstanter. Klassen må implementere alle metodene i interfacet Sammenligningsbar, for at klassen ikke skal bli abstrakt.

28 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 12, side 28 Bruk av klassen FireSifretHeltall En referanse av en interface-type kan referere til objekter som tilhører en klasse som implementerer interfacet: –Sammenligningsbar tall1 = new FireSifretHeltall(700); –Sammenligningsbar tall2 = new FireSifretHeltall(1700); Vi kan nå bare sende meldinger deklarert i interfacet til objektet: –System.out.println(tall1.størreEnn(tall2)); // ok –System.out.println(tall1.finnVerdi()); // ikke ok class EksempelInterface { public static void main(String[] args) { FireSifretHeltall tall1 = new FireSifretHeltall(700); FireSifretHeltall tall2 = new FireSifretHeltall(1700); FireSifretHeltall tall3 = new FireSifretHeltall(70000); System.out.println(tall1.finnVerdi()); System.out.println(tall2.finnVerdi()); System.out.println(tall3.finnVerdi()); System.out.println(tall1.størreEnn(tall2)); System.out.println(tall1.mindreEnn(tall2)); System.out.println(tall1.lik(tall2)); } Utskrift: /* 1000 1700 9999 false true false */


Laste ned ppt "Programmering i Java versjon 2000-08-15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik."

Liknende presentasjoner


Annonser fra Google