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

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

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

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 statement 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 statement

 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 statement de MyInterface.

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.

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

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 nesteds) y constructores son paquetes privados por defecto. ( JLS §6.6.1 )

    • Cuando una clase no tiene un constructor declarado explícitamente, el comstackdor 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 nesteds) 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 scope 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 syntax 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 ( JVMS §2.9 ), por lo que el método debe tener, internamente, algunos especificador de acceso. Examiné las clases comstackdas por javac y por el comstackdor de Eclipse usando un editor hexadecimal y encontré que ambas generan el método como paquete-privado . Sin embargo, no puede llamar a () 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 comstackn 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.

Mira aquí 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.

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

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

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

Hay un modificador de acceso llamado “predeterminado” en JAVA, que permite la creación directa de instancias de esa entidad solo dentro de ese paquete.

Aquí hay un enlace útil:

Modificadores / especificadores de acceso a Java

Público es una palabra clave que se usa como un modificador de acceso para métodos y variables. Una variable (campo) o un método declarado como público es visible y se puede acceder por todas las clases definidas en diferentes paquetes.

La palabra clave public se utiliza en muchos lenguajes de progtwigción orientados a objetos (OOPL), incluidos C ++, Java, C # y Visual Basic.NET (VB.NET). Un miembro público está limitado a una clase y menos restrictivo que un miembro privado. Las variables o campos que se declaran públicos no tienen restricciones de accesibilidad. Un miembro privado, sin embargo, solo es visible en su clase.

modificador de acceso público Los campos, métodos y constructores declarados públicos (menos restrictivos) dentro de una clase pública son visibles para cualquier clase en el progtwig Java, ya sea que estas clases estén en el mismo paquete o en otro paquete.

Otros acceden a modificadores

  1. privado
  2. protegido
  3. defecto

Los campos o métodos privados (más restrictivos) no se pueden usar para clases e interfaces. Tampoco se puede usar para campos y métodos dentro de una interfaz. Los campos, métodos o constructores declarados privados están estrictamente controlados, lo que significa que no se pueden acceder por ningún lado fuera de la clase adjunta. Una estrategia de diseño estándar es hacer que todos los campos sean privados y proporcionarles métodos public getter.

Los campos o métodos protegidos no se pueden usar para clases e interfaces. Tampoco se puede usar para campos y métodos dentro de una interfaz. Los campos, métodos y constructores declarados protegidos en una superclase solo se puede acceder por subclases en otros paquetes. Las clases en el mismo paquete también pueden acceder a campos, métodos y constructores protegidos, incluso si no son una subclase de la clase del miembro protegido.

Java proporciona un especificador predeterminado que se utiliza cuando no hay ningún modificador de acceso presente. Cualquier clase, campo, método o constructor que no tenga un modificador de acceso declarado solo es accesible por clases en el mismo paquete. El modificador predeterminado no se usa para campos y métodos dentro de una interfaz. Modificador de acceso predeterminado significa que no declaramos explícitamente un modificador de acceso para una clase, campo, método, etc.

En Java, ¿qué pasa si la clase no tiene ningún modificador?

Si una clase no tiene ningún modificador de acceso, se tratará bajo el modificador de acceso predeterminado .

En los lenguajes de progtwigción orientados a objetos, la encapsulación se utiliza para referirse a una de dos nociones relacionadas pero distintas, y a veces a la combinación de las mismas:

Un mecanismo de lenguaje para restringir el acceso directo a algunos de los componentes del objeto Un constructo de lenguaje que facilita la agrupación de datos con los métodos (u otras funciones) que operan en esos datos.

 //Java program to illustrate default modifier package p1; //Class Geeks is having Default access modifier class Geek { void display() { System.out.println("Hello World!"); } } 

..

 //Java program to illustrate error while //using class from different package with //default modifier package p2; import p1.*; //This class is having default access modifier class GeekNew { public static void main(String args[]) { //accessing class Geek from package p1 Geeks obj = new Geek(); obj.display(); } } 

..

  //Java program to illustrate error while //using class from different package with //private modifier package p1; class A { private void display() { System.out.println("GeeksforGeeks"); } } class B { public static void main(String args[]) { A obj = new A(); //trying to access private method of another class obj.display(); } } 

..

  //Java program to illustrate //protected modifier package p1; //Class A public class A { protected void display() { System.out.println("GeeksforGeeks"); } } //Java program to illustrate //protected modifier package p2; import p1.*; //importing all classes in package p1 //Class B is subclass of A class B extends A { public static void main(String args[]) { B obj = new B(); obj.display(); } } 

..

 //Java program to illustrate //public modifier package p1; public class A { public void display() { System.out.println("GeeksforGeeks"); } } package p2; import p1.*; class B { public static void main(String args[]) { A obj = new A; obj.display(); } } 

https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)
https://www.quora.com/In-Java-what-is-the-difference-between-public-class-and-class https://www.techopedia.com/definition/24018/public-java
https://www.geeksforgeeks.org/access-modifiers-java/

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 comstackdor 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 comstackdor no puede estar equivocado? Entonces podemos decir que no hay un especificador de acceso a términos en Java, todo es modificadores.

Intereting Posts