¿No es el acceso de miembros "paquete privado" sinónimo del acceso predeterminado (sin modificador)?

94

Estoy un poco confundido sobre el término "paquete privado" que usa parte de la documentación, junto con el uso de "acceso predeterminado". ¿No son los paquetes privados y el acceso predeterminado ambos sinónimos de protegido?

Tortuga
fuente
7
Entonces, ¿no hay ninguna palabra clave para expresar el acceso privado al paquete? ¿Solo está implícito al no especificar el modificador de acceso?
TurtleToes
5
TurtleToes, eso es correcto, y esto puede ser un poco confuso en Java 8, ya que en realidad es posible poner un defaultmodificador delante de los métodos (de interfaz). ¡Pero eso no es un modificador de acceso! Todos los modificadores de acceso y sus alcances se visualizan claramente en esta tabla .
aioobe
1
también puede consultar la tabla de tutoriales de docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
childno͡.de

Respuestas:

136

Sí, es casi lo mismo. El modificador protegido especifica que solo se puede acceder al miembro dentro de su propio paquete (como con package-private) y, además , mediante una subclase de su clase en otro paquete.

Luciano Fiandesio
fuente
Hubo muchas buenas respuestas aquí, pero esta lo explicó de manera simple y al grano, así que lo acepto
TurtleToes
23
Vale la pena señalar que el acceso predeterminado para el miembro de la interfaz no es un paquete privado.
Peter Lawrey
1
@PeterLawrey ¿Oh? Entonces, ¿cuál es el acceso predeterminado para los miembros de la interfaz?
ArtOfWarfare
8
El valor predeterminado para un campo es public static final, para un método es public abstract, para una enumeración o anotación es publicy para una clase espublic static
Peter Lawrey
36

El modificador de acceso "predeterminado" (aquel en el que ninguno de ellos se proporciona explícitamente) es "paquete-privado", lo que significa que solo las cosas del mismo paquete pueden acceder a ellos. Sin embargo, estar en el mismo paquete no implica nada sobre la relación de herencia entre clases, es puramente una convención de nomenclatura.

"Protegido" significa que no sólo las clases del mismo paquete, sino también las subclases (independientemente del paquete en el que se encuentren esas subclases) podrán acceder a él.

Adrian Petrescu
fuente
bueno, su redacción sobre protegido es incorrecta ... Las mismas instancias de clase de paquete también pueden acceder a miembros protegidos ...
Gursel Koca
15

El acceso predeterminado para las clases es el paquete privado, sin embargo, el acceso predeterminado para los miembros de la interfaz es público.

p.ej

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

Las reglas de acceso predeterminadas para las interfaces no son las mismas que las de las clases.

Peter Lawrey
fuente
3

El acceso predeterminado y el paquete privado son sinónimos. Un objeto también puede acceder a miembros protegidos de los objetos cuyas clases están en el mismo paquete. Un objeto también puede acceder a miembros protegidos de sus superclases sin una condición sobre su paquete. Como ejemplo concreto:

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
fuente
¿El votante negativo podría explicar qué hay de malo en esta explicación? .. excepto una mala redacción ..
Gursel Koca
6
No soy el votante negativo, pero supongo que es porque no está del todo bien; un objeto puede acceder a miembros protegidos de superclases, independientemente del paquete.
Adrian Petrescu
1

'Paquete privado' y el acceso predeterminado son los mismos. En las primeras versiones del compilador alrededor de 1.1.2 / 3, 'paquete' era un modificador permitido, pero ignorado, lo que significa lo mismo que sin modificador, es decir, 'paquete privado'. Poco tiempo después hubo una moda de corta duración para poner /*package*/(como comentario) en tales situaciones. De manera similar, en ese momento se podían declarar cosas como clases sincronizadas, aunque nuevamente no hubo ningún efecto semántico real.

Ninguno de ellos es lo mismo que 'protegido', que se extiende a las clases derivadas en otros paquetes.

Marqués de Lorne
fuente
0

De la especificación del lenguaje Java

  • 6.6.5 Ejemplo: constructores, métodos y campos de acceso por defecto Si no se especifica ninguno de los modificadores de acceso público, protegido o privado, se puede acceder a un miembro de clase o constructor en todo el paquete que contiene la declaración de la clase en la que se encuentra la clase. El miembro está declarado, pero el miembro de la clase o el constructor no es accesible en ningún otro paquete.

Si una clase pública tiene un método o constructor con acceso predeterminado, entonces este método o constructor no es accesible ni heredado por una subclase declarada fuera de este paquete.

Programador muerto
fuente
2
Pero ¿qué pasa con el "paquete privado"? Eso no está en el JLS.
Tom Hawtin - tackline
-1

default y package-private son iguales, lo que significa que ambos pueden ser usados ​​por cualquier clase hasta que estén en el mismo paquete.

El término paquete-privado , en realidad, se denomina con el significado de modificador privado como privado significa que está disponible solo en la misma clase y ninguna otra clase o subclases puede acceder a él dentro del mismo paquete o sin él.

Por lo tanto, paquete privado significa lo mismo que el predeterminado .

ayush shah
fuente