¿Cuál es el modificador de acceso predeterminado en Java? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

¿Cuál es el modificador de acceso predeterminado para un método o una variable de instancia si no lo indico explícitamente?

Por ejemplo:

package flight.booking;

public class FlightLog
{
    private SpecificFlight flight;

    FlightLog(SpecificFlight flight)
    {
        this.flight = flight;
    }
}

¿Está protegido el modificador de acceso de este constructor o paquete? Otras clases en ¿el mismo paquete, que es flight.booking, llama a este constructor?

Author: Peter Mortensen, 2013-04-23

13 answers

De Java documentación

Si una clase no tiene modificador (el predeterminado, también conocido como paquete-privado), solo es visible dentro de su propio paquete (los paquetes se denominan grupos de clases relacionadas - aprenderá sobre ellos en una lección posterior.)

En el member level, también puede usar el modificador public o no modifier (paquete-privado) al igual que con las clases de nivel superior, y con el mismo significado.

Historia Completa se puede leer aquí (Que escribí recientemente):

http://codeinventions.blogspot.com/2014/09/default-access-modifier-in-java-or-no.html

 94
Author: ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ,
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-01-15 10:53:42

De la documentación:

Access Levels
Modifier        Class    Package    Subclass    World
-----------------------------------------------------
public           Y        Y          Y           Y
protected        Y        Y          Y           N
(Default)        Y        Y          N           N
private          Y        N          N           N
 67
Author: Pradeep,
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-01-15 11:02:34

, depende del contexto.

Cuando está dentro de una clase:

class example1 {

    int a = 10; // This is package-private (visible within package)

    void method1() // This is package-private as well.
    {
        -----
    }
}

Cuando está dentro de una interfaz:

interface example2 {

    int b = 10; // This is public and static.
    void method2(); // This is public and abstract
}
 28
Author: SKG,
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-01-15 10:58:05

El modificador de acceso predeterminado es package-private-visible solo desde el mismo paquete

 20
Author: Evgeniy Dorofeev,
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
2013-04-23 08:50:55

Aquí hay un ejemplo de código que debería resumirlo para usted... Además de lo siguiente, que muestra cómo no puede acceder a un valor predeterminado en otro paquete, hay una cosa más.

Por defecto no es accesible en una subclase si la clase que subclase está en otro paquete, pero es accesible si la subclase está en el mismo paquete.

package main;

public class ClassA {
    private int privateVar;
    public int publicVar;
    int defaultVar;
}

package main;

public class ClassB {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        int v1 = a.publicVar;   // Works
        int v2 = a.defaultVar;  // Works
        int v3 = a.privateVar;  // Doesn't work

    }
}

package other;

public class ClassC {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        int v1 = a.publicVar;   // Works
        int v2 = a.defaultVar;  // Doesn't work
        int v3 = a.privateVar;  // Doesn't work
    }
}
 8
Author: JTHouseCat,
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-01-15 11:00:06

El modificador predeterminado es package. Solo el código en el mismo paquete será capaz de invocar este constructor.

 5
Author: cahen,
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-01-15 10:54:23

Sí, es visible en el mismo paquete. Cualquier cosa fuera de ese paquete no se le permitirá acceder a él.

 4
Author: Maninder Singh,
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-01-15 11:05:19

El modificador de acceso de su constructor sería package-private(default). Como has declarado la clase public, será visible en todas partes, pero el constructor no. Su constructor será visible solo en su paquete.

package flight.booking;

public class FlightLog // Public access modifier
{
    private SpecificFlight flight;

    FlightLog(SpecificFlight flight) // Default access modifier
    {
        this.flight = flight;
    }
}

Cuando no escribes ningún constructor en tu clase, el compilador genera un constructor predeterminado con el mismo modificador de acceso de la clase. Para el siguiente ejemplo, el compilador generará un constructor predeterminado con el public modificador de acceso (igual que la clase).

package flight.booking;

public class FlightLog // Public access modifier
{
    private SpecificFlight flight;
}
 2
Author: Sachin Gorade,
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-01-15 10:57:15

El modificador de acceso predeterminado es package-private (es decir, PREDETERMINADO) y es visible solo desde el mismo paquete.

 1
Author: Piyush Bhardwaj,
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
2013-04-23 09:26:52

¿Está protegido el modificador de acceso de este constructor o paquete?

Creo que implícitamente su modificador de acceso de constructores sería el modificador de acceso de su clase. como su clase tiene acceso público, constructor tendría acceso público implícitamente

 0
Author: PermGenError,
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
2013-04-23 08:50:23

Modificador de acceso predeterminado - Si una clase no tiene modificador (el predeterminado, también conocido como paquete-privado), es visible solo dentro de su propio paquete (los paquetes se denominan grupos de clases relacionadas).

 0
Author: Atiq,
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-04-21 05:38:06

No, no puede llamar al nivel de acceso predeterminado al otro paquete. Pero usted tiene el acceso dentro del paquete. Siga este enlace para más detalles.

 0
Author: Hariprasath,
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-01-15 11:00:33

De un libro llamado OCA Java SE 7 Programmer I :

Los miembros de una clase definidos sin usar ningún acceso explícito los modificadores se definen con la accesibilidad del paquete (también llamada predeterminada accesibilidad). Los miembros con acceso al paquete solo son accesibles a clases e interfaces definidas en el mismo paquete.

 0
Author: BERGUIGA Mohamed Amine,
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-01-15 11:04:43