Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

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 klassenprivate
  • 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
languagejava
titleDefault Public modifier
linenumberstrue
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
languagejava
titleDefault Public modifier
linenumberstrue
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
languagejava
titlePrivate modifier
linenumberstrue
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
languagejava
titlePrivate modifier
linenumberstrue
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
languagejava
titlePublic Default modifier
linenumberstrue
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
languagejava
titlePublic Default modifier
linenumberstrue
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
languagejava
titleProtected modifier
linenumberstrue
package workers;

public class Painter {
	
	String company;
	protected String paintcolor;
	
	
	public void setPaintcolor(String color) {
		this.paintcolor = color;
	}
	
	public String getPaintcolor() {
		return this.paintcolor;
	}
} 

 

 

Code Block
languagejava
titleProtected modifier
linenumberstrue
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.