Czy "package private" member access nie jest równoznaczne z domyślnym (bez modyfikatora) dostępem?

Jestem trochę zdezorientowany pojęciem "pakiet prywatny", którego używa część dokumentacji, wraz z użyciem " domyślnego dostępu."Czy package-private I default access nie są równoznaczne z protected?

Author: Basil Bourque, 2011-03-24

7 answers

Tak, to prawie to samo. Modyfikator protected określa, że członek może być dostępny tylko w jego własnym pakiecie (tak jak w pakiecie-private), a DODATKOWO, przez podklasę jego klasy w innym pakiecie.

 137
Author: Luciano Fiandesio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 07:37:20

"domyślnym" modyfikatorem dostępu (takim, w którym żaden z nich nie jest jawnie podany) jest "pakiet-prywatny", co oznacza, że tylko rzeczy z tego samego pakietu mogą do nich uzyskać dostęp. Jednak bycie w tym samym pakiecie nie oznacza nic o relacji dziedziczenia między klasami - jest to czysto nazewnicza konwencja.

"Protected" oznacza, że nie tylko klasy w tym samym pakiecie, ale także podklasy (niezależnie od tego, w którym pakiecie znajdują się te podklasy) będą miały do niego dostęp.

 36
Author: Adrian Petrescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 07:48:56

Domyślny Dostęp dla klas to package-private, jednak domyślny Dostęp dla członków interface jest publiczny.

Np.

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 { }
}

Domyślne reguły dostępu dla interfejsów nie są takie same jak dla klas.

 16
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 09:00:00

Package-private I default access to synonimy. Obiekt może również uzyskać dostęp do chronionego członka obiektów, których klasy znajdują się w tym samym pakiecie. Obiekt może również uzyskać dostęp do chronionego członka swoich superklas bez warunku dotyczącego ich pakietu. Jako konkretny przykład :

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     
    }
 3
Author: Gursel Koca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 12:52:01

'Pakiet prywatny' i domyślny dostęp są takie same. We wczesnych wydaniach kompilatora około 1.1.2/3,' pakiet 'był dozwolonym modyfikatorem, ale ignorowany, co oznacza to samo, co brak modyfikatora, tzn. 'pakiet prywatny'. Wkrótce potem pojawiła się krótkotrwała moda na umieszczanie /*package*/ (jako komentarza) w takich sytuacjach. Podobnie w tym czasie można było deklarować rzeczy jak zsynchronizowane klasy, chociaż znowu nie było rzeczywistego efektu semantycznego.

Żaden z nich nie jest taki sam jak "chroniony", który rozszerza się na klasy pochodne w innych pakietach.

 1
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 17:24:13

From Java Language Spec

  • 6.6.5 przykład: Default-Access Fields, Methods, and Constructors If żaden z modyfikatorów dostępu publiczny, chronione lub prywatne są określone, a członkiem klasy lub konstruktorem jest dostępny w całym pakiecie, który zawiera deklarację klasy w którym deklarowany jest członek klasy, ale członek klasy lub konstruktor jest niedostępny w żadnym innym opakowaniu.

Jeśli Klasa publiczna posiada metodę lub konstruktor z domyślnym dostępem, wtedy ta metoda lub konstruktor nie jest dostępne lub dziedziczone przez podklasa zadeklarowana poza tym pakietem

 0
Author: Dead Programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 07:47:04

Domyślne i package-private są takie same, co oznacza, że mogą być używane przez dowolną klasę, dopóki nie znajdą się w tym samym pakiecie.

Termin package-private w rzeczywistości jest określany w znaczeniu modyfikatora private jako private oznacza, że jest dostępny tylko w tej samej klasie i żadne inne klasy lub podklasy nie mogą uzyskać do niego dostępu w tym samym pakiecie lub bez niego.

Stąd package-private oznacza to samo co default .

 -1
Author: aayush shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 09:34:53