Tags: Java

Java: jaka jest różnica między public, protected, package-private i private?

W języku Java mamy cztery poziomy widoczności (ang. access modifiers) dostępne dla klas, metod, zmiennych i innych składników klasy. Są to: `public`, `protected`, brak specyfikatora (nazywany również package-private lub default) i `private`. Oto różnice między nimi:

public

- Najbardziej dostępny poziom widoczności.
- Składniki oznaczone jako `public` są widoczne i dostępne z każdego miejsca w programie, zarówno z poziomu własnej klasy, jak i z innych klas, bez ograniczeń.
- Przykład: `public class MyClass { ... }` oznacza, że klasa `MyClass` jest dostępna z każdego miejsca.

protected

- Składniki oznaczone jako `protected` są dostępne tylko w ramach pakietu (package), w którym się znajdują, oraz dla klas dziedziczących (subklas) po klasie, która zawiera te składniki.
- Nie są dostępne spoza pakietu, chyba że klasa dziedzicząca jest w innej klasie dziedziczącej tej samej klasy nadrzędnej.
- Przykład: `protected int myField;` oznacza, że pole `myField` jest dostępne dla klas w tym samym pakiecie i klas dziedziczących.

package-private (default)

- Brak specyfikatora dostępu (package-private) oznacza, że składnik jest dostępny tylko w ramach tego samego pakietu.
- Nie jest dostępny dla klas spoza pakietu, nawet jeśli są one w innych pakietach.
- Jest to poziom dostępu domyślny, jeśli nie użyjesz żadnego specyfikatora dostępu.
- Przykład: `int myField;` oznacza, że pole `myField` jest dostępne tylko dla klas w tym samym pakiecie.

private

- Najbardziej restrykcyjny poziom widoczności.
- Składniki oznaczone jako `private` są dostępne tylko wewnątrz tej samej klasy, w której są zdefiniowane.
- Nie są dostępne dla innych klas, nawet dla klas dziedziczących.
- Przykład: `private void myMethod() { ... }` oznacza, że metoda `myMethod()` jest dostępna tylko dla tej samej klasy.

Wybór odpowiedniego poziomu widoczności zależy od projektu i tego, jakie składniki klasy chcemy udostępnić lub ograniczyć w zakresie dostępu. Warto dążyć do minimalnego udostępniania składników, aby zapewnić enkapsulację i kontrolę nad dostępem do danych i zachowań klasy.