Java lathund #5 - Paket och åtkomstmodifierare
Förord
I denna artikel ska vi gå igenom vad paket är och hur de används i Java. Vidare så ska vi kika på vad åtkomstmodifierare är och vad de är bra till och hur de är kopplade till paket.Innehåll
»»
»
»
»
»
»
»
Relaterade artiklar
» Java lathund #1 - Hello World» Java lathund #2 - Klass och main-metod
» Java lathund #3 - Reserverade ord och primitiva datatyper
» Java lathund #4 - Konstruktor, metoder och skapandet av objekt
Introduktion
Paket, vad är det nu då? Jo, paket använder man i Java och andra programspråk för att skapa en samling med klasser (ordnade på något logiskt sätt). Det kan vara ett paket som innehåller klasser för att hantera grafik i Java eller klasser för att skapa ett GUI - Graphical User Interface.
OBSERVERA!!!
För att Javainterpretatorn ska kunna hitta de paket som finns i J2SE - Java 2 Standard Edition som man vill importera måste man tala om för den vart den ska leta.
Var noggrann med att sätta alla systemvariabler korrekt när Ni installerar J2SE, annars kommer kompilatorn att protestera!
Paket och dess struktur
Ett paket är i grund och botten en katalog-/filstruktur som antingen finns intakt som just kataloger/filer eller i ett arkiv som t.ex. zip, jar m.fl. I utvecklingsmiljön J2SE - Java 2 Standard Edition finns standardpaketen arkiverade i ett JAR-arkiv.
Standardpaketen innehåller klasser som innehar en stor mängd olika funktionaliteter. Bl.a. finns det ett paket som hanterar grafiska komponenter i Java för GUI - Graphical User Interface uppbyggnad.
Vi kan ta ett exempel när man använder sig av paket med klasser som hanterar olika grafiska komponenter.
import java.awt.*;
public class PaketTest {
// Initiera en variabel av typen Button
Button minKnapp = new Button();
// Metoder för att göra saker med en knapp...
....
}
Så vad innebär ovanstående kod?
Jo, vi anger på första raden i klassen att vi vill importera alla klasser i paketet java.awt. I detta paket vet vi att det finns klasser som representerar olika grafiska komponenter (hur vi vet det kommer jag till senare).
Ett s.k. wildcard har jag använt mig i slutet av denna kodrad för att importera ALLA klasser i detta paket. Detta är inte ett tvång utan vi skulle kunna ha gjort så här:
import java.awt.Button;
...
, för endast importera klassen Button som representerar en knapp i Java. Efter att vi har angivit ett import så kan vi nu utnyttja klasserna i det paket som vi har importerat, eller om det bara var en enskild klass.
Vi kanske ska analysera paketnamnet lite närmare. Paketet vi har importerat heter java.awt. Om standardbiblioteket hos J2SE inte skulle ha varit arkiverat i ett JAR-arkiv så skulle det se ut så har i en katalogstruktur:
java skulle vara en katalog och awt skulle vara en sub-katalog till katalogen java. Inuti katalogen awt skulle vi ha massa olika klasser som representerar grafiska komponenter, däri bl.a. klassen Button.
Frågan är fortfarande: "Hur vet vi vilka paket och klasser det finns i standardbiblioteket? Nu har Sun Microsystem som utvecklat Java varit så snälla att de har skapat dokumentation över hela standardbiblioteket. Detta finns att antingen ladda hem och ha på datorn eller kika på via Internet på sidan:
Här kan Ni se ALLA de klasser och paket som finns i J2SE - Java 2 Standard Edition och en förklaring om vad de är till för och information om vardera klass i varje paket.
Använder Ni en annan version på J2SE så kan Ni välja rätt API version här:
Ett litet programexempel...
Nu tänkte jag visa hur man kan använda sig av paket för nyttja de redan "inbyggda" funktionerna i Java, d.v.s. klasser ur standardbiblioteket.
I paketet java.util finns det en klass som heter Date vilken används för att just representera ett datum. Så jag tänkte att vi kunde skapa ett litet program som skriver ut dagens datum.
// Importera klassen Date så att vi kan använda den
import java.util.Date;
public class PaketExempel {
public static void main(String[] args) {
// Skapa en instans av klassen Date
Date datum = new Date();
// Skriv ut dagens datum
System.out.println("Dagens datum: " + datum.getString());
}
}
En kort genomgång av koden...
Först så importerar vi klassen Date från paketet java.util. Sen så skapar vi en klass med en main-metod. Inuti mai-metoden skapar vi ett objekt av klassen Date. I utskriftsraden anropar vi en metod hos objektet datum (kika i API dokumentationen vad klassen Date innehåller för metoder) som vi konkatinerar med en sträng för utskrift.
Kika igenom API dokumentationen och se vilka olika paket det finns i standardbiblioteket och vilka klasser det finns. Prova gärna att använda någon utav klasserna i något paket.
Skapa egna paket
Ibland i större utvecklingsprojekt så vill man kanske skapa egna paket för att hålla någon sorts logisk ordning på sina klasser som används i applikationen. T.ex. ett paket för GUI - Graphical User Interface, ett paket för filhantering, ett paket för specifik affärslogik etc.
Skapar egna paket gör man hela tiden i Java utan att du behöver ange det. Detta paket kallas för ett default-paket. Detta paket är den katalog som din källkodsfil befinner sig i och behöver därmed inte importeras i koden. Som Ni kanske har märkt när Ni har kompilerat källkodsfilerna i de tidigare artiklarna så har .class-filen hamnat i samma katalog som källkodsfilen.
Vill man däremot skilja sina klasser åt i olika paket (kataloger) så måste man ange det först i sin källkodsfil.
Detta görs med följande kod:
package paketNamn;
Man säger helt enkelt först i filen att denna klass ska tillhöra paketet paketNamn. I och med att Ni skriver denna kodrad först i filen kommer det att skapas en underkatalog till den katalogen Ni just nu befinner Er i som klassen hamnar i efter kompilering.
Vill man skapa lite mer beskrivande paket kan man separera namnet med en punkt (.) för att ange ytterligare subkataloger.
package mittProjekt.gui.knappar;
Efter kompilering av följande kod i en källkodsfil så kommer det att skapas en katalog i den som Ni just nu befinner Er i som heter mittProjekt. I katalogen mittProjekt skapas det en katalog som heter gui. Och i katalogen gui skapas det en katalog som heter knappar där klassen till slut hamnar.
Ta vara på detta att man delar upp sina klasser i specifika paket. Vid större projekt så kan det vara bökigt med 100-tals källkodsfiler och klasser i en och samma katalog. Delar man upp dem i paket med någon sorts logisk ordning har man mycket bättre ordning på dem. Vidare så finns det verktyg i J2SE som gör att man kan generera egen dokumentation över de paket som man skapat. På så sätt har man en lätt överskådlig dokumentation över de klasser man skapat om man någon gång vill använda dem igen i andra projekt.
Åtkomstmodifierare
Åtkomstmodifierare har Ni använt Er utav i mina exempel. De är 4 stycken reserverade ord som anger vem som har rättigheter att komma åt vissa klasser, konstruktorer, metoder och variabler.
OBSERVERA!!!
Variabler inne i metoder och konstruktorer kan INTE ha åtkomstmodifierare. Dessa är ändå endast accessbara innefrån metoden och kan inte refereras till utanför metodens scoop.
I Java finns det som sagt 4 st åtkomstmodifierare. Jag listar dem gär nere i rangordning med den minst restrektiva modifieraren först.
- public
- protected
- friendly
- private
Jag tänkte gå igenom varje var för sig och berätta om dem mer i detalj.
public
Detta är den mest generösa av dem alla. Detta reserverade ord kan användas tillsammans med klasser, metoder och variabler. Public innebär att "alla" klasser oavsett var de befinner sig (i ett annat paket t.ex.) kan komma åt den klass/metod/variabel som är deklarerad som public.
protected
Bara variabler och metoder kan vara deklarerade med protected. Protected innebär att klasser i samma paket som den aktuella klassen ,med en metod eller variabel deklarerad som protected, kan anropa dessa. Ytterligare så kan alla klasser som ärver (arv kommer vi att tala om lite senare i artikelserien) från klassen med accessmodifieraren protected anropa dess metoder/attribut, även om de befinner sig i olika paket.
friendly eller default
Det finns ingen accessmodifierare som heter vare sig "friendly" eller "default". Denna acessmodifierare erhålls genom att helt enkelt inte skriva något framför klass-/metod- eller variabeldeklarationen. Om man deklarerar något med "default" så är detta endast accessbart från klasser i samma paket.
private
Detta är det mest restriktiva åtkomstmodifieraren. En klass kan INTE vara deklarerad som private (förrutom om det är en inre klass, återkommer till det senare), däremot kan metoder och variabler vara deklarerade som private. De metoder/variabler som är deklarerade med private kan bara anropas inne från instansen självt.
Ex:
class EnKlass {
// PRIVAT METOD
private void writeText() {
System.out.println("Text");
}
public void callWriteText() {
// ANROPAR DEN PRIVATA METODEN writeText INNEFRÅN INSTANSEN SJÄLVT FUNGERAR
writeText();
}
}
class AnnanKlass {
public static void main(String[] args) {
// SKAPA EN INSTANS AV KLASSEN EnKlass
EnKlass enKlass = new EnKlass();
// ANROP TILL DEN PRIVATA METODEN writeText KOMMER ATT GE KOMPILERINGSFEL
enKlass.writeText();
// DETTA FUNGERAR DÄREMOT BÄTTRE
enKlass.callWriteText();
}
}
Summering
I denna artikel har vi gått igenom paket och dess betydelse i Java. Vidare så har vi gått igenom de mest grundläggande kriterierna för Java's accessmodifierare.
Referenser
Skansholm, J. (1999). Java Direkt (2:a rev. Uppl.). Lund: Studentlitteratur.
Roberts, S., Heller, P., & Ernest, M. (2000) Complete Java 2 Certification Study Guide (1st Ed.). Alameda, CA: SYBEX Inc.
Om skribenten…
Andreas Eriksson arbetar idag som frilandskonsult med bl.a. distribuerad programmering och systemutveckling i Java. Han har tidigare föreläst på bl.a. Högskolan i Gävle inom objektorienterad databasutveckling med språket Java som verktyg.
Han har mångårig erfarenhet av utveckling i Java och är sedan 2002 Sun Certified Java Developer for the Java 2 Platform.
Maila mig gärna för kommentarer.
0 Kommentarer