Arv og polymorfi, del 3 Modifikatoren abstract side 2-3

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Tabeller av objekter Klassen ArrayList
14 okt. 2003, Arne Maus Inst. for informatikk, UiO
Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring
C++ for Java-programmerere
Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering.
Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Uke 8 - Mer om: Objekter, klasser og pekere
Polymorfi og arv, del 1 LC191D Videregående programmering Semesterplan: Høgskolen i Sør-Trøndelag, Avdeling.
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Samarbeid mellom objekter
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Objektorientert programmering Objektorientert systemutvikling
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
IS-102 Klassedefinisjoner
C# for javaprogrammerere
Objekt-orientering og Java
En gang til!? .
Fag LO189D - Objektorientert programmering Objektorientert programmering© Else Lervik, TISIP - HiST/IDB vår-99Leksjon 11 Applet’s Hva karakteriserer applet’sside.
Mer om programmering av aggregeringer Repetisjon: Komposisjon og aggregering En register-klasse: modellering En register-klasse: implementering Sortering.
Å lage sikre klasser Unntaksklassene i Java-API-et Unntakshåndtering i databasesammenheng try-catch-finally-setningen Trelagsarkitektur; egen databaseklasse.
Objekt Orientert Programmering (OOP). Objektorientering (OO)1/6 Objektorientering er en grunnleggende måte å organisere komplekse fenomener på.
Introduksjon til Java 5.0. Hva er nytt i 5.0? Generiske typer For-løkke med iterator (for-hver løkke) Automatisk innpakking av primitive typer Metadata.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Objektorientert programmering
Uke 7 - del I: Repetisjon del II: Objekter, klasser og pekere 30 sept. 2003, Arne Maus Inst. for informatikk, UiO.
Java 11 Programmering med og uten objekter: hva er forskjellen?
Å lese tall fra en fil, klassen Scanner 1.Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng. 2.Kan skanne teksten etter data av ulike.
Programmering sif8005. Praktisk informasjon  Innleveringsfrist øvinger: mandag kl  Alle øvinger er obligatoriske  Studass tilgjengelig 6 timer.
Programmering i Java tilpasset undervisning våren 2009 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
09 – Arv og polymorfi i java
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Programmering i Java versjon september 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
INF1000 (Uke 4) Mer om forgreninger, While-løkker
Inf1000 (Uke 5) Arrayer, filer og tekst
INF1000 (Uke 11) Programmering
Kapittel 4 Skriving av klasser. 4.1 Anatomien til ein klasse Så langt har vi brukt ferdige klasser frå klassebiblioteket i Java Vi lagar objekt og brukar.
Kapittel 7 Array (lister og tabellar). 7.1 Arrayelement Array (lister, tabellar) er kjent frå VB Blir brukt til å organisere data når vi har mange dataelement.
Variabler, datatyper og uttrykk
IS-102 Interaksjon med objekter
Utskrift av presentasjonen:

Arv og polymorfi, del 3 Modifikatoren abstract side 2-3 Hva hvis polymorfi ikke hadde eksistert? side 4 Når har vi behov for å bruke instanceof? side 5 Eksempel side6-7 med vedlegg Tilgangsmodifikatorer side 8-10 Det reserverte ordet super side 11 Konstruktører side 12 Referanser og casting side 13 Modifikatoren final side 14 Å erstatte eller skjule et navn side 15 Interface side 16-22

Abstrakte klasser Figur +finnAreal Sirkel Kvadrat Trekant -grunnlinje Formlene for å regne ut arealet er forskjellig for sirkel, kvadrat og trekant. Men arealet kan beregnes for alle typer figurer. Metoden finnAreal() er polymorf (= ”mangeformet, som opptrer i mange former”). Metoden er abstrakt i klassen Figur (ikke mulig å finne en formel som gjelder for alle figurer). Klassen er abstrakt fordi den inneholder en abstrakt metode. Det er ikke mulig å lage objekter av en abstrakt klasse. Abstrakte klasser Figur +finnAreal 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 Figur forteller at vi kan sende meldingen finnAreal() til alle objekter som tilhører konkrete subklasser av Figur. Sirkel Kvadrat Trekant -grunnlinje -høyde -radius -side +finnGrunnlinje +finnHøyde +finnAreal +finnRadius +finnAreal +finnSide +finnAreal Vis programliste 10.3, side 374-376, klassen Geometritest. Else Lervik, HiST, side 2

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. Else Lervik, HiST, side 3

Hva hvis polymorfi ikke hadde eksistert? Hva gjør polymorfien for oss? I det siste eksemplet lar den oss håndtere ulike typer geometriske figurer under ett. Vi sender en melding til et objekt som tilhører en subklasse av Figur. Objektet vet selv hvordan arealet 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 (figur instanceof Sirkel) { ... formel for å beregne arealet av en sirkel … } else if (figur instanceof Kvadrat) { ... formel for å beregne arealet av et kvadrat … } else { ... formel for å beregne arealet av en trekant … 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 Else Lervik, HiST, side 4

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(); } metode1() abstrakt i A A metode2() abstrakt i B B C D E F metode1() implementert her metode2() implementert her Else Lervik, HiST, side 5

Eksempel Else Lervik, HiST, side 6

