I Java finnes det flere synlighetsmodifikatorer som gir mulighet til å styre "tilgangen" til klasser, variabler, metoder og konstruktører. For mer om hvorfor vi ønsker å styre denne "tilgangen", se Innkapsling.
Vi har fire nivåer for tilgjengelighet:
- Synlig for alle, public
- Synlig kun i klassen, private
- Synlig i pakken (default), er standardverdi og trenger ingen modifikator
- Synlig i pakken og for subklasser, protected
Public
Dersom man deklarerer et felt, en metode etc. som public, er det mulig for alle som vet om ressursen å hente/forandre/kalle på den.
Public modifier public class Room { int size; String color; public Room(int size, String color) { this.size = size; this.color = color; } int getSize() { // Dette er en getter return this.size; } public String setColor(String color) { this.color = color; } }
|
Public modifier public class RoomPainter { private String paintcolor; private Room room; // Settere public void setPaintcolor(String color) { this.paintcolor = color; } public void setRoom(Room room) { this.room = room; } // "Arbeidsmetode" public void paint() { this.room.color = this.paintcolor; // UGYLDIG KODE! // Siden Roompainter og Room IKKE er i samme package, // må Room-feltet color være public for at linjen over // skal være gyldig. Skriver i stedet: this.room.setColor(this.paintcolor); // Her sender vi heller paintcolor til setteren for // color, som vi kan bruke fordi den er public } }
|
---|
Private
Dersom man deklarerer et felt, en metode etc. som private, er det kun mulig å hente/forandre/kalle på denne ressursen direkte i klassen.
Merk at verdiene til private felt fortsatt kan hentes gjennom en getter eller forandres med en setter.
Private modifier public class Room { private int size; private String color; private House house; public Room(int size, String color) { this.size = size; this.color = color; } private void setHouse(House h) { // Dette er en setter this.house = h; } int getSize() { // Dette er en getter return this.size; } }
|
Private modifier public class House { Room[] rooms; int size; public House (Room[] rooms) { this.rooms = rooms; for (int i = 0; i < rooms.length; i++) { this.size += rooms[i].getSize(); // Her må vi bruke getteren. Vi får ikke tilgang // til feltet "size" om vi prøver rooms[i].size rooms[i].setHouse(this); // UGYLDIG KODE! // setHouse er nå private, og vi kan ikke bruke // metoden i House-klassen. } } }
|
---|
Default
Dersom man deklarerer et felt, en metode etc. uten synlighetsmodifikator, tildeles standardverdien. Dette gjør ressursen tilgjengelig for alle klasser som ligger i samme package.
Default modifier package constructions; public class Room { int size; String color; House house; // Om man vil hente huset hvor rommet befinner seg public Room(int size, String color) { this.size = size; this.color = color; } void setHouse(House h) { this.house = h; } }
|
Default modifier package constructions; // House og Room ligger i samme pakke public class House { Room[] rooms; int size; public House (Room[] rooms) { this.rooms = rooms; for (int i = 0; i < rooms.length; i++) { this.size += rooms[i].size; // Får tilgang til å hente size til hvert rom rooms[i].setHouse(this); // Får tilgang til å sette hvilket hus rommet er i } } }
|
---|
Protected
Dersom man deklarerer et felt, en metode etc. som protected, er det mulig å hente/forandre/kalle på ressursen dersom kallet kommer fra samme package eller fra en subklasse av klassen hvor ressursen er definert.
Eksempelet under krever kjennskap til begrepet arv.
Protected modifier package workers; public class Painter { protected String paintcolor; public void setPaintcolor(String color) { this.paintcolor = color; } public String getPaintcolor() { return this.paintcolor; } }
|
Protected modifier package painter; public class Roompainter extends Painter{ private Room room; public void setRoom(Room room) { this.room = room; } // "Arbeidsmetode" public void paint() { this.room.setColor(this.paintcolor); // Her kan vi hente paintcolor uten getteren selv om // Roompainter ikke er i samme package som Painter // fordi Roompainter arver dette feltet. } }
|
---|
Dersom Painter har et default felt,metode,etc. her, vil ikke Roompainter kunne nå denne ressursen, fordi klassene ikke er i samme package.
Synlighet ved arv
Det finnes i java et sett med regler for synlighet ved arv
- Metoder som deklareres som public i superklassen, må også være public i subklasser
Metoder som deklareres som protected i en superklasse må enten være protected eller public i subklasser; det er ikke mulig å redusere synlighet til private.
Metoder deklarert uten synlighetsmodifikator (default) kan deklareres mer skjult i subklasser
Metoder som deklareres private arves ikke i det hele tatt, så det er ingen regler for disse.