Спецификатор доступа в комбинации java (private-protected) [duplicate]

eval echo \"\$$bar\" сделает это.

158
задан Mark Yisri 3 January 2017 в 15:52
поделиться

5 ответов

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

У 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, такую ​​как этот . Процитировать:

Что было защищено частным образом?

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

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

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

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

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


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

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

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

190
ответ дан Community 16 August 2018 в 08:01
поделиться
  • 1
    Я уверен, что это не стоит многого - но я помню, когда это произошло (я программировал в детстве и очень походил на эту новую Java-вещь по какой-то причине), и пока я не могу найти ни одного из исходных источников - я помню вещи точно так же, когда я последовал за ними. – Benjamin Gruenbaum 3 January 2017 в 21:30
  • 2
    Хорошее исследование, спасибо за разъяснения. Определенно лучший ответ :) – m0skit0 4 January 2017 в 12:00
  • 3
    Early on, the Java language allowed for certain combinations of modifiers, Означает ли это, что было больше, чем просто «Private Protected? & quot; – XaolingBao 4 January 2017 в 14:30
  • 4
    @XaolingBao Ну, конечно, один аксессуар не похож на не accusor :) Предоставленные ссылки должны прояснить ваш вопрос. – m0skit0 4 January 2017 в 19:43

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

1
ответ дан AlexR 16 August 2018 в 08:01
поделиться
  • 1
    Я знал, что вы не можете его использовать. Я хочу знать, что с ним случилось, что другие ответы объясняют лучше. – Mark Yisri 2 January 2017 в 19:28
  • 2
    Ну, ссылка с 1996 года, так что Java-разработка только началась примерно год назад, содержание ссылки на самом деле не так странно: D – Keiwan 2 January 2017 в 19:31
  • 3
    Хороший вопрос о дате преподавания документа. Я ответил на вопрос, пока вы тренируетесь, и написали его по телефону, так что извините, если ответ не был сведен с рельсов. Просто хотел помочь ... – AlexR 2 January 2017 в 22:44
  • 4
    @AlexR ваша орфографическая ошибка с рельсами - фактически каламбур (поезд). Просто заметил. : D – Mark Yisri 3 January 2017 в 01:01
  • 5
    @MarkYisri, подробно. Написание с использованием телефона - не лучший способ опубликовать ответы на SO. – AlexR 3 January 2017 в 14:35

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

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

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

12
ответ дан Game_Of_Threads 16 August 2018 в 08:01
поделиться
  • 1
    Моя ссылка предназначена для доступа к методу. Не членский доступ. – Mark Yisri 2 January 2017 в 19:28
  • 2
    @MarkYisri то же самое можно использовать и для переменных-членов. Спецификаторы доступа работают не только на методах, но и на членах-членах. Другими словами, спецификаторы доступа представляют собой концепции инкапсуляции & amp; независимо от того, применяете ли вы его к методам членов или переменным-членам. который применяется практически ко всем объектно-ориентированным языкам, включая C ++ & amp; Ява – Game_Of_Threads 2 January 2017 в 19:29
  • 3
    Хорошо, но в учебнике (интересно) нет упоминаний о частных защищенных переменных. Подождите и дайте мне посмотреть, есть ли страница переменных ... – Mark Yisri 2 January 2017 в 19:30
  • 4
  • 5
    @MarkYisri Yup. спасибо за подтверждение человек – Game_Of_Threads 2 January 2017 в 19:31

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

Один из источника Принстона, который вы положили, а также из архивов MIT , утверждает, что:

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

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

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

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

53
ответ дан m0skit0 16 August 2018 в 08:01
поделиться
  • 1
    так ли моя ссылка более старая версия одного и того же контента? : D – Mark Yisri 2 January 2017 в 19:25
  • 2
    Возможно, недостающая информация имеет какое-то отношение к этой заметке, которую вы положили. – Mark Yisri 2 January 2017 в 19:33
  • 3
    @MarkYisri См. Мой обновленный ответ. – m0skit0 2 January 2017 в 19:39
  • 4
    @AndrewLi Нигде не указано как stable на данных ссылках. И это определенно сбивает с толку относиться к 1.0.2 как 1.0, когда есть фактический 1.0. – m0skit0 3 January 2017 в 19:11

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

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

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

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

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

-3
ответ дан Tejas Gowda 16 August 2018 в 08:01
поделиться
  • 1
    Это не отвечало на вопрос. Я спросил, почему это не сработало. Другие ответы намного лучше отвечают на вопрос. – Mark Yisri 29 January 2017 в 21:03
  • 2
    Чтобы уточнить, я знаю, что он больше не работает сейчас, но другие ответы объясняют, почему и что произошло в прошлом. Твой нет. – Mark Yisri 22 September 2017 в 11:02
Другие вопросы по тегам:

Похожие вопросы: