Föreläsning 13 Polymorfism, Paket och JAR-filer
Polymorfism Ordet härstammar från grekiskan Poly – många Morf – form Polymorf – många former Någonting som antar många former Överlagring av metoder är en form av polymorfism Vilken metod som anropas avgörs av antalet parametrar (kompilering)
Polymorfism Alla metoder i Java har automatisk stöd för polymorfism En metod kan finnas i flera varianter och vilken som exekveras väljs under körning (dynamisk bindning) Utnyttjas framför allt när man ärvt och omdefinierat metoder Används för generella metoder i en arvshierarki (ex, print, beraknaArea)
Exempel GeometriObjekt + beraknaArea() : double Kub + beraknaArea() : double Rektangel + beraknaArea() : double Cirkel + beraknaArea() : double Triangel + beraknaArea() : double OBS! Ej abstrakt längre
Exempel (forts) Implicit typkonvertering gör följande möjligt: GeometriObjekt r = new Rektangel(10, 10, 20, 20); GeometriObjekt c = new Cirkel(50, 50, 10); r.beraknaArea(); c.beraknaArea(); En variabel av GeometriObjekt kan referera till alla dess subklasser Vilken metod som ska utföras bestäms under exekveringen
Exempel (forts) Vi vill skapa en samling av geometri objekt och skapar därför en array GeometriObjekt[] figurer = new GeometriObjekt[4]; figurer[0] = new Rektangel(100, 100, 10, 20); figurer[1] = new Cirkel(50,50, 20); figurer[2] = new Kub(20, 70, 10); figurer[3] = new Triangel(150, 10, 50, 10);
Exempel (forts) Via arrayen figurer vill vi nu beräkna arean för alla objekt figurer Variabel 3210 Array av GeometriObjekt Cirkel beraknaArea() Kub beraknaArea() Triangel beraknaArea() Rektangel beraknaArea() Objekt
Exempel (forts) Finns det inte stöd för polymorfism måste vi själva kolla vilken metod som ska anropas for (int i = 0; i < figurer.length; i++) { if (figurer[i] instanceof Rektangel) { Rektangel r = (Rektangel)figurer[i]; //Konvertera till rätt typ r.beraknaArea(); } else if (figurer[i] instanceof Kub) { Kub k = (Kub)figurer[i]; //Konvertera till rätt typ k.beraknaArea(); } // osv… för varje subklass }
Exempel (forts) Finns stöd för polymorfism hittar exekveringsmiljön själv rätt metod under körning (dynamisk bindning) for (int i = 0; i < figurer.length; i++) { figurer[i].beraknaArea(); }
Paket (package) Används för att gruppera ihop klasser som hör ihop Javas egna standardbibliotek kommer tillgängliga som paket java.lang, java.io, javax.swing etc Vi kan även göra egna paket Speciella åtkomstregler gäller protected – ger åtkomst i samma paket
Deklaration Av Paket Bestäms genom att först i källkods- filen ange paketets namn: package paket_namn; En klass kan endast tillhöra ett paket Paketdeklarationen måste stå först Paketnamn kan bestå av flera delar package javaI.grafik; package javaII.grafik; Anges inget paket default-paket
Katalogstruktur Bytekodfilerna sparas i kataloger baserade på paketnamnet. package grafik; // klasser måste sparas i katalogen grafik package javaI.grafik; // klasser måste sparas i katalogen javaI/grafik Filer i default-paketet sparas i aktuell katalog package javaII.grafik; // klasser måste sparas i katalogen javaII/grafik
Import Av Paket För att använda klassen anges paketnamnet före namnet på klassen // Använda Cirkel från paketet javaI.grafik javaI.grafik.Cirkel c = new javaI.grafik.Cirkel(10, 10, 20); Enklare att importera klassen import javaI.grafik.Cirkel; // Bara Cirkel import javaI.grafik.*; // Alla klasser Cirkel c = new Cirkel(10, 10, 20); Import placeras efter eventuella paketdeklarationer
Classpath Javamaskinen letar efter klasser som anges i miljövariabeln CLASSPATH classpath =. Söker efter ”.class”-filer i aktuell katalog classpath =.;h:\kurser Söker efter ”.class”-filer i aktuell katalog och dessutom i h:\kurser Söker också i underkataloger Sätts på samma sätt som path
JAR-filer Filformat baserat på ZIP Packar ihop många filer till en Utvecklades för Applets på Internet Stödjer komprission Reducerar storleken på filen och ger snabbare nedladdning Kan öppnas och manipuleras i WinZip JAR = Java ARchive
Skapa JAR-filer Vi använder verktyget jar Kräver ett antal indata, t.ex Namnet på JAR-filen som ska skapas De class-filer som ska ingå En manifest-fil (information om jar-filen) Syntax: jar {ctxu}[vfm0M] [jar-fil] [manifest-fil] files... jar cf minjarfil.jar *.class Alla.class filer i aktuell katalog placeras i filen minjarfil.jar jar cfm minjarfil.jar minmanifest.txt *.class Samma som ovan, men vi använder en egen manisfest-fil
Använda JAR-filer Manifestfilen innehåller information om bl.a vilken klass som ska startas java –jar minjarfil.jar För att köra en JAR-fil skriver vi: classpath = h:\java\labbar\minjarfil.jar;. För att använda klasser i en JAR-fil måste vi sätta sökvägen till filen: Måste sluta med en blankrad