Ist der Zugriff auf private Mitglieder nicht gleichbedeutend mit dem Standardzugriff (ohne Modifikator)?

94

Ich bin ein wenig verwirrt über den Begriff "Paket privat", den einige der Dokumentationen zusammen mit der Verwendung von "Standardzugriff" verwenden. Sind paketprivater und Standardzugriff nicht gleichbedeutend mit geschützt?

TurtleToes
quelle
7
Es gibt also überhaupt kein Schlüsselwort, um den privaten Paketzugriff auszudrücken. Es wird nur impliziert, indem der Zugriffsmodifikator nicht angegeben wird.
TurtleToes
5
TurtleToes, das stimmt, und das kann in Java 8 etwas verwirrend sein, da es tatsächlich möglich ist, defaultModifikatoren vor (Schnittstellen-) Methoden zu setzen. Aber das ist kein Zugriffsmodifikator! Alle Zugriffsmodifikatoren und ihre Bereiche werden in dieser Tabelle übersichtlich dargestellt .
Aioobe
1
Sie können auch die Tutorial-Tabelle von docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Antworten:

136

Ja, es ist fast das gleiche. Der geschützte Modifikator gibt an, dass auf das Mitglied nur innerhalb seines eigenen Pakets (wie bei package-private) und zusätzlich durch eine Unterklasse seiner Klasse in einem anderen Paket zugegriffen werden kann .

Luciano Fiandesio
quelle
Es gab viele gute Antworten hier, aber diese erklärte es einfach und auf den Punkt, also akzeptiere ich es
TurtleToes
23
Es ist erwähnenswert, dass der Standardzugriff für das Schnittstellenmitglied nicht paketprivat ist.
Peter Lawrey
1
@ PeterLawrey Oh? Was ist dann der Standardzugriff für Schnittstellenmitglieder?
ArtOfWarfare
8
Die Standardeinstellung für ein Feld ist public static final, für eine Methode ist public abstract, für eine Aufzählung oder Anmerkung ist publicund für eine Klasse ist espublic static
Peter Lawrey
36

Der "Standard" -Zugriffsmodifikator (derjenige, bei dem keiner von ihnen explizit angegeben ist) ist "package-private", was bedeutet, dass nur Dinge im selben Paket auf sie zugreifen können. Wenn Sie sich jedoch im selben Paket befinden, bedeutet dies nichts über die Vererbungsbeziehung zwischen Klassen - es handelt sich lediglich um eine Namenskonvention.

"Geschützt" bedeutet, dass nicht nur Klassen im selben Paket, sondern auch Unterklassen (unabhängig davon, in welchem ​​Paket sich diese Unterklassen befinden) darauf zugreifen können.

Adrian Petrescu
quelle
Nun, Ihre Formulierung über protected ist falsch. Dieselben Paketklasseninstanzen können auch auf geschützte Mitglieder zugreifen.
Gursel Koca
15

Der Standardzugriff für Klassen ist paketprivat, der Standardzugriff für Schnittstellenmitglieder ist jedoch öffentlich.

z.B

public interface I {
   int A = 1;
// same as
   public static final int A = 1;

   void method();
// same as
   public abstract void method();

   class C { }
// same as
   public static class C { }
}

Die Standardzugriffsregeln für Schnittstellen sind nicht dieselben wie für Klassen.

Peter Lawrey
quelle
3

Paket-privater und Standardzugriff sind Synonyme. Ein Objekt kann auch auf geschützte Mitglieder der Objekte zugreifen, deren Klassen sich im selben Paket befinden. Ein Objekt kann auch auf geschützte Mitglieder seiner Oberklassen zugreifen, ohne eine Bedingung für sein Paket zu haben. Als konkretes Beispiel:

package ab;

class A {
   protected void foo() {}
   void dd(){}
}

class C {
   void aa(){
       A a = new A();
       a.foo(); //legal
       a.dd();  //legal
   }
}


package sub;

class D extends A{
      void ac(){
         foo(); //legal ..
         dd();  //illegal.. because dd has default access.. 
      }

class E {
    void ee(){
       A a = new A();
       a.foo(); //illegal
       a.dd();  //illegal     
    }
Gursel Koca
quelle
Downvoter könnte erklären, was an dieser Erklärung falsch ist? .. außer schlechten Formulierungen ..
Gursel Koca
6
Ich bin nicht der Downvoter, aber ich denke, das liegt daran, dass es nicht ganz richtig ist. Ein Objekt kann unabhängig vom Paket auf geschützte Mitglieder von Oberklassen zugreifen .
Adrian Petrescu
1

"Paket privat" und Standardzugriff sind identisch. In früheren Versionen des Compilers um 1.1.2 / 3 war 'package' ein zulässiger Modifikator, wurde jedoch ignoriert, was dasselbe bedeutet wie kein Modifikator, dh 'package private'. Kurz darauf gab es eine kurzlebige Mode, um /*package*/(als Kommentar) in solche Situationen zu bringen. In ähnlicher Weise konnte man zu dieser Zeit Dinge wie synchronisierte Klassen deklarieren, obwohl es wiederum keinen tatsächlichen semantischen Effekt gab.

Keiner von beiden ist derselbe wie 'protected', der sich auf abgeleitete Klassen in anderen Paketen erstreckt.

Marquis von Lorne
quelle
0

Aus der Java-Sprachspezifikation

  • 6.6.5 Beispiel: Standardzugriffsfelder, -methoden und -konstruktoren Wenn keiner der öffentlichen, geschützten oder privaten Zugriffsmodifikatoren angegeben ist, kann im gesamten Paket, das die Deklaration der Klasse enthält, in der sich die Klasse befindet, auf ein Klassenmitglied oder einen Konstruktor zugegriffen werden Mitglied ist deklariert, aber auf das Klassenmitglied oder den Konstruktor kann in keinem anderen Paket zugegriffen werden.

Wenn eine öffentliche Klasse über eine Methode oder einen Konstruktor mit Standardzugriff verfügt, kann eine außerhalb dieses Pakets deklarierte Unterklasse nicht auf diese Methode oder diesen Konstruktor zugreifen oder diese erben

Toter Programmierer
quelle
2
Aber was ist mit "Paket privat". Das ist nicht in der JLS.
Tom Hawtin - Tackline
-1

default und package-private sind beide gleich, was bedeutet, dass beide von jeder Klasse verwendet werden können, bis sie sich im selben Paket befinden.

Der paketprivate Begriff wird tatsächlich mit der Bedeutung des privaten Modifikators bezeichnet, da privat bedeutet, dass er nur in derselben Klasse verfügbar ist und keine anderen Klassen oder Unterklassen innerhalb oder außerhalb desselben Pakets darauf zugreifen können.

Daher bedeutet package-private dasselbe wie default .

aayush shah
quelle