Oppgaver til forelesningen Gå gjennom kildekoden så langt (vedlagt) Ferdigstill de metodene som mangler i klassen Personregister public boolean endreLønn(long fnrAns, int nyttLønnstrinn) { return true; } public boolean registrerNyttFag(long fnrStud, String nyttFag) { public boolean settKarakter(long fnrStud, String fagnr, char nyKarakter) { public char finnKarakter(long fnrStud, String fagnr) { return UGYLDIG_FNR; Else Lervik, HiST, side 7

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. Else Lervik, HiST, side 8

Tilgjengeligheten til konstruktører og medlemmer deklarert i klassen C pakke A pakke B klasse C subklasse til klasse C private package* protected public *) package betyr ingen tilgangsmodifikator Else Lervik, HiST, side 9

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. Else Lervik, HiST, side 10

Det reserverte ordet super super kan brukes på to måter: I en konstruktør for å anrope konstruktøren rett over i klassetreet, eksempel fra forrige forelesning: public OppgaveDag(int startNr, String startNavn, int startAntTimer, int startDato) { super(startNr, startNavn, startAntTimer); dato = startDato; } 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 String toString() { return super.toString() + ", dato: " + dato; Vi kan ikke skrive super.super() eller lignende for å anrope konstruktør eller metode på mer enn ett nivå over i klassetreet. Else Lervik, HiST, side 11

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). Else Lervik, HiST, side 12

Referanser og casting Person Student Ansatt 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. Person personen =new Student(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim", 1234567L); // ok Ansatt læreren = new Student(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim", 1234567L); // ikke ok Ansatt læreren = new Person(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim"); // 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 Student(12106078756L, "Ole Pettersen", "Storgt 3, 7001 Trondheim", 1234567L); // ok Student enStudent = (Student) etObjekt; Ansatt enAnsatt = (Ansatt) etObjekt; // ikke ok Person enPerson = (Person) etObjekt; // ok Else Lervik, HiST, side 13

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. Else Lervik, HiST, side 14

Å erstatte eller skjule et navn Å erstatte (”override”) 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. Hvordan blir det hvis signaturen ikke stemmer? 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() Her refererer vi til den erstattede metoden. Vi kan skjule (”hide”) arvede variabelnavn og klassemetoder. Dette brukes ikke i denne boka. Else Lervik, HiST, side 15

Interface Et interface er en samling med metodehoder. Repetisjon fra kapittel 9. 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<Type> { // tilhører pakken java.lang public int compareTo(Type obj); } Eksempel på klasse som implementerer interfacet: class Flate implements Comparable<Flate> { ... objektvariabler ... public int compareTo(Flate denAndreFlaten) { double areal1 = finnAreal(); double areal2 = denAndreFlaten.finnAreal(); if (Math.abs(areal2 - areal1) < toleranse) return 0; else if (areal1 < areal2) return -1; else return 1; ... andre metoder i klassen ... Else Lervik, HiST, side 16

public eller ingenting (pakketilgang) Å lage egne interface Tilgangsmodifikator public eller ingenting (pakketilgang) interface Sammenligningsbar<Type> { boolean størreEnn(Type obj); boolean mindreEnn(Type obj); boolean lik(Type obj); } public abstract underforstått for metoder Et interface er abstrakt, vi kan ikke lage objekter av et interface. Else Lervik, HiST, side 17

Implementasjon av interfacet class FireSifretHeltall implements Sammenligningsbar<FireSifretHeltall> { private static final int min = 1000; private static final int maks = 9999; 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(FireSifretHeltall tall) { return (verdi > tall.finnVerdi()); public boolean mindreEnn(FireSifretHeltall tall) { return (verdi < tall.finnVerdi()); public boolean lik(FireSifretHeltall tall) { return (verdi == tall.finnVerdi()); Klassen må implementere alle metodene i interfacet Sammenligningsbar, for at klassen ikke skal bli abstrakt. Else Lervik, HiST, side 18

Bruk av klassen FireSifretHeltall 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 */ 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 Else Lervik, HiST, side 19

Mer aktuell bruk av interface Grensesnittet som klienten skal forholde seg til spesifiseres via interface, eksempel figur/FigurInterface.java package figur; public interface FigurInterface { double finnAreal(); } Klassene legges i pakker og gis pakketilgang, eksempel filen figur/Figur.java: abstract class Figur implements FigurInterface { /* Alle figurer kan beregne sitt eget areal */ public abstract double finnAreal(); class Kvadrat extends Figur { ... Klienter lager objekter vhja fabrikkmetoder, se neste side Grensesnittet er interfacet, implementasjonen er klassene. klassen Figur med subklasser finnAreal interface Else Lervik, HiST, side 20

Fabrikken er en offentlig klasse Filen figur/Figurfabrikk.java package figur; public class Figurfabrikk { public static FigurInterface lagKvadrat(int side) { return new Kvadrat(side); } public static FigurInterface lagTrekant(double grunnlinje, double høyde) { return new Trekant(grunnlinje, høyde); public static FigurInterface lagSirkel(double radius) { return new Sirkel(radius); Else Lervik, HiST, side 21

Testklient import figur.*; class TestInterface { public static void main(String[] args) { FigurInterface enSirkel = Figurfabrikk.lagSirkel(10); FigurInterface enTrekant = Figurfabrikk.lagTrekant(5, 6); FigurInterface etKvadrat = Figurfabrikk.lagKvadrat(4); /* Arealer hver for seg */ System.out.println("Arealet til sirkelen: " + enSirkel.finnAreal()); System.out.println("Arealet til trekanten: " + enTrekant.finnAreal()); System.out.println("Arealet til kvadratet: " + etKvadrat.finnAreal()); /* Behandler så alle figurene under ett */ FigurInterface[] figurtabell = new FigurInterface[3]; figurtabell[0] = enSirkel; figurtabell[1] = enTrekant; figurtabell[2] = etKvadrat; for (FigurInterface fig : figurtabell) { System.out.println("Arealet er " + fig.finnAreal() + " for " + fig.getClass().getName()); // henter klassenavnet } Else Lervik, HiST, side 22