Różnica między domyślnym specyfikatorem dostępu a specyfikatorem bezpiecznego dostępu w Javie


Próbowałem nauczyć się javy i kiedy przejrzałem specyfikatory dostępu, miałem wątpliwości. Jaka jest różnica między specyfikatorem standardowym, jeśli nie został określony, a specyfikatorem bezpiecznego dostępu w języku Java?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To

podręcznik
http://java.sun.com/docs/books ... .html
Java może być dla Ciebie pomocna.
Modifier | Class | Package | Subclass | Worldpublic | Y | Y | Y | Yprotected | Y | Y | Y | Nno modifier | Y | Y | N | Nprivate | Y | N | N | N
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Specyfikator
protected
umożliwia dostęp do wszystkich podklas danej klasy, niezależnie od tego, w jakim pakiecie się znajdują, a także do innego kodu w tym samym pakiecie. Domyślny specyfikator umożliwia dostęp przez inny kod w tym samym pakiecie, ale nie przez kod w podklasach, które znajdują się w różnych pakietach. Cm
... Sekcja Specyfikacja języka Java 6.6
http://docs.oracle.com/javase/ ... s-6.6
.
EDYCJA: Zgodnie z prośbą Michaela Schmeisera (aby inni nie musieli czytać komentarzy ani podążać za linkiem, aby to znaleźć): Wszyscy członkowie interfejsu są domyślnie publiczni. W rzeczywistości określenie dowolnego specyfikatora dostępu dla elementu interfejsu innego niż
public
jest błędem kompilacji (chociaż żaden z domyślnych specyfikatorów dostępu nie jest dostępem publicznym). Oto pełny zestaw reguł z JLS dla członków klas (patrz link powyżej, aby zapoznać się z regułami dotyczącymi pakietów, klas i interfejsów najwyższego poziomu oraz tablic):

Element członkowski (klasa, interfejs, pole lub metoda) typu referencyjnego (klasa, interfejs lub tablica) lub konstruktor typu klasy jest dostępny tylko wtedy, gdy typ jest dostępny, a element członkowski lub konstruktor jest zadeklarowany w celu umożliwienia dostępu:
  • Jeśli element lub konstruktor jest zadeklarowany jako publiczny, wówczas dostęp jest dozwolony.
  • Wszystkie elementy członkowskie interfejsu są niejawnie publiczne.
  • W przeciwnym razie, jeśli element członkowski lub konstruktor jest zadeklarowany jako chroniony, dostęp jest dozwolony tylko wtedy, gdy spełniony jest jeden z następujących warunków:
  • Dostęp do elementu członkowskiego lub konstruktora uzyskuje się z pakietu zawierającego klasę, w której zadeklarowano chroniony element członkowski lub konstruktor.
  • Dostęp jest poprawny, jak opisano w §6.6.2 http://docs.oracle.com/javase/ ... .2... (Ta klauzula odnosi się do reguł, które pozwalają klasom pochodnym na dostęp do chronionych elementów składowych nadklas; §6.6.2 zaczyna się tak: „Dostęp do chronionego elementu członkowskiego lub konstruktora obiektu można uzyskać spoza pakietu, w którym jest on zadeklarowany tylko przez kod odpowiedzialny za implementację tego obiektu. „Następnie szczegółowo omawia tę sprawę).
  • W przeciwnym razie, jeśli element członkowski lub konstruktor jest zadeklarowany jako prywatny, wówczas dostęp jest dozwolony wtedy i tylko wtedy, gdy występuje w treści klasy najwyższego poziomu ( §7.6 http://docs.oracle.com/javase/ ... ls-7.6), który zawiera deklarację elementu członkowskiego lub konstruktora.
  • W przeciwnym razie mówimy, że istnieje dostęp domyślny, który jest dozwolony tylko wtedy, gdy dostęp pochodzi z pakietu, w którym zadeklarowano typ.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Specyfikator bezpiecznego dostępu - istnieją dwa sposoby uzyskania dostępu do chronionych danych
>
  • Chronione elementy członkowskie danych, chronione metody klas będą widoczne dla innych klas, jeśli się w nich znajdują jedna paczka
  • Za pomocą Dziedzictwo oznacza to, że możemy używać chronionych danych tej klasy poprzez dziedziczenie z tej klasy.


Domyślny specyfikator dostępu - domyślnie tylko jeden sposób uzyskiwania dostępu do danych
>
Domyślnie dostęp jest ograniczony tylko do poziomu pakietu, nawet po rozszerzeniu klasy, która ma elementy domyślne, nie będziemy mogli uzyskać dostępu.

Przykład
>

Aby sprawdzić, czy istnieje domyślne słowo kluczowe remove protected dla int x w ProvideProtected, zostanie wygenerowany błąd kompilacji.

1. SuperClass package nee.superclass; public class ProvideProtected {
protected int x=800; } 2.Subclass
package nee.subclass; import nee.superclass.*; public class AccessProtected extends ProvideProtected {
public void accessProtected()
{
System.out.println(x);
} public static void main(String[] args) {
AccessProtected obj=new AccessProtected();
obj.accessProtected(); } }
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Modyfikator dostępu chronionego: - wszystko oznaczone jako chronione jest widoczne w tym samym pakiecie, a także widoczne w podklasie.
Dostęp domyślny: - Domyślnie nie jest to słowo kluczowe. Jest stosowany, jeśli nie określono modyfikatora dostępu. Jest to w zasadzie modyfikator poziomu pakietu. Wszystko, co ma taki dostęp, jest widoczne w tym samym pakiecie.
Różnicę można teraz lepiej wyjaśnić na przykładzie

pakiet p1

public class A
{protected void fn()
{}}


pakiet p1

public class B
{A a1 = new A();a1.fn();// fn() is visible inside the same package}}

Teraz dochodzimy do podklasy w innym pakiecie

pakiet p2

public class D extends A{void test(){A a1 = new new A();//a1.fn() --> would give compilation error
fn();super.fn();}}

fn (), super.fn ()
nie zwróci błędu.
Różnica polega więc na tym, że podklasy metody nie można wywołać przez odniesienie do nadklasy. Albo możesz zadzwonić bezpośrednio, albo możesz użyć super.
Zauważ, że
super.fn ()
musi być częścią metody niestatycznej.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W skrócie:
Element członkowski ​​
default
jest dostępny w

wszystkie inne klasy tego samego pakietu

;
Element członkowski ​​
protected
jest dostępny w

wszystkie inne klasy tego samego pakietu

i

w dowolnej innej klasie dowolnego innego pakietu, o ile ta klasa rozszerza klasę zawierającą chroniony element członkowski.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się