Чи має у Java "приватний захищений" модифікатор доступу?


160

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

private protected someMethod() {

}

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

Я спробував і змінні, і методи, і я впевнений, що його немає, але я хочу пояснити, що сталося. Чи вважали, а потім відкидали? Або його видалили в новій версії Java?

Редагувати: Я не шукаю інформацію про protectedключове слово.


60
Сторінка, яку ви знайшли, встановлює HTTP-заголовок "Останнє змінення": пн, 26 лютого 1996 18:14:04 GMT!
Г. Сільві Девіс

6
@Joe Я все для того, щоб закрити питання, як це можливо, але я не бачу нічого про комбінований private protectedмодифікатор.
jpmc26

2
@ jpmc26 Дивіться "У Java 1.0 був додатковий модифікатор доступу, приватний захищений." Однак відповідь тут набагато кращий підсумок історії.
Джо

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 мови мови підтримував п'ять рівнів доступу: чотири перераховані вище плюс private protected. Рівень private protectedдоступу не підтримується у версіях Java вище 1,0; ви більше не повинні використовувати його у своїх програмах Java.

Ще одна відповідь на SoftwareEngineering.SE говорить:

Java спочатку мала такий модифікатор. Це було написано, private protectedале видалено в Java 1.0.

Тепер подивіться історію версій Java :

JDK 1.0

Перша версія була випущена 23 січня 1996 року і отримала назву Дуб. Перша стабільна версія, 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 року. Після private protectedвидалення Java 1.0 / JDK 1.0.2 було видалено після лютого 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

Є заплутані / незрозумілі історії:

Один із джерел із Принстона, який ви ставите, а також з архівів MIT , зазначає, що:

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

Але ця функція не вказана в жодній офіційній документації для Java 1.0 тут чи тут .

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

PS: сором Oracle за видалення архівів для старих версій.


тож моє посилання є старішою версією того самого вмісту? : D

Можливо, інформація про відсутність має щось спільне з тією запискою, яку ви поставили.

@AndrewLi Ніде в зазначених посиланнях жоден з них не вказаний як стабільний . І це, безумовно, заплутано позначати 1.0.2 як 1.0, коли є фактичний 1.0.
m0skit0

10

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

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

Зверніть увагу, що я пояснив, чому він використовувався. Звичайно, не в поточній версії


Моє посилання призначене для доступу до методу. Не доступ для учасників.

1
@MarkYisri те ж саме можна використовувати і для змінних членів. Специфікатори доступу не працюють лише на методах, але й на параметрах членів. Іншими словами, специфікатори доступу - це поняття інкапсуляції, і незалежно від того, застосовуєте ви його до методів-членів або змінних-членів. це стосується майже всіх об'єктно-орієнтованих мов, включаючи C ++ та java
programmer_of_the_galaxies

Гаразд, але в підручнику (що цікаво) не згадуються приватні захищені змінні. Зачекайте і дозвольте мені побачити, чи є сторінка змінних ...


0

Ні, ви не можете використовувати обидва разом. Ваш підручник дивний. У вас є так званий пакет приватний або в ot6 посиланнях, захищений пакетом доступу. Це доступ за замовчуванням, який увімкнено, коли чітко не записаний жоден класифікатор acc6privateprotected


3
Я знав, що ти не можеш цим скористатися. Хочу знати, що з ним сталося, що інші відповіді пояснюють краще.

4
Ну, посилання з 1996 року, тому враховуючи, що розробка Java тільки почалася роком раніше, зміст посилання насправді не такий дивний: D
Keiwan

6
Хороший момент про дату документа, що стосується курсу. Я відповів на питання, коли приїхав мій потяг, і написав це за допомогою телефону, так що вибачте, якщо відповідь не було зірвано достатньо. Просто хотів допомогти ...
AlexR

6
@AlexR правопису помилки укосу насправді гра слова (поїзд). Щойно помітили. : D

1
@MarkYisri, докладно. Писання за допомогою телефону - не найкращий спосіб розміщення відповідей на ТА.
AlexR

-2

Приватна сфера дії - це існуючий клас. При цьому захищеним може бути доступ у межах пакету та класу, розширений класами інших пакетів.

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

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

Приватні методи / змінні мають область застосування в класі. Вони не можуть бути доступними поза класом.

Отже, ви не можете одночасно визначити приватний захищений!


Це не дало відповіді на запитання. Я запитав, чому це не працює. Інші відповіді набагато краще справляють відповіді на запитання.

Щоб уточнити далі, я знаю, що це вже не працює, але інші відповіді пояснюють, чому і що сталося в минулому. Твій ні.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.