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 i pakken (package) er standardverdi og trenger ingen modifikatorfor alle, public
- Synlig kun i klassen, private
- Synlig for alle, publici pakken (default), er standardverdi og trenger ingen modifikator
- Synlig i pakken og for subklasser, protected
...
Public
Dersom man deklarerer et felt, en metode etc. uten synlighetsmodifikator, tildeles standardverdien. Dette gjør ressursen tilgjengelig for alle klasser som ligger i samme packagesom public, er det mulig for alle som vet om ressursen å hente/forandre/kalle på den.
Code Block |
---|
language | java |
---|
title | Default Public 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;
}
voidint setHousegetSize(House h) {
// Dette er en getter
this.housereturn this.size;
}
public String setColor(String color) {
this.color = hcolor;
}
} |
| Code Block |
---|
language | java |
---|
title | Default Public modifier |
---|
linenumbers | true |
---|
| package constructions; // House og Room ligger i samme pakke
public class Housepublic class RoomPainter {
private String paintcolor;
private Room room;
// Settere
public void setPaintcolor(String color) {
Room[] rooms;
int size this.paintcolor = color;
}
public Housevoid setRoom(Room[] roomsroom) {
this.roomsroom = roomsroom;
}
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
}
}
}
// "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 en getter eller forandres med en setter.
Code Block |
---|
language | java |
---|
title | Private modifier |
---|
linenumbers | true |
---|
| package constructions;
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 |
---|
| 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].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. som public, er det mulig for alle som vet om ressursen å hente/forandre/kalle på denuten synlighetsmodifikator, tildeles standardverdien. Dette gjør ressursen tilgjengelig for alle klasser som ligger i samme package.
Code Block |
---|
language | java |
---|
title | Public 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;
}
intvoid getSizesetHouse(House h) {
// Dette er en getter
return this.size;
}
public String setColor(String color) {
this.color = colorhouse = h;
}
} |
| Code Block |
---|
language | java |
---|
title | Public Default modifier |
---|
linenumbers | true |
---|
| package painter;constructions; // House og Room ligger i samme pakke
public class RoomPainterHouse {
private String paintcolorRoom[] rooms;
privateint Room room;
size;
// Settere
public voidHouse setPaintcolor(StringRoom[] colorrooms) {
this.paintcolorrooms = colorrooms;
}
public for void setRoom(Roomint room) {
this.room i = room;
}
// "Arbeidsmetode"
public void paint(0; i < rooms.length; i++) {
this.room.colorsize += this.paintcolor; // UGYLDIG KODE!
rooms[i].size;
// SidenFår Roompaintertilgang ogtil Roomå IKKEhente ersize itil sammehvert package,rom
// må Room-feltet color være public for at linjen over
// skal være gyldig. Skriver i stedet:
this.room.setColor(this.paintcolor
rooms[i].setHouse(this);
// HerFår sender vi heller paintcolor tilgang til setterenå for
// color, som vi kan bruke fordi den er public
}
} |
|
---|
...
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 til begrepet arv.
Code Block |
---|
language | java |
---|
title | 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;
}
} |
| Code Block |
---|
language | java |
---|
title | 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.
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.