Есть ли в Java «закрытый защищенный» модификатор доступа?

160

Я видел некоторые ссылки на модификатор доступа в Java, который называется private protected(оба слова вместе):

private protected someMethod() {

}

Одна из найденных мной страниц, ссылающаяся на это, находится здесь . Мой школьный урок также упоминал этот модификатор доступа (и сказал, что он существует). Однако его использование приводит к ошибке в языке Java.

Я пробовал как с переменными, так и с методами, и я почти уверен, что его не существует, но я хочу объяснить, что произошло. Было ли это рассмотрено, а затем отклонено? Или это было удалено в более новой версии Java?

Изменить: я не ищу информацию о protectedключевом слове.


источник
60
Страница, которую вы нашли, устанавливает HTTP-заголовок "Last-Modified": понедельник, 26 февраля 1996 18:14:04 GMT!
Г. Сильви Дэвис
6
@Joe Я все для закрытия вопросов , как обманутые когда это возможно, но я не вижу ничего о комбинированном private protectedмодификаторе там.
jpmc26
2
@ jpmc26 См. «В Java 1.0 был дополнительный модификатор доступа, private private». Тем не менее, ответ здесь - намного лучшее изложение истории.
Джо
2
@Joe В этом ответе действительно есть ссылка private protected, но она не объясняет, почему или что с ним произошло, о чем этот вопрос.
m0skit0
3
Кому-нибудь еще страшно, что ОП изучал это в школе ... через 20 лет после того, как его удалили из Документов? Интересный урок истории, но все еще немного страшно, что люди изучают что-то, что было удалено до того, как была названа Java 1 ...
XaolingBao

Ответы:

191

Удаление модификатора доступа

У Java изначально был private protectedмодификатор, но он был удален в JDK 1.0.2 (первая стабильная версия, Java 1.0, которую мы знаем сегодня). В нескольких руководствах по JDK 1.0.2 ( здесь и здесь ) говорится следующее:

Примечание. Версия 1.0 языка Java поддерживает пять уровней доступа: четыре из перечисленных выше плюс private protected. Уровень private protectedдоступа не поддерживается в версиях Java выше 1.0; вы больше не должны использовать его в своих программах Java.

Другой ответ на SoftwareEngineering.SE гласит:

У Java изначально был такой модификатор. Он был написан, private protectedно удален в Java 1.0.

Теперь взгляните на историю версий Java :

JDK 1.0

Первая версия была выпущена 23 января 1996 года и называлась Oak. Первая стабильная версия, JDK 1.0.2, называется Java 1.

Исходя из этого, мы можем заключить, что руководства по версии 1.0.2 относятся к самой первой версии, JDK 1.0, где язык назывался Oak, а язык от SoftwareEngineering.SE относится к первой стабильной версии, JDK 1.0.2, называемой Java. 1.0, где он был удален.

Теперь, если вы попытаетесь найти его в документации по Java 1.0 , вы не найдете его, потому что, как упоминалось ранее, он был удален в JDK 1.0.2, иначе известной как Java 1.0. Это еще раз подтверждается, когда вы смотрите «Время последнего изменения» для ссылки, которую вы разместили. Ссылка, которую вы разместили, была в последний раз изменена в феврале 1996 года. Java 1.0 / JDK 1.0.2, когда она private protectedбыла удалена, была выпущена после февраля 1996 года и согласно спецификации, август 1996 года.

Причина удаления

Некоторые источники также объясняют причину private protected, такую ​​как эта . Цитировать:

Что было в частной собственности?

Ранее язык Java допускал определенные комбинации модификаторов, один из которых был private protected. Смысл в том, private protectedчтобы ограничить видимость строго подклассами (и удалить доступ к пакету). Позже это было признано несколько противоречивым и чрезмерно сложным, и больше не поддерживается. [5]

[5] Значение protectedмодификатора изменилось в выпуске Java Beta2, и private protectedкомбинация появилась одновременно. Они исправили некоторые потенциальные дыры в безопасности, но смутили многих людей.

И SoftwareEngineering.SE также поддерживает это, заявляя, что оно не стоит несоответствий и дополнительной сложности, поэтому оно было удалено на ранней стадии.

интерпретация

Моя интерпретация всего этого заключается в том, что, возможно, еще в дни Дуба, обоим было позволено сосуществовать (отсюда и комбинация). Поскольку protectedзначение изменилось 1 , возможно, возникла необходимость в разрешении privateи protectedв то же время. Введение стало слишком сложным и не стоило того, и в итоге было отброшено. Ко времени появления Java 1.0 / JDK 1.0.2 он был удален и поэтому не может быть найден в документации.


1 В спецификации языка дуба , раздел 4.10, Доступ к переменным и методам , отмечается, что модификатором по умолчанию было protected:

По умолчанию все переменные и методы в классе защищены .

Это сильно отличается от того, что мы имеем сегодня, доступ к пакету по умолчанию. Это, возможно, проложило путь для нужд private protected, потому что privateбыло слишком ограничительным и protectedслишком мягким.

Эндрю Ли
источник
Я уверен, что это ничего не стоит - но я помню, когда это произошло (я программировал в детстве и по какой-то причине был очень увлечен этим новым Java), и хотя я не могу найти ни один из оригинальных источников - я помню вещи именно так, когда я следовал за ними.
Бенджамин Грюнбаум
Early on, the Java language allowed for certain combinations of modifiers, Означает ли это, что было нечто большее, чем «Частная защита»?
XaolingBao
@XaolingBao Ну, конечно, один аксессор не похож на аксессор :) Приведенные ссылки должны прояснить ваш вопрос.
m0skit0
52

Есть запутанные / неясные истории:

Во-первых, из источника в Принстоне, а также из архивов Массачусетского технологического института , говорится, что:

Примечание. В версии 1.0 языка Java поддерживаются пять уровней доступа: четыре из перечисленных выше плюс защищенный. Частный уровень защищенного доступа не поддерживается в версиях Java выше 1.0; вы больше не должны использовать его в своих программах Java.

Но эта функция не указана ни в одной официальной документации по Java 1.0 здесь или здесь .

Я предполагаю, что эта функция не дошла до официальной версии 1.0, поскольку официальная языковая спецификация появилась в августе 1996 года, а источник в Принстоне был последний раз изменен в феврале 1996 года .

PS: позор Oracle за удаление архивов для старых версий.

m0skit0
источник
так моя ссылка является более старой версией того же контента? : D
Возможно, недостающая информация как-то связана с той запиской, которую вы положили.
@AndrewLi Нигде ни один не указан как стабильный по данным ссылкам. И это определенно сбивает с толку ссылаться на 1.0.2 как 1.0, когда есть актуальная 1.0.
m0skit0
10

Как указывает ссылка, указанная вами в вашем вопросе, private protectedона использовалась element/memberв классе, когда вы хотите, чтобы ваш subclassэлемент имел доступ к элементу, но скрывал его от других классов package.

Javaпо сравнению с C++имеет дополнительную концепцию инкапсуляции элементов - и это пакет . Следует также понимать , что доступно в пределах или за пределами пакета , в Javaкогда дело доходит до этих спецификаторов доступа , как private, publicи protected.

Обратите внимание, что я объяснил, почему он был использован. Не в текущей версии, конечно

programmer_of_the_galaxies
источник
Моя ссылка для доступа к методу. Нет доступа пользователя.
1
@MarkYisri то же самое можно использовать и для переменных-членов. Спецификаторы доступа не работают только для методов, но и для членов. Другими словами, спецификаторы доступа являются концепциями инкапсуляции и не зависят от того, применяете ли вы их для методов-членов или переменных-членов. это относится почти ко всем объектно-ориентированным языкам, включая C ++ и java
programmer_of_the_galaxies
Хорошо, но в учебнике (что интересно) не упоминается приватная защита переменных. Держись и дай мне посмотреть, есть ли страница с переменными ...
0

Нет, вы не можете использовать оба вместе. Ваш урок странный. То, что у вас есть, это так называемый пакет private или в ot6 ссылки на защищенный доступ пакета. Это доступ по умолчанию, который включается, когда квалификатор acc6 не написан явно.privateprotected

AlexR
источник
3
Я знал, что ты не можешь использовать это. Я хочу знать, что случилось с этим, что другие ответы объясняют лучше.
4
Ну, ссылка взята с 1996 года, поэтому, учитывая, что разработка Java только началась примерно годом ранее, содержание ссылки на самом деле не так уж странно: D
Keiwan
6
Хороший вопрос о дате документа. Я ответил на вопрос, пока мой поезд прибывал, и написал это по телефону, так что извините, если ответ был недостаточно сорван. Просто хотел помочь ...
AlexR
6
@AlexR Ваша орфографическая ошибка сорвана - это каламбур (поезд). Просто заметил. : D
1
@MarkYisri, подробно. Писать с помощью телефона - не лучший способ опубликовать ответы на SO.
AlexR
-2

Частная сфера находится в пределах существующего класса. При этом защищенным может быть доступ внутри пакета и класс, расширенный классами в других пакетах.

Плавно, если вы хотите, чтобы ваша переменная / методы имели доступ вне пакета, вы должны определить как защищенный / общедоступный, в противном случае частный или некоторые другие спецификаторы доступа.

Защищенные методы обычно доступны из внешнего пакета и внутри подклассов, то есть класс должен расширять соответствующий класс, чтобы использовать защищенные определенные методы.

Закрытые методы / переменные имеют область видимости в классе. Они не могут быть доступны вне класса.

Следовательно, вы не можете определить частную защиту одновременно!

Техас Говда
источник
Это не ответило на вопрос. Я спросил, почему это не сработало. Другие ответы гораздо лучше отвечают на вопрос.
Чтобы уточнить дальше, я знаю, что это больше не работает сейчас, но другие ответы объясняют, почему и что произошло в прошлом. Твой нет.