Baza Wiedzy

Zagadka operatora private

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 Programowania 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.

    Zapisz się do newslettera

    Otrzymuj nasz Newsletter z przykładowymi pytaniami rekrutacyjnymi, wyzwaniami programistycznymi i nowościami ze świata Javy, a także informacje o nowych kursach i promocjach.

    Traktujemy Twoją prywatność poważnie. Nikomu nie udostępniamy Twojego maila no i zawsze możesz się wypisać.

    Komentarze do artykułu

    Wyłączyliśmy możliwość dodawania komentarzy. Poniżej znajdziesz archiwalne wpisy z czasów gdy strona była jeszcze hobbystycznym blogiem. Zapraszamy natomiast do zadawnia pytań i dyskusji na naszej grupe na facebooku.

    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ł.

    Szkolenie Java WrocławJavaStart na Youtube