Java Language
Widoczność (kontrolowanie dostępu do członków klasy)
Szukaj…
Składnia
- nazwa typu publicznego [= wartość];
- nazwa typu prywatnego [= wartość];
- nazwa typu chronionego [= wartość];
- wpisz nazwę [= wartość];
- nazwa klasy publicznej {
- Nazwa klasy{
Uwagi
Z samouczka Java :
Modyfikatory poziomu dostępu określają, czy inne klasy mogą używać określonego pola lub wywoływać określoną metodę. Istnieją dwa poziomy kontroli dostępu:
- Na najwyższym poziomie -
public
lub pakiet-prywatny (bez wyraźnego modyfikatora). - Na poziomie członka -
public
,private
,protected
lub pakiet-prywatny (bez wyraźnego modyfikatora).
Klasę można zadeklarować za pomocą modyfikatora public
, w którym to przypadku klasa jest widoczna dla wszystkich klas na całym świecie. Jeśli klasa nie ma modyfikatora (wartość domyślna, znana również jako pakiet-prywatny ), jest widoczna tylko w swoim własnym pakiecie.
Na poziomie członka można również użyć modyfikatora public
lub bez modyfikatora ( pakiet-prywatny ), podobnie jak w przypadku klas najwyższego poziomu i o tym samym znaczeniu. Członkowie mają dwa dodatkowe modyfikatory dostępu: private
i protected
. Modyfikator private
określa, że dostęp do elementu można uzyskać tylko w jego własnej klasie. protected
modyfikator określa, że dostęp do elementu można uzyskać tylko w jego własnym pakiecie (jak w przypadku pakietu-prywatny ), a ponadto przez podklasę jego klasy w innym pakiecie.
Poniższa tabela pokazuje dostęp do elementów dozwolony przez każdy modyfikator.
Poziomy dostępu:
Modyfikator | Klasa | Pakiet | Podklasa | Świat |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N. |
bez modyfikatora | Y | Y | N. | N. |
private | Y | N. | N. | N. |
Członkowie interfejsu
public interface MyInterface {
public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X {
}
class Y {
}
}
Członkowie interfejsu zawsze mają publiczną widoczność, nawet jeśli pominięto public
słowo kluczowe. Zatem zarówno foo()
, bar()
, TEXT
, ANSWER
, X
i Y
mają widoczność publiczną. Jednak dostęp może być nadal ograniczony przez interfejs zawierający - ponieważ MyInterface
ma widoczność publiczną, do jego członków można uzyskać dostęp z dowolnego miejsca, ale gdyby MyInterface
miał widoczność pakietu, jego członkowie byliby dostępni tylko z tego samego pakietu.
Widoczność publiczna
Widoczny dla klasy, pakietu i podklasy.
Zobaczmy przykład z klasowym testem.
public class Test{
public int number = 2;
public Test(){
}
}
Teraz spróbujmy utworzyć instancję klasy. W tym przykładzie możemy uzyskać dostęp do number
ponieważ jest on public
.
public class Other{
public static void main(String[] args){
Test t = new Test();
System.out.println(t.number);
}
}
Prywatna widoczność
private
widoczność umożliwia dostęp do zmiennej tylko przez jej klasę. Są często używane w połączeniu z public
programami pobierającymi i ustawiającymi.
class SomeClass {
private int variable;
public int getVariable() {
return variable;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
public class SomeOtherClass {
public static void main(String[] args) {
SomeClass sc = new SomeClass();
// These statement won't compile because SomeClass#variable is private:
sc.variable = 7;
System.out.println(sc.variable);
// Instead, you should use the public getter and setter:
sc.setVariable(7);
System.out.println(sc.getVariable());
}
}
Widoczność paczki
Bez modyfikatora domyślnie jest widoczność pakietu. Z dokumentacji Java „[widoczność pakietu] wskazuje, czy klasy w tym samym pakiecie co klasa (niezależnie od ich pochodzenia) mają dostęp do członka”. W tym przykładzie z javax.swing
package javax.swing;
public abstract class JComponent extends Container … {
…
static boolean DEBUG_GRAPHICS_LOADED;
…
}
DebugGraphics
znajduje się w tym samym pakiecie, więc DEBUG_GRAPHICS_LOADED
jest dostępny.
package javax.swing;
public class DebugGraphics extends Graphics {
…
static {
JComponent.DEBUG_GRAPHICS_LOADED = true;
}
…
}
W tym artykule przedstawiono pewne podstawy tematu.
Chroniona widoczność
Chroniona widoczność powoduje, że ten element jest widoczny dla swojego pakietu wraz z dowolną jego podklasą.
Jako przykład:
package com.stackexchange.docs;
public class MyClass{
protected int variable; //This is the variable that we are trying to access
public MyClass(){
variable = 2;
};
}
Teraz rozszerzymy tę klasę i spróbujemy uzyskać dostęp do jednego z jej protected
członków.
package some.other.pack;
import com.stackexchange.docs.MyClass;
public class SubClass extends MyClass{
public SubClass(){
super();
System.out.println(super.variable);
}
}
Będziesz także mieć dostęp do protected
członka bez rozszerzania go, jeśli uzyskujesz do niego dostęp z tego samego pakietu.
Zauważ, że ten modyfikator działa tylko na członkach klasy, a nie na samej klasie.
Podsumowanie modyfikatorów dostępu członków klasy
Modyfikator dostępu | Widoczność | Dziedzictwo |
---|---|---|
Prywatny | Tylko klasa | Nie można odziedziczyć |
Bez modyfikatora / pakietu | W paczce | Dostępne, jeśli podklasa w pakiecie |
Chroniony | W paczce | Dostępne w podklasie |
Publiczny | Wszędzie | Dostępne w podklasie |
Kiedyś istniał private protected
modyfikator (oba słowa kluczowe jednocześnie), który można zastosować do metod lub zmiennych, aby uczynić je dostępnymi z podklasy spoza pakietu, ale uczynić je prywatnymi dla klas w tym pakiecie. Zostało to jednak usunięte w wersji Java 1.0 .