Hat Java einen “privat geschützten” Zugriffsmodifikator?
Lesezeit: 8 Minuten
Ich habe einige Referenzen gesehen, die sich auf einen Zugriffsmodifikator in Java mit dem Namen beziehen private protected (beide Wörter zusammen):
private protected someMethod() {
}
Eine der Seiten, die ich dazu gefunden habe, ist hier. Meine Schulstunde hat sich auch auf diesen Zugriffsmodifikator bezogen (und gesagt, dass er existiert). Ihre Verwendung führt jedoch zu einem Fehler in der Java-Sprache.
Ich habe es sowohl mit Variablen als auch mit Methoden versucht und bin mir ziemlich sicher, dass es nicht existiert, aber ich möchte eine Erklärung dafür, was passiert ist. Wurde es erwogen und dann verworfen? Oder wurde es in einer neueren Version von Java entfernt?
Bearbeiten: Ich suche keine Informationen über die protected Stichwort.
Die Seite, die Sie gefunden haben, setzt einen “Last-Modified”-HTTP-Header von: Mon, 26. Februar 1996 18:14:04 GMT!
– G. Sylvie Davies
2. Januar 2017 um 18:28 Uhr
@Joe Ich bin dafür, Fragen möglichst als Dupes zu schließen, aber ich sehe es nicht irgendetwas über eine kombinierte private protected Modifikator drin.
– jpmc26
3. Januar 2017 um 11:34 Uhr
@ jpmc26 Siehe “In Java 1.0 gab es einen zusätzlichen Zugriffsmodifikator, privat geschützt.” Die Antwort hier ist jedoch eine viel bessere Zusammenfassung der Geschichte.
– Jo
3. Januar 2017 um 11:38 Uhr
@Joe Es gibt tatsächlich einen Verweis auf private protected in dieser Antwort, aber es erklärt nicht, warum oder was damit passiert ist, worum es in dieser Frage geht.
– m0skit0
3. Januar 2017 um 18:15 Uhr
Findet es noch jemand beängstigend, dass das OP dies in der Schule gelernt hat … über 20 Jahre nachdem es aus den Dokumenten entfernt wurde? Interessante Geschichtsstunde, aber immer noch ein bisschen beängstigend, dass die Leute etwas lernen, das entfernt wurde, bevor Java 1 benannt wurde …
– XaolingBao
4. Januar 2017 um 13:27 Uhr
Andreas Li
Entfernung des Zugriffsmodifikators
Java hatte ursprünglich die private protected Modifikator, aber er wurde in JDK 1.0.2 entfernt (der erste stabil Version, das Java 1.0, das wir heute kennen). Ein paar Tutorials zu JDK 1.0.2 (hier und hier) Folgendes sagen:
Hinweis: Die Version 1.0 der Java-Sprache unterstützte fünf Zugriffsebenen: die vier oben aufgelisteten plus private protected. Das private protected Zugriffsebene wird in Java-Versionen höher als 1.0 nicht unterstützt; Sie sollten es nicht mehr in Ihren Java-Programmen verwenden.
Die erste Version wurde am veröffentlicht 23. Januar 1996 und genannt Eiche. Die erste stabile Version, JDK 1.0.2, heißt Java 1.
Daraus können wir schließen, dass sich die Tutorials zu Version 1.0.2 auf die allererste Version, JDK 1.0, beziehen, wo die Sprache Oak hieß, aber das von SoftwareEngineering.SE bezieht sich auf die erste stabile Version, JDK 1.0.2, genannt Java 1.0, wo es entfernt wurde.
Wenn Sie jetzt versuchen, danach in der Java 1.0-Dokumentation, werden Sie es nicht finden, da es, wie bereits erwähnt, in JDK 1.0.2, auch bekannt als Java 1.0, entfernt wurde. Dies wird erneut bewiesen, wenn Sie sich die “Last Modified”-Zeiten für den von Ihnen geposteten Link ansehen. Der von Ihnen gepostete Link wurde zuletzt im Februar 1996 geändert. Java 1.0/JDK 1.0.2, wann private protected entfernt wurde, wurde freigegeben nach Februar 1996und gemäß der Spezifikation, August 1996.
Grund für die Entfernung
Einige Quellen erklären auch den Grund dafür private protectedwie zum Beispiel Dies eines. Zitieren:
Was wurde privat geschützt?
Schon früh erlaubte die Java-Sprache bestimmte Kombinationen von Modifikatoren, von denen einer war private protected. Die Bedeutung von private protected war es, die Sichtbarkeit streng auf Unterklassen zu beschränken (und den Paketzugriff zu entfernen). Dies wurde später als etwas inkonsistent und übermäßig komplex angesehen und wird nicht mehr unterstützt.[5]
[5] Die Bedeutung der protected Modifikator in der Beta2-Version von Java geändert, und die private protected Kombination erschien zur gleichen Zeit. Sie haben einige potenzielle Sicherheitslücken gepatcht, aber viele Leute verwirrt.
Und die SoftwareEngineering.SE unterstützt dies auch, indem sie sagt, dass es die Inkonsistenzen und die zusätzliche Komplexität nicht wert war, also wurde es früh entfernt.
Deutung
Meine Interpretation von all dem ist, dass vielleicht beide in den Oak-Tagen koexistieren durften (daher die Kombination). Seit protectedDie Bedeutung von hatte sich geändert1möglicherweise war eine Genehmigung erforderlich private und protected zur selben Zeit. Die Einführung wurde zu komplex und hat sich nicht gelohnt und wurde daher am Ende fallen gelassen. Als Java 1.0/JDK 1.0.2 herauskam, war es fallen gelassen worden und kann daher nicht in der Dokumentation gefunden werden.
1In dem Oak-SprachspezifikationAbschnitt 4.10, Zugriff auf Variablen und Methodenwird angemerkt, dass der Standardmodifikator war protected:
Standardmäßig sind alle Variablen und Methoden in einer Klasse geschützt.
Dies unterscheidet sich erheblich von dem, was wir heute haben, dem standardmäßigen Paketzugriff. Dies könnte den Weg für die Notwendigkeit von geebnet haben private protectedWeil private war zu restriktiv und protected war zu nachsichtig.
Ich bin mir sicher, dass es nicht viel wert ist – aber ich erinnere mich, wann es passiert ist (ich habe als Kind programmiert und war aus irgendeinem Grund sehr an diesem neuen Java-Ding interessiert) und obwohl ich keine der Originalquellen finden kann – ich erinnere mich an Dinge genau so, als ich ihnen folgte.
– Benjamin Grünbaum
3. Januar 2017 um 20:30 Uhr
Early on, the Java language allowed for certain combinations of modifiers, Heißt das, es gab mehr als nur „Private Protected“?
– XaolingBao
4. Januar 2017 um 13:30 Uhr
@XaolingBao Nun, natürlich ist ein Accessor wie kein Accesor 🙂 Die bereitgestellten Links sollten Ihre Frage klären.
– m0skit0
4. Januar 2017 um 18:43 Uhr
m0skit0
Es gibt verwirrende/unklare Geschichten:
Eine, von der Princeton-Quelle, die Sie angegeben haben, und auch von MIT-Archivbesagt, dass:
Hinweis: Die Version 1.0 der Java-Sprache unterstützte fünf Zugriffsebenen: die vier oben aufgeführten plus privat geschützt. Die private geschützte Zugriffsebene wird in Java-Versionen höher als 1.0 nicht unterstützt; Sie sollten es nicht mehr in Ihren Java-Programmen verwenden.
Aber diese Funktion wird in keiner offiziellen Dokumentation für Java 1.0 angegeben hier oder hier.
Ich vermute, dass diese Funktion es nicht in die offizielle Version 1.0 geschafft hat, da die offizielle Sprachspezifikation vom August 1996 stammt und die Princeton-Quelle zuletzt geändert wurde am Februar 1996.
PS: Schande über Oracle, dass es die Archive für ältere Versionen entfernt hat.
Ist mein Link also eine ältere Version desselben Inhalts? 😀
– Benutzer6754053
2. Januar 2017 um 18:25 Uhr
Vielleicht haben die fehlenden Informationen etwas mit dieser Notiz zu tun, die Sie gemacht haben.
– Benutzer6754053
2. Januar 2017 um 18:33 Uhr
@AndrewLi Nirgendwo wird beides angegeben stabil auf die angegebenen Referenzen. Und es ist definitiv verwirrend, 1.0.2 als 1.0 zu bezeichnen, wenn es tatsächlich 1.0 gibt.
– m0skit0
3. Januar 2017 um 18:11 Uhr
Der Wasserprogrammierer
Wie der Link, den Sie in Ihrer Frage angegeben haben, andeutet private protected wurde auf einem verwendet element/member einer Klasse, wann immer Sie möchten subclass um auf das Element zugreifen zu können, es aber vor anderen Klassen in seinem verborgen zu halten package.
Java wenn verglichen mit C++ hat ein zusätzliches Konzept zum Einkapseln von Elementen – und das ist a Paket. Man sollte auch verstehen, was innerhalb oder außerhalb eines Pakets zugänglich ist Java wenn es um diese Zugriffsspezifizierer wie geht private, public & protected.
Bitte beachten Sie, dass ich erklärt habe, warum es verwendet wurde. Natürlich nicht in der aktuellen Version
Mein Link ist für den Methodenzugriff. Kein Mitgliedszugang.
– Benutzer6754053
2. Januar 2017 um 18:28 Uhr
@MarkYisri kann auch für Member-Variablen verwendet werden. Zugriffsbezeichner funktionieren nicht nur bei Methoden, sondern auch bei Member-Variablen. Mit anderen Worten, Zugriffsspezifizierer sind Kapselungskonzepte und unabhängig davon, ob Sie sie auf Mitgliedsmethoden oder Mitgliedsvariablen anwenden. das gilt für fast alle objektorientierten Sprachen, einschließlich C++ und Java
– TheWaterProgrammer
2. Januar 2017 um 18:29 Uhr
Okay, aber das Tutorial erwähnt (interessanterweise) nicht privat geschützte Variablen. Warten Sie und lassen Sie mich sehen, ob es eine Variablenseite gibt …
Nein, du kannst nicht beides verwenden private a protected zusammen. Deine Anleitung ist seltsam. Was Sie haben, ist ein sogenanntes privates Paket oder in ot6-Referenzen paketgeschützter Zugriff. Dies ist der Standardzugriff, der aktiviert wird, wenn kein acc6-Qualifizierer explizit geschrieben wird.
Der private Bereich befindet sich innerhalb der vorhandenen Klasse. Wobei Protected Zugriff innerhalb von Paketen und Klassen sein kann, die durch Klassen in anderen Paketen erweitert werden.
Wenn Sie möchten, dass auf Ihre Variablen/Methoden außerhalb des Pakets zugegriffen werden kann, müssen Sie sie nahtlos als geschützt/öffentlich, ansonsten privat oder einige andere Zugriffsspezifizierer definieren.
Auf geschützte Methoden kann normalerweise von außerhalb des Pakets und innerhalb von Unterklassen zugegriffen werden, dh eine Klasse muss die jeweilige Klasse erweitern, um geschützte definierte Methoden zu nutzen.
Private Methoden/Variablen haben einen Gültigkeitsbereich innerhalb der Klasse. Außerhalb der Klasse kann nicht auf sie zugegriffen werden.
Sie können also nicht gleichzeitig Private Protected definieren!
Dies beantwortete die Frage nicht. Ich fragte, warum es nicht funktionierte. Die anderen Antworten beantworten die Frage viel besser.
– Benutzer6754053
29. Januar 2017 um 20:03 Uhr
Zur weiteren Verdeutlichung weiß ich, dass es jetzt nicht mehr funktioniert, aber die anderen Antworten erklären, warum und was in der Vergangenheit passiert ist. Deine nicht.
– Benutzer6754053
22. September 2017 um 11:02 Uhr
Dies beantwortete die Frage nicht. Ich fragte, warum es nicht funktionierte. Die anderen Antworten beantworten die Frage viel besser.
– Benutzer6754053
29. Januar 2017 um 20:03 Uhr
Zur weiteren Verdeutlichung weiß ich, dass es jetzt nicht mehr funktioniert, aber die anderen Antworten erklären, warum und was in der Vergangenheit passiert ist. Deine nicht.
– Benutzer6754053
22. September 2017 um 11:02 Uhr
13453400cookie-checkHat Java einen “privat geschützten” Zugriffsmodifikator?yes
Die Seite, die Sie gefunden haben, setzt einen “Last-Modified”-HTTP-Header von: Mon, 26. Februar 1996 18:14:04 GMT!
– G. Sylvie Davies
2. Januar 2017 um 18:28 Uhr
@Joe Ich bin dafür, Fragen möglichst als Dupes zu schließen, aber ich sehe es nicht irgendetwas über eine kombinierte
private protected
Modifikator drin.– jpmc26
3. Januar 2017 um 11:34 Uhr
@ jpmc26 Siehe “In Java 1.0 gab es einen zusätzlichen Zugriffsmodifikator, privat geschützt.” Die Antwort hier ist jedoch eine viel bessere Zusammenfassung der Geschichte.
– Jo
3. Januar 2017 um 11:38 Uhr
@Joe Es gibt tatsächlich einen Verweis auf
private protected
in dieser Antwort, aber es erklärt nicht, warum oder was damit passiert ist, worum es in dieser Frage geht.– m0skit0
3. Januar 2017 um 18:15 Uhr
Findet es noch jemand beängstigend, dass das OP dies in der Schule gelernt hat … über 20 Jahre nachdem es aus den Dokumenten entfernt wurde? Interessante Geschichtsstunde, aber immer noch ein bisschen beängstigend, dass die Leute etwas lernen, das entfernt wurde, bevor Java 1 benannt wurde …
– XaolingBao
4. Januar 2017 um 13:27 Uhr