Empecé a leer un libro de Java y me pregunté; ¿Qué especificador de acceso es el predeterminado, si no se especifica ninguno?
java
access-specifier
Bennedich
fuente
fuente
Respuestas:
La visibilidad predeterminada se conoce como "paquete-privado" (aunque no se puede usar explícitamente), lo que significa que se podrá acceder al campo desde el interior del mismo paquete al que pertenece la clase.
Sin embargo, 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
fuente
El especificador predeterminado depende del contexto.
Para clases y declaraciones de interfaz, el paquete predeterminado es privado. Esto cae entre protegido y privado, permitiendo solo el acceso de clases en el mismo paquete. (protected es así, pero también permite el acceso a subclases fuera del paquete).
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 en sí misma tiene como valor predeterminado el paquete privado.
Si entonces tenemos la declaración
Las clases que usan MyInterface2 pueden ver field1 y method1 desde la superinterfaz, porque son públicas, aunque no pueden ver la declaración de MyInterface en sí.
fuente
/* pp */
) es solo un nombre conveniente para el acceso predeterminado . No es el nombre de JLS.Si no se proporciona un especificador de acceso, es acceso a nivel de paquete (no hay un especificador explícito para esto) para clases y miembros de clase. Los métodos de interfaz son implícitamente públicos.
fuente
La visibilidad predeterminada (sin palabra clave) es paquete, lo que significa que estará disponible para todas las clases ubicadas en el mismo paquete.
Una nota al margen interesante es que protected no limita la visibilidad a las subclases sino también a las otras clases en el mismo paquete
fuente
Depende de lo que sea.
Los tipos de nivel superior (es decir, clases, enumeraciones, interfaces y tipos de anotaciones no declarados dentro de otro tipo) son paquetes privados de forma predeterminada. ( JLS §6.6.1 )
En las clases, todos los miembros (es decir, campos, métodos y declaraciones de tipos anidados) y constructores son paquetes privados de forma predeterminada. ( JLS §6.6.1 )
En las enumeraciones, los constructores son privados de forma predeterminada. De hecho, los constructores de enumeración deben ser privados, y es un error especificarlos como públicos o protegidos. Las constantes de enumeración son siempre públicas y no permiten ningún especificador de acceso. Otros miembros de enumeraciones son paquetes privados de forma predeterminada. ( JLS §8.9 )
En interfaces y tipos de anotaciones, todos los miembros (nuevamente, 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 anotaciones deben ser públicos y es un error especificarlos como privados o protegidos. ( JLS §9.3 a 9.5 )
Las clases locales son clases con nombre declaradas dentro de un método, constructor o bloque inicializador. Tienen un alcance en el bloque
{
..}
en el que se declaran y no permiten ningún especificador de acceso. ( JLS §14.3 ) Con la reflexión, puede crear instancias de clases locales desde otros lugares, y son paquetes privados , aunque no estoy seguro de si ese detalle está en JLS.Las clases anónimas son clases personalizadas creadas con las
new
que se especifica un cuerpo de clase directamente en la expresión. ( JLS §15.9.5 ) Su sintaxis no permite ningún especificador de acceso. Con la reflexión, puede crear instancias de clases anónimas desde otros lugares, y tanto ellas como sus constructores generados son paquetes privados , aunque no estoy seguro de si ese detalle está en el JLS.Los bloques de inicializador estático y de instancia no tienen especificadores de acceso a nivel de idioma ( JLS §8.6 y 8.7 ), pero los bloques de inicializador estático se implementan como un método denominado
<clinit>
( JVMS §2.9 ), por lo que el método debe, internamente, tener algún especificador de acceso. Examiné clases compiladas por javac y por el compilador de Eclipse usando un editor hexadecimal y descubrí que ambos generan el método como paquete privado . Sin embargo, no puede llamar<clinit>()
dentro del idioma porque los caracteres<
y>
no son válidos en el nombre de un método, y los métodos de reflexión están programados para negar su existencia, por lo que efectivamente su especificador de acceso es sin acceso . El método solo puede ser llamado por la máquina virtual, durante la inicialización de la clase.Los bloques inicializadores de instancias no se compilan como métodos separados; su código se copia en cada constructor, por lo que no se puede acceder a ellos individualmente, incluso por reflexión.fuente
default es una palabra clave que se utiliza como modificador de acceso para métodos y variables.
El uso de este modificador de acceso hará que su clase, variable, método o constructor sea accesible desde su propia clase o paquete, y también se establecerá si no hay ningún modificador de acceso presente.
si usa un valor predeterminado en una interfaz, podrá implementar un método como este ejemplo
Sin embargo, solo funcionará desde la versión 8 de Java
Documentación oficial
Modificadores de acceso en Java
fuente
Consulte aquí para obtener más detalles. El valor predeterminado no es privado / público / protegido, sino una especificación de acceso completamente diferente. No se usa mucho y prefiero ser mucho más específico en mis definiciones de acceso.
fuente
el especificador de acceso predeterminado es paquete. Las clases pueden acceder a los miembros de otras clases en el mismo paquete. pero fuera del paquete aparece como privado
fuente
Aquí hay una cita sobre la visibilidad a nivel de paquete de una entrevista con James Gosling, el creador de Java:
http://www.artima.com/intv/gosling2P.html
fuente
Actualizar el uso de palabras clave de Java 8
default
: como muchos otros han notado La visibilidad predeterminada (sin palabra clave)No debe confundirse con la nueva característica de Java 8 ( métodos predeterminados ) que permite que una interfaz proporcione una implementación cuando está etiquetada con la
default
palabra clave.Ver: modificadores de acceso
fuente
Hay un modificador de acceso llamado "predeterminado" en JAVA, que permite la creación de instancia directa de esa entidad solo dentro de ese paquete.
Aquí hay un enlace útil:
Modificadores / especificadores de acceso de Java
fuente
En primer lugar, déjeme decir una cosa: no existe un término como "Especificador de acceso" en Java. Deberíamos llamar a todo como "Modificadores". Como sabemos que final, estático, sincronizado, volátil ... se llaman modificadores, incluso Público, privado, protegido, predeterminado, abstracto también deben llamarse como modificadores. El valor predeterminado es un modificador en el que la existencia física no existe pero no se coloca ningún modificador, entonces debe tratarse como modificadores predeterminados.
Para justificar esto, tome un ejemplo:
La salida será:
Hello Java
Ahora cambie de público a privado y vea qué error del compilador obtiene: Dice "El modificador privado no está permitido aquí". La conclusión es que alguien puede estar equivocado o 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 son modificadores.
fuente