You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

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 i pakken (package) er standardverdi og trenger ingen modifikator
  • Synlig kun i klassen, private
  • Synlig for alle, public
  • Synlig i pakken og for subklasser, protected

Defaut

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;
	
	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
		}
	}
}

 

 


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
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;
	}
	
}

 

 

Private 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].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.
		}
	}
}

 

 


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
 

 

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.
 

Protected modifier
 


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.


DENNE SIDEN ER UNDER UTVIKLING

  • No labels