usar modificadores codigo acceso java access-specifier

modificadores - ¿Cuál es el especificador de acceso predeterminado en Java?



protected en java (11)

Entonces comencé a leer un libro de Java y me pregunté; ¿Cuál especificador de acceso es el predeterminado si no se especifica ninguno?


Actualizar el uso de Java 8 de la palabra clave default : como muchos otros han notado La visibilidad predeterminada (sin palabra clave)

el campo será accesible desde el mismo paquete al que pertenece la clase.

No debe confundirse con la nueva característica Java 8 ( Métodos predeterminados ) que permite que una interfaz proporcione una implementación cuando está etiquetada con la palabra clave default .

Ver: modificadores de acceso


Aquí hay una cita sobre la visibilidad a nivel de paquete de una entrevista con James Gosling, el creador de Java:

Bill Venners : Java tiene cuatro niveles de acceso. El valor predeterminado es paquete. Siempre me he preguntado si era conveniente hacer el acceso predeterminado al paquete porque las tres palabras clave que las personas de C ++ ya conocían eran privadas, protegidas y públicas. O si tiene alguna razón particular por la que sintió que el acceso al paquete debería ser el predeterminado.

James Gosling : Un paquete generalmente es un conjunto de cosas que se escriben juntas. De manera genérica, podría haber hecho una de dos cosas. Uno fue forzar siempre a poner en una palabra clave que le da el dominio. O podría haber tenido un valor predeterminado. Y luego la pregunta es, ¿qué es lo que hace que un impago sensato? Y tiendo a ir por lo que es lo menos peligroso.

De modo que lo público hubiera sido algo realmente malo para hacer lo predeterminado. Privado probablemente habría sido una mala decisión establecer un valor predeterminado, aunque solo sea porque la gente en realidad no escribe métodos privados con tanta frecuencia. Y lo mismo con protegido. Y al mirar un montón de código que tenía, decidí que lo más común que era razonablemente seguro estaba en el paquete. Y C ++ no tenía una palabra clave para eso, porque no tenían una noción de paquetes.

Pero me gustó más que la idea de los amigos, porque con los amigos tienes que enumerar quiénes son todos tus amigos, así que si agregas una nueva clase a un paquete, generalmente terminas teniendo que ir a todos los amigos. Clases en ese paquete y actualizar a sus amigos, lo que siempre he encontrado como un completo dolor en el trasero.

Pero la lista de amigos en sí misma causa una especie de problema de control de versiones. Y entonces había esta noción de una clase amistosa. Y lo bueno de que estaba haciendo eso es el predeterminado: resolveré el problema, entonces, ¿cuál debería ser la palabra clave?

Por un tiempo, realmente hubo una palabra clave amigable. Pero debido a que todos los demás comienzan con "P", fue "frívolo" con un "PH". Pero eso solo estuvo ahí por tal vez un día.

http://www.artima.com/intv/gosling2P.html


Depende de lo que sea.

  • Los tipos de nivel superior (es decir, las clases, las enumeraciones, las interfaces y los tipos de anotación no declarados dentro de otro tipo) son paquetes privados por defecto. ( JLS §6.6.1 )

  • En clases, todos los miembros (esto significa campos, métodos y declaraciones de tipos anidados) y constructores son paquetes privados por defecto. ( JLS §6.6.1 )

    • Cuando una clase no tiene un constructor declarado explícitamente, el compilador inserta un constructor predeterminado de argumento cero que tiene el mismo especificador de acceso que la clase . ( JLS §8.8.9 ) El constructor predeterminado comúnmente se representa erróneamente como siempre siendo público, pero en casos excepcionales eso no es equivalente.
  • En las enumeraciones, los constructores son privados por defecto. De hecho, los contritores enum deben ser privados, y es un error especificarlos como públicos o protegidos. Las constantes de Enum son siempre públicas y no permiten ningún especificador de acceso. Otros miembros de las enumeraciones son paquete privado por defecto. ( JLS §8.9 )

  • En interfaces y tipos de anotación, todos los miembros (una vez más, eso significa campos, métodos y declaraciones de tipos anidados) son públicos por defecto. De hecho, los miembros de las interfaces y los tipos de anotación deben ser públicos, y es un error especificarlos como privados o protegidos. ( JLS §9.3 a 9.5 )

  • Las clases locales se denominan clases declaradas dentro de un método, constructor o bloque de inicialización. Tienen un alcance al bloque { .. } en el que están declarados y no permiten ningún especificador de acceso. ( JLS §14.3 ) Usando la reflexión, puede crear instancias de clases locales desde cualquier lugar, y son paquetes privados , aunque no estoy seguro de si ese detalle está en el JLS.

  • Las clases anónimas son clases personalizadas creadas con new que especifican un cuerpo de clase directamente en la expresión. ( JLS §15.9.5 ) Su sintaxis no permite ningún especificador de acceso. Al usar la reflexión, puede crear instancias de clases anónimas desde cualquier lugar, y tanto ellas como sus constructores generados son privados del paquete , aunque no estoy seguro de si ese detalle está en el JLS.

  • Los bloques Instance y Stationary Inicializer no tienen especificadores de acceso en el nivel de idioma ( JLS §8.6 y 8.7 ), pero los bloques de inicializador estáticos se implementan como un método denominado <clinit> ( JVMS §2.9 ), por lo que el método debe tener, internamente, algunos especificador de acceso. Examiné las clases compiladas por javac y por el compilador de Eclipse usando un editor hexadecimal y encontré que ambas generan el método como paquete-privado . Sin embargo, no puede llamar a <clinit>() dentro del lenguaje porque los caracteres < y > no son válidos en un nombre de método, y los métodos de reflexión están cableados para denegar su existencia, por lo que su especificador de acceso efectivamente no tiene acceso . El método solo puede ser llamado por la VM, durante la inicialización de la clase. Los bloques de inicializador de instancias no se compilan como métodos separados; su código se copia en cada constructor, por lo que no se puede acceder de forma individual, ni siquiera por reflexión.


