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

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

private protected someMethod() {

}

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

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

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

Ответ 1

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

В 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. Это снова подтверждается, когда вы просматриваете "Last Modified" раз для ссылки, которую вы опубликовали. Ссылка, которую вы опубликовали, была в последний раз изменена в феврале 1996 года. Java 1.0/JDK 1.0.2, когда private protected был удален, был выпущен после февраля 1996 года и согласно спецификации, август 1996 года.

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

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

Что было конфиденциально защищено?

В начале язык 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 был слишком мягким.

Ответ 2

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

Один из исходного источника в Принстоне, а также из архивов MIT, говорится, что:

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Следовательно, вы не можете определить Private Protected в одно и то же время!