Zagadka operatora private

Spis treści

Modyfikatory dostępu w Javie to zagadnienie, które na pierwszy rzut oka nie wymaga wielkiego omówienia. Przypomnijmy, że w Javie mamy ich 4 rodzaje:

  • private
  • protected
  • default
  • public

Przy czym 2 i 3 są sobie niemal równe.

Kurs Java

W naszym dzisiejszym przykładzie skupimy się jednak na dostępie do pól prywatnych. Nasz kod przedstawia przykładową klasę z jednym polem oznaczonym jako private, oraz jednym konstruktorem ustawiającym jego wartość. Pytanie jakie sobie postawimy, to czy można się do tego pola dostać bezpośrednio (bez metody dostępowej - gettera), czy jest to niemożliwe?

public class Prywatka {
 	private int x = 0;
 
 	public Prywatka(int x) {
 		this.x = x;
 	}
 
 	public boolean equal(Prywatka p) {
 		return this.x == p.x;
 	}
 
 	public static void main(String[] args) {
 		Prywatka a = new Prywatka(1);
 		Prywatka b = new Prywatka(1);
 
 		System.out.print(a.equal(b)+" ");
 		System.out.print(a.x == b.x);
 	}
 }

Pytanie: czy ten kod się skompiluje, jeśli tak, to czy w trakcie wykonania otrzymamy jakieś błędy, jeśli nie, to co wyświetli się na ekranie?

a) Błąd w czasie kompilacji - The field Prywatka.x is not visible

b) Błąd w czasie wykonania - Runtime Exception

c) Program się wykona i wyświetli dwa razy true

d) Program się wykona i wyświetli true false

Odpowiedź

Przypomnienie kodu:

public class Prywatka {
 	private int x = 0;
 
 	public Prywatka(int x) {
 		this.x = x;
 	}
 
 	public boolean equal(Prywatka p) {
 		return this.x == p.x;
 	}
 
 	public static void main(String[] args) {
 		Prywatka a = new Prywatka(1);
 		Prywatka b = new Prywatka(1);
 
 		System.out.print(a.equal(b)+" ");
 		System.out.print(a.x == b.x);
 	}
 }

Przypomnijmy sobie najpierw jak działa modyfikator private w przypadku pól obiektu. Oznacza on, że dana składowa jest prywatna w klasie, a nie obiekcie, czyli jak najbardziej możemy się do niego odwoływać bezpośrednio w innym obiekcie tej samej klasy. W przypadku naszej metody equal() może jest to bardziej oczywiste, natomiast przy porównaniu bezpośrednim dwóch różnych obiektów na pewno większość z was już się zastanowiła.

Poprawna odpowiedź to c) Program się wykona i wyświetli dwa razy true

Zapamiętaj więc - w obrębie klasy możesz się odwoływać do pól prywatnych innej instancji tej samej klasy. Lepszym nawykiem będzie jednak używanie w każdym wypadku getterów i setterów, ponieważ w zdecydowanej większości przypadków chcieliśmy w ten sposób zablokować możliwość bezpośredniej manipulacji na danym polu.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

s4ncho

brak odnosnika do odopowiedzi

Kamil

Bardzo fajny dział, powinieneś go bardziej rozwijać. Jest to zdecydowany plus tej strony. Przydałby się też dział poświęcony optymalizacji (z tematami typu StringBuffer i StringBuilder). Fajnie by było też jakbyś dodał newsletter i wysyłał powiadomienia o nowych artykułach ;) Pozdrowienia, Kamil

Artur

Jestem nowicjuszem wolał bym dowiedzieć się jak na własny serwer wstawić skrypt np. z obiektami gif. może napiszecie jakiś wzór pokoleji jak się to robi z przykkładową aplikacją np przesówanie prostokonta ps. Swietna stronka

Marcinho

Świetny dział, bardzo pouczający :) Fajnie by było jakbyś go jeszcze trochę rozbudował.