El especificador predeterminado depende del contexto.

Para clases y declaraciones de interfaz, el valor predeterminado es paquete privado. Esto se encuentra entre protegido y privado, permitiendo solo las clases en el mismo acceso de paquete. (protegido es así, pero también permite el acceso a subclases fuera del paquete).

class MyClass // package private { int field; // package private field void calc() { // package private method } }

Para los miembros de la interfaz (campos y métodos), el acceso predeterminado es público. Pero tenga en cuenta que la declaración de la interfaz se establece de forma predeterminada en el paquete privado.

interface MyInterface // package private { int field1; // static final public void method1(); // public abstract }

Si tenemos la declaración

public interface MyInterface2 extends MyInterface { }

Las clases que usan MyInterface2 pueden ver el campo1 y el método1 desde la interfaz súper, porque son públicos, aunque no puedan ver la declaración de MyInterface.


En primer lugar, permítanme decir una cosa: no existe el término "especificador de acceso" en java. Deberíamos llamar a todo como "modificadores". Como sabemos que los modificadores finales, estáticos, sincronizados, volátiles ... se llaman modificadores, incluso los abstractos, privados, protegidos, predeterminados, también se deben llamar como modificadores. El valor predeterminado es un modificador en el que la existencia física no está allí, pero no se colocan modificadores, entonces debe tratarse como modificadores predeterminados.

Para justificar esto, tome un ejemplo:

public class Simple{       public static void main(String args[]){        System.out.println("Hello Java");       }   }  

La salida será: Hello Java

Ahora cambie público a privado y vea qué error compilador obtiene: dice "El modificador privado no está permitido aquí". ¿Qué conclusión es que alguien puede estar equivocado o que algún tutorial puede estar equivocado, pero el compilador no puede estar equivocado? Entonces podemos decir que no hay un especificador de acceso a términos en Java, todo es modificadores.



La visibilidad predeterminada (sin palabra clave) es un paquete, lo que significa que estará disponible para todas las clases que se encuentren en el mismo paquete.

Nota informativa interesante es que protected no limita la visibilidad de las subclases sino también de las otras clases en el mismo paquete


La visibilidad predeterminada se conoce como "paquete privado" (aunque no puede usar esto explícitamente), lo que significa que se podrá acceder al campo desde el mismo paquete al que pertenece la clase.

Como señaló mdma, no es cierto para los miembros de la interfaz, para los cuales el valor predeterminado es "público".

Ver los especificadores de acceso de Java


Mira here para más detalles. El valor predeterminado no es privado / público / protegido, sino una especificación de acceso completamente diferente. No se usa ampliamente, y prefiero ser mucho más específico en mis definiciones de acceso.


Si no se proporciona ningún especificador de acceso, se trata de acceso a nivel de paquete (no hay un especificador explícito para esto) para las clases y los miembros de la clase. Los métodos de interfaz son implícitamente públicos.


el especificador de acceso predeterminado es el paquete. Las clases pueden acceder a los miembros de otras clases en el mismo paquete, pero fuera del paquete aparece como privado