I java 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 (packagedefault), er standardverdi og trenger ingen modifikatorSynlig kun i klassen
- Synlig i pakken og for subklasser, private
- Synlig for alle, public
- 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.
Code Block |
---|
language | java |
---|
title | Public modifier |
---|
linenumbers | true |
---|
| 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;
}
} |
| Code Block |
---|
language | java |
---|
title | Public modifier |
---|
linenumbers | true |
---|
| 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.
Code Block |
---|
language | java |
---|
title | Private modifier |
---|
linenumbers | true |
---|
| 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;
}
} |
| Code Block |
---|
language | java |
---|
title | Private modifier |
---|
linenumbers | true |
---|
| 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.
Code Block |
---|
language | java |
---|
title | Default modifier |
---|
linenumbers | true |
---|
| 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;
}
} |
| Code Block |
---|
language | java |
---|
title | Default modifier |
---|
linenumbers | true |
---|
| 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 påtil hvert rom
rooms[i].setHouse(this);
// Får tilgang til å sette hvilket hus rommet er i
}
}
}
|
|
---|
...
Protected
PrivateDersom man deklarerer et felt, en metode etc. som privateprotected, 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.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 | linenumbers | true |
---|
|
|
---|
...
...
package workers;
public class Painter {
protected String paintcolor;
public void setPaintcolor(String color) {
this.paintcolor = color;
}
public String getPaintcolor() {
return this.paintcolor;
}
} |
| |
---|
...
Protected modifier | linenumbers | true |
---|
|
|
---|
...
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.
Protected
Dersom man deklarerer et felt, en metode etc. som protected, er det mulig å hente/forandre/kalle på den dersom kallet kommer fra samme package eller fra en subklasse av klassen hvor ressursen er definert.
Code Block |
---|
language | java |
---|
title | Protected modifier |
---|
linenumbers | true |
---|
|
|
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.
...