Javaには「プライベート保護」アクセス修飾子がありますか?


160

いくつかの参照がJavaのアクセス修飾子を参照しているprivate protected(両方の単語を一緒に)のを見たことがあります。

private protected someMethod() {

}

これについて私が見つけたページの1つはこちらです。私の学校の授業でも、このアクセス修飾子を参照しました(そして存在すると述べました)。ただし、これを使用すると、Java言語でエラーが発生します。

変数とメソッドの両方を試してみましたが、存在しないことは確かですが、何が起こったのかについての説明が必要です。検討された後、拒否されましたか?それとも、新しいバージョンのJavaで削除されましたか?

編集:protectedキーワードに関する情報を探していません。


60
見つかったページには、「最終更新」HTTPヘッダーが設定されています。月、1996年2月26日18:14:04 GMT!
G.シルビーデイビス2017年

6
@Joe可能な限り、質問を締めくくりに締めくくりますが、結合された修飾子については何も表示されませんprivate protected
jpmc26 2017年

2
@ jpmc26「Java 1.0では、追加のアクセス修飾子、プライベート保護がありました。」を参照してください。しかし、ここでの答えは、歴史のはるかに良い要約です。
Joe

2
@Joe確かprivate protectedにその回答には参照がありますが、それはなぜまたは何が起こったのか、この質問については説明していません。
m0skit0 2017年

3
OPが学校でこれを学んでいたのは恐ろしいと他の誰かが感じています...ドキュメントから削除されてから20年以上経過していますか?興味深い歴史のレッスンですが、Java 1が命名される前に削除されたものを人々が学んでいることはまだ少し怖い...
XaolingBao

回答:


191

アクセス修飾子の削除

Javaには元々private protected修飾子がありましたが、JDK 1.0.2(最初の安定バージョン、今日私たちが知っているJava 1.0)で削除されました。JDK 1.0.2に関するいくつかのチュートリアル(ここここ)は次のように述べています。

注:Java言語の1.0リリースは、5つのアクセスレベルをサポートしていますprivate protectedprivate protectedアクセスレベルは、1.0よりも高いのJavaのバージョンでサポートされていません。Javaプログラムで使用することはできません。

SoftwareEngineering.SEに関する別の回答には、

Javaには元々そのような修飾子がありました。書かれましたprivate protectedが、Java 1.0で削除されました。

次に、Javaのバージョン履歴を確認します

JDK 1.0

最初のバージョンは1996年1月23日にリリースされ Oakと呼ばれていました。最初の安定したバージョン、JDK 1.0.2はJava 1と呼ばれます。

これから、バージョン1.0.2に関するチュートリアルは、言語がOakと呼ばれた最初のバージョンであるJDK 1.0を参照していることを結論付けることができますが、SoftwareEngineering.SEからのものは、Javaと呼ばれる最初の安定したバージョン、JDK 1.0.2を参照します。 1.0、それが削除されたところ。

これをJava 1.0のドキュメントで検索しようとしても見つかりません。前述したように、JDK 1.0.2で削除されたため、Java 1.0とも呼ばれていました。これは、投稿したリンクの「最終更新」時間を見ると再び証明されます。あなたが投稿したリンクは、1996年2月に最後に変更されました。Java1.0 / JDK 1.0.2は、private protected削除されたときに、1996年2月以降にリリースされ、仕様に従って、1996年8月にリリースされまし

削除の理由

いくつかのソースはまた、理由を説明するprivate protectedなど、この 1。引用するには:

私的保護は何でしたか?

初期のJava言語では、修飾子の特定の組み合わせが可能でしたが、そのうちの1つはでしたprivate protected。の意味は、private protected可視性をサブクラスに厳密に制限する(そしてパッケージアクセスを削除する)ことでした。これは後でやや一貫性がなく、過度に複雑であると見なされ、サポートされなくなりました。[5]

[5] protectedJavaのBeta2リリースで修飾子の意味が変更され、private protected組み合わせが同時に登場しました。彼らはいくつかの潜在的なセキュリティホールにパッチを当てましたが、多くの人々を混乱させました。

また、SoftwareEngineering.SEもこれをサポートします。これは、不整合や余分な複雑さの価値はないため、早期に削除されました。

解釈

これらすべてについての私の解釈は、おそらくオーク時代に、両方が共存することを許されていたということです(したがって、組み合わせ)。以来protectedの意味が変わっていた1を、可能にするための必要性があったかもしれないprivateprotected同時に。紹介は複雑になりすぎて価値がなかったため、結局削除されました。Java 1.0 / JDK 1.0.2が登場する頃には、Java 1.0 / JDK 1.0.2は削除されていたため、ドキュメントに記載されていません。


1ではオーク言語仕様、セクション4.10、変数やメソッドへのアクセスは、デフォルトの修飾子はしたことが注目されますprotected

デフォルトでは、クラス内のすべての変数とメソッドは保護されています。

これは、現在のデフォルトのパッケージアクセスとはかなり異なります。これはprivate protectedprivate制限が厳しく、protected寛大すぎるため、の必要性に道を開いた可能性があります。


それはそれほど価値がないと確信しています-しかし、それがいつ起こったのか(私は子供の頃プログラミングしていて、何らかの理由でこの新しいJavaに夢中になりました)、元のソースを見つけることができませんが-覚えています私が彼らをフォローしたとき、まさにこのように。
Benjamin Gruenbaum 2017年

Early on, the Java language allowed for certain combinations of modifiers, それは、「保護されたプライベート」以上のものがあることを意味しますか?
XaolingBao 2017年

@XaolingBaoもちろん、1つのアクセサはアクセサではないようです:)提供されたリンクはあなたの質問を明確にするはずです。
m0skit0 2017年

52

紛らわしい/不明確な話があります:

1つは、あなたが置いたPrincetonのソースから、そしてMITのアーカイブからも、次のように述べています。

注:Java言語の1.0リリースは、5つのアクセスレベルをサポートしました。プライベート保護アクセスレベルは、Javaのバージョン1.0以降ではサポートされていません。Javaプログラムで使用することはできません。

ただし、この機能は、Java 1.0の公式ドキュメント(ここまたはここ)では指定されていません。

公式の言語仕様は1996年8月のものであり、プリンストンのソースは1996年2月に最後に変更されたため、この機能は正式な1.0バージョンには含まれていなかったと思います。

PS:古いバージョンのアーカイブを削除するOracleの恥。


私のリンクは同じコンテンツの古いバージョンですか?:D

おそらく、欠けている情報はあなたが書いたメモと関係があるのか​​もしれません。

@AndrewLiどこも、与えられた参考文献で安定しているとは述べられていません。そして、実際の1.0がある場合、1.0.2を1.0と呼ぶのは間違いなく混乱します。
m0skit0 2017年

10

質問で提供したリンクがクラスのでprivate protected使用されていることを示しているので、要素にアクセスできるようにしelement/memberたいが、subclass内の他のクラスからは要素を非表示にしたい場合package

Javaと比較するC++と、要素をカプセル化するという追加の概念があり、それがパッケージです。、&Javaなどのアクセス指定子に関しては、パッケージ内またはパッケージ外で何にアクセスできるかを理解する必要があります。privatepublicprotected

それが使われた理由を説明したことに注意してください。もちろん現在のバージョンではありません


私のリンクはメソッドへのアクセス用です。メンバーアクセスではありません。

1
@MarkYisriは、メンバー変数にも使用できます。アクセス指定子は、メソッドだけでなく、メンバー変数でも機能します。言い換えると、アクセス指定子はカプセル化の概念であり、メンバーメソッドまたはメンバー変数に適用するかどうかに関係ありません。C ++とJavaを含むほとんどすべてのオブジェクト指向言語に適用されます
programmer_of_the_galaxies

わかりましたが、チュートリアルでは(興味深いことに)プライベートプロテクト変数については触れていません。


0

いいえ、両方privateprotected一緒に使用することはできません。あなたのチュートリアルは奇妙です。あなたが持っているのは、いわゆるパッケージプライベート、またはot6参照パッケージで保護されたアクセスです。これは、acc6修飾子が明示的に記述されていない場合に有効になるデフォルトのアクセスです。


3
使えないことは知っていました。何が起こったのか知りたいのですが、他の回答がよりよく説明しています。

4
まあ、リンクは1996からのものです。そのため、Java開発が約1年前に開始されたので、リンクの内容はそれほど変ではありません:D
Keiwan

6
各ドキュメントの日付についての良い点。明電車が到着している最中に質問に答えて電話で書いたので、脱線が足りなかったらすみません。ちょうど助けたかった...
21:44にAlexR

6
@AlexR 脱線したスペルミスは実際には駄洒落(電車)です。気づいた。:D

1
@MarkYisri、詳細。電話で書くことは、SOに回答を投稿する最良の方法ではありません。
AlexR

-2

プライベートスコープは既存のクラスに存在しません。Protectedは、パッケージおよび他のパッケージのクラスによって拡張されたクラス内でアクセスできます。

シームレスに変数/メソッドをパッケージの外部にアクセスしたい場合は、保護された/パブリックとして定義する必要があります。

保護されたメソッドは通常、パッケージの外側とサブクラス内からアクセスできます。つまり、クラスは、保護された定義済みメソッドを利用するために、それぞれのクラスを拡張する必要があります。

プライベートメソッド/変数は、クラス内にスコープがあります。クラスの外部からアクセスすることはできません。

したがって、プライベート保護を同時に定義することはできません!


これは質問に答えませんでした。それがうまくいかない理由を尋ねました。他の答えは、質問に答えるのにより良い仕事をします。

さらに明確にするために、私はそれが現在は機能しないことを知っていますが、他の回答はなぜなぜ過去に起こったことを説明しています。あなたはしません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.