Czy Java ma modyfikator dostępu "private protected"?

Widziałem pewne odniesienia do modyfikatora dostępu w Javie o nazwie private protected (oba słowa Razem):

private protected someMethod() {

}

Jedna ze stron, które znalazłem odnosi się do tego jest tutaj . Moja lekcja w szkole również odnosiła się do tego modyfikatora dostępu (i powiedziała, że istnieje). Używanie go powoduje jednak błąd w języku Java.

Próbowałem zarówno zmiennych, jak i metod i jestem prawie pewien, że nie istnieje, ale chcę wyjaśnienia tego, co się stało. Czy zostało to rozważone, a następnie odrzucone? Lub czy został usunięty w nowszej wersji Javy?

Edit: nie szukam informacji o słowie kluczowym protected.

Author: Mark Yisri, 2017-01-02

5 answers

Usunięcie modyfikatora dostępu

Java pierwotnie miała modyfikator private protected, ale został on usunięty w JDK 1.0.2 (pierwsza stabilna wersja , Java 1.0, którą znamy dzisiaj). Kilka samouczków dotyczących JDK 1.0.2 ( tutaj i tutaj ) mówi co następuje:

Uwaga: Wersja 1.0 języka Java obsługiwała pięć poziomów dostępu: cztery wymienione powyżej oraz private protected. Poziom dostępu private protected nie jest obsługiwany w wersjach Java wyższych niż 1.0; nie powinieneś już używać go w swoich programach Java.

Kolejna odpowiedź na SoftwareEngineering.SE Stany:

Java pierwotnie miała taki modyfikator. Został napisany private protected, ale usunięty w Javie 1.0.

Teraz spójrz na historię wersji Javy :

JDK 1.0

Pierwsza wersja została wydana 23 stycznia 1996 roku i nosiła nazwę Oak. pierwsza stabilna wersja, JDK 1.0.2, nazywa się Java 1.

Z tego możemy wywnioskować, że tutoriale dotyczące wersji 1.0.2 odnoszą się do pierwszej wersji, JDK 1.0, gdzie język nazywał się Oak, ale ten z SoftwareEngineering.SE odnosi się do pierwszej stabilnej wersji JDK 1.0.2 o nazwie Java 1.0, gdzie została usunięta.

Teraz, jeśli spróbujesz poszukać go w dokumentacji Java 1.0 , nie znajdziesz go, ponieważ jak wspomniano wcześniej, został usunięty w JDK 1.0.2, w przeciwnym razie znany jako Java 1.0. Jest to ponownie udowodnione, gdy patrzysz na czasy "Ostatnio zmodyfikowane" dla linku, który opublikowałeś. Link został ostatnio zmodyfikowany w lutym 1996 roku. Java 1.0/JDK 1.0.2, kiedy private protected została usunięta, została wydana po lutym 1996 roku, a zgodnie ze specyfikacją, w sierpniu 1996 roku.

Powód usunięcia

Niektóre źródła wyjaśniają również przyczynę private protected, np. ten . Cytat:

Co było prywatne chroniona?

Na początku język Java pozwalał na pewne kombinacje modyfikatorów, z których jednym było private protected. Znaczeniem private protected było ograniczenie widoczności wyłącznie do podklas (i usunięcie dostępu do pakietu). Zostało to później uznane za nieco niespójne i zbyt złożone i nie jest już wspierane.[5]

[5] znaczenie modyfikatora protected zmieniło się w wydaniu Javy Beta2, a kombinacja private protected pojawiła się w tym samym czasie. Łatali jakiś potencjał dziury w zabezpieczeniach, ale wielu ludzi zdezorientowało.

I SoftwareEngineering.SE wspiera to również, mówiąc, że nie było warte niespójności i dodatkowej złożoności, więc zostało usunięte na początku.

Interpretacja

Moja interpretacja tego wszystkiego jest taka, że być może, w czasach dębu, obaj mogli współistnieć (stąd kombinacja). Odkąd protected Znaczenie się zmieniło1, możliwe, że konieczne było zezwolenie private i protected w tym samym czasie. Wprowadzenie stało się zbyt skomplikowane i nie było tego warte, a więc został w końcu porzucony. W czasie, gdy Java 1.0/JDK 1.0.2 się rozeszła, została upuszczona i dlatego nie można jej znaleźć w dokumentacji.


1w specyfikacji językaOak , sekcja 4.10, dostęp do zmiennych i metod , zauważono, że domyślnym modyfikatorem był protected:

Domyślnie wszystkie zmienne i metody w klasie są chronione .

Różni się to od tego, co mamy dzisiaj, domyślnego dostępu do pakietu. Mogło to utorować drogę potrzebom private protected, ponieważ private było zbyt restrykcyjne i protected było zbyt pobłażliwe.

 189
Author: Li357,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:45:55

Są mylące / niejasne historie:

Jeden, ze źródła Princeton, które umieściłeś, a także z archiwum MIT, stwierdza, że:

Uwaga: Wersja 1.0 języka Java obsługiwała pięć dostępu poziomy: cztery wymienione powyżej plus prywatne chronione. The private protected access level nie jest obsługiwany w wersjach Java higher niż 1.0; nie powinieneś już go używać w swoich programach Java.

Ale ta funkcja nie jest określona na żadnym oficjalna dokumentacja Javy 1.0 tutaj lub tutaj .

Domyślam się, że ta funkcja nie dotarła do oficjalnej wersji 1.0, ponieważ oficjalna specyfikacja języka pochodzi z sierpnia 1996 roku, a Źródło Princeton zostało Ostatnio zmodyfikowane w lutym 1996 roku.

PS: szkoda Oracle za usuwanie archiwów dla starszych wersji.

 53
Author: m0skit0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-03 18:18:13

Ponieważ link podany w pytaniu sugeruje, że private protected został użyty na element/member klasy, kiedy chcesz, aby twoja subclass miała dostęp do elementu, ale nie ukrywała go przed innymi klasami w jego package.

Java jeśli w porównaniu do C++ ma dodatkową koncepcję elementów hermetycznych - A jest to Pakiet. Należy również zrozumieć, co jest dostępne wewnątrz lub poza pakietem w Java, jeśli chodzi o te specyfiki dostępu, takie jak private, public & protected.

Proszę zauważyć, że wyjaśniłem, dlaczego został użyty. Nie w bieżącej wersji oczywiście

 12
Author: Game_Of_Threads,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-01 08:38:18

Nie, Nie Można używać obu private a protected razem. Twój tutorial jest dziwny. To, co masz, to tzw. pakiet prywatny lub w referencjach ot6 pakiet chroniony dostęp. Jest to domyślny dostęp, który jest włączony, gdy kwalifikator acc6 nie jest napisany jawnie.

 1
Author: AlexR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 18:28:22

Private scope jest połączeniem istniejącej klasy. W którym chroniony może być dostęp w pakiecie i klasy rozszerzone o klasy w innych pakietach.

Bezproblemowo je ¶ li chcesz, aby Twoja zmienna / metody by3y dostêpne poza pakietem, musisz zdefiniowaæ jako protected / public inaczej private lub inne specifiiers dostêpu.

Protected methods są zwykle dostępne z zewnątrz pakietu i wewnątrz podklas, tzn. klasa musi rozszerzyć odpowiednią klasę, aby skorzystać z protected defined metody.

Prywatne metody / zmienne mają zakres wewnątrz klasy.Nie mogą być dostępne poza klasą.

Dlatego nie możesz jednocześnie zdefiniować Private Protected!

 -3
Author: Tejas Gowda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-29 15:41:01