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


Así que empecé a leer un libro de Java y me pregunté; ¿qué especificador de acceso es el predeterminado si no se especifica ninguno?

Author: bennedich, 2010-08-20

12 answers

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

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

Ver Especificadores de acceso de Java

 100
Author: KeatsPeeks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-28 06:15:44

El especificador predeterminado depende del contexto.

Para las clases y declaraciones de interfaz, el valor predeterminado es package private. Esto cae entre protegido y privado, permitiendo solo clases en el mismo paquete de acceso. (protected 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 propia declaración de interfaz por defecto es package privado.

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

Si entonces tenemos la declaración

public interface MyInterface2 extends MyInterface
{

}

Las clases que usan MyInterface2 pueden ver field1 y method1 desde la súper interfaz, porque son públicas, aunque no pueden ver la declaración de MyInterface en sí.

 72
Author: mdma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-20 10:50:22

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

 13
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-20 10:39:55

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

Una nota interesante es que protected no limita la visibilidad a las subclases, sino también a las otras clases en el mismo paquete

 8
Author: Johannes Wachter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-20 10:41:28

Depende de lo que sea la cosa.

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

  • En las clases, todos los miembros (que significa campos, métodos y declaraciones de tipo anidadas) y constructores son paquete-privado por defecto. ( JLS §6.6.1)

    • Cuando una clase no ha declarado explícitamente constructor, el compilador inserta un constructor de argumento cero predeterminado que tiene el mismo especificador de acceso que la clase. ( JLS §8.8.9 ) El constructor predeterminado es comúnmente mal declarado como siempre público, pero en casos raros eso no es equivalente.
  • En enumeraciones, los constructores son privados por defecto. De hecho, los contructores de enum deben ser privados, y es un error especificarlos como públicos o protegidos. Constantes Enum son siempre públicos, y no permiten ningún especificador de acceso. Otros miembros de enums son package-private por defecto. ( JLS §8.9)

  • En interfaces y tipos de anotación, todos los miembros (de nuevo, eso significa campos, métodos y declaraciones de tipo anidadas) son públicos por defecto. De hecho, los miembros de interfaces y 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 bloque de método, constructor o inicializador. Son con el alcance de {..} bloque en el que se declaran y no permiten ningún especificador de acceso. (JLS §14.3) Usando reflexión, puede instanciar clases locales desde otros lugares, y son paquete-privado, aunque no estoy seguro de si ese detalle está en el JLS.

  • Las clases Anónimas son clases personalizadas creado con new que especifica un cuerpo de clase directamente en la expresión. ( JLS §15.9.5 ) Su sintaxis no permite ningún especificador de acceso. Usando reflexión, puedes instanciar clases anónimas desde otro lugar, y tanto ellas como sus constructores generados son paquete-privado, aunque no estoy seguro de si ese detalle está en el JLS.

  • Los bloques inicializadores estáticos y de instancia no tienen especificadores de acceso a nivel de idioma (JLS §8.6 & 8.7 ), pero los bloques del inicializador estático se implementan como un método llamado <clinit> (JVMS §2.9), por lo que el método debe, internamente, tener algún 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 package-private. 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 programados para denegar su su especificador de acceso es no access. El método solo puede ser llamado por la VM, durante la inicialización de la clase. Instance Los bloques inicializadores 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.

 6
Author: Boann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-18 00:30:48

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

 3
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-20 10:40:33

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

 2
Author: lil_pgmr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-19 10:37:28

Aquí hay una cita sobre la visibilidad del 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 package. Me siempre me he preguntado si hacer que el acceso al paquete sea predeterminado era conveniente porque las tres palabras clave que la gente de C++ ya conocía eran privados, protegidos y públicos. O si tuvieras algún particular razón por la que sintió que el acceso a paquetes debería ser el predeterminado.

James Gosling: Un paquete es generalmente un conjunto de cosas que son escritos juntos. Así que genéricamente podría haber hecho una de dos cosas. Una era forzarte a poner siempre una palabra clave que te dé la dominio. O podría haber tenido un valor predeterminado. Y entonces la pregunta es, ¿qué hace que un defecto sensible? Y tiendo a ir por lo que es lo menos cosa peligrosa.

Así que public habría sido algo muy malo hacer el valor predeterminado. Private probablemente habría ha sido algo malo hacer un defecto, si solo porque la gente realmente no escribe métodos privados tan a menudo. Y lo mismo con protegido. Y mirando un montón de código que Habí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 idea de paquetes.

Pero me gustó más que la noción de amigos, porque con amigos usted tiene que enumerar que todos los de su amigos son, y así si agrega una nueva clase a un paquete, entonces generalmente termina teniendo que ir a todas las clases en ese paquete y actualizar a sus amigos, que siempre había encontrado que era un completo dolor en el trasero.

Pero la propia lista de amigos causa un problema de versiones. Y así que había esta noción de una clase amistosa. Y lo bueno que Estaba haciendo que el defecto solve voy a resolver el problema así que lo que debería ¿la palabra clave be?

Para una mientras que en realidad había una palabra clave amigable. Pero porque todos los otros comienzan con "P", era "phriendly" con un "PH". sólo ahí dentro por un día.

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

 2
Author: Vitalii Fedorenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-14 04:16:38

Actualizar Java 8 uso de la palabra clave default : Como muchos otros han señalado La visibilidad predeterminada (sin palabra clave)

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

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

 1
Author: Sanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 16:52:38

Hay un modificador de acceso llamado "default" 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 Java

 0
Author: kg11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-21 07:44:12

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

La palabra clave public se usa en muchos lenguajes de programación orientados a objetos (OOPL), incluyendo C++, Java, C# y Visual Basic.NET (VB.NET). Un miembro público está libremente ligado a una clase y menos restrictivo que un miembro privado. 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 programa Java, ya sea que estas clases estén en el mismo paquete o en otro paquete.

Otros modificadores de acceso

  1. privado
  2. protegido
  3. por defecto

Las 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 desde ningún lugar fuera de la clase que los contiene. Una estrategia de diseño estándar es hacer que todos los campos sean privados y proporcionar métodos de obtención públicos para ellos.

Los campos protegidos o métodos no se pueden utilizar para las clases y Interfaz. 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 pueden ser accedidos 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 usa cuando no hay ningún modificador de acceso presente. Cualquier clase, campo, método o el constructor que no tiene un modificador de acceso declarado es accesible solo 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 es modificador?

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

En el objeto lenguajes de programación orientados, 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 Una construcción de lenguaje que facilita la agrupación de datos con los métodos (u otras funciones) que operan en ese 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/

 0
Author: Amadeu Antunes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 05:44:38

En primer lugar permítanme decir una cosa que no hay tal 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 como modificadores, incluso Public, private, protected, default, abstract también se deben llamar como modificadores . Por defecto es un modificador donde la existencia física no está allí, pero no se coloca ningún modificador, entonces debe ser tratado como modificadores por defecto.

Para justificar esto toma uno 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 de compilador obtiene: Dice "Modificador privado no está permitido aquí" Qué conclusión es que alguien puede estar equivocado o algún tutorial puede estar equivocado pero el compilador no puede estar equivocado. Así que podemos decir que no hay especificador de acceso de término en Java todo es modificadores.

 -1
Author: Sagar Raut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 08:26:24