modificadores acceso java access-specifier

acceso - java access modifiers



Diferencia entre el especificador de acceso predeterminado y el especificador de acceso protegido en Java (4)

Estaba intentando aprender java y cuando pasé por los especificadores de acceso tenía una duda, ¿cuál es la diferencia entre el predeterminado si no se especifica ninguno y el especificador de acceso protegido?


Especificador de acceso protegido: hay dos formas de acceder a los datos protegidos

  1. Los miembros de datos protegidos y los métodos protegidos de una clase serán visibles para las otras Clases si residen en el mismo paquete.

  2. Utilizando la herencia

    significa que podemos usar los datos protegidos de esa clase al heredar esa clase.

Especificador de acceso predeterminado: solo una forma de acceder a los datos predeterminados

El valor predeterminado restringe el acceso solo al nivel del paquete, incluso después de ampliar la clase que tiene miembros de datos predeterminados, no podremos acceder.

Ejemplo

Para verificar que no haya una palabra clave protegida por defecto para int x en Providected, se generará un error de tiempo de compilación.

1. SuperClass package nee.superclass; public class ProvideProtected { protected int x=800; } 2.Subclass package nee.subclass; import nee.superclass.*; public class AccessProtected extends ProvideProtected { public void accessProtected() { System.out.println(x); } public static void main(String[] args) { AccessProtected obj=new AccessProtected(); obj.accessProtected(); } }


Este tutorial Java puede ser de alguna utilidad para usted.

Modifier | Class | Package | Subclass | World public | Y | Y | Y | Y protected | Y | Y | Y | N no modifier | Y | Y | N | N private | Y | N | N | N


Modificador de acceso protegido: - Cualquier cosa marcada como protegida es visible dentro del mismo paquete y también visible en la subclase.

Acceso predeterminado: - El valor predeterminado no es una palabra clave. Se aplica cuando no se especifica ningún modificador de acceso. Es básicamente un modificador de nivel de paquete. Cualquier cosa que tenga tal acceso es visible en el mismo paquete.

Ahora la diferencia se puede explicar mejor con la ayuda de un ejemplo.

paquete p1

public class A { protected void fn() { } }

paquete p1

public class B { A a1 = new A(); a1.fn();// fn() is visible inside the same package } }

Ahora llegamos a una subclase en un paquete diferente.

paquete p2

public class D extends A { void test() { A a1 = new new A(); //a1.fn() --> would give compilation error fn(); super.fn(); } }

fn(), super.fn() no dará un error.

Entonces, la diferencia está en la subclase a la que no se puede llamar el método a través de la referencia de una superclase. Puede llamarlo directamente o usar super.

Tenga en cuenta que super.fn() debe ser una parte del método no estático.


El especificador protected permite el acceso a todas las subclases de la clase en cuestión, cualquier paquete en el que residan, así como a otros códigos en el mismo paquete. El especificador predeterminado permite el acceso por otro código en el mismo paquete, pero no por el código que está en las subclases que residen en paquetes diferentes. Ver la sección 6.6 de la especificación del lenguaje Java .

EDITAR: a solicitud de Michael Schmeißer (para que otros no tengan que leer los comentarios o seguir un enlace para encontrar esto): todos los miembros de las interfaces son implícitamente públicos. Es, de hecho, un error en tiempo de compilación para especificar cualquier especificador de acceso para un miembro de la interfaz que no sea public (aunque no hay ningún especificador de acceso en todos los valores predeterminados al acceso público). Aquí está el conjunto completo de reglas de JLS para los miembros de la clase (consulte el enlace anterior para conocer las reglas de los paquetes, las clases e interfaces de nivel superior y las matrices):

Un miembro (clase, interfaz, campo o método) de un tipo de referencia (clase, interfaz o matriz) o un constructor de un tipo de clase es accesible solo si el tipo es accesible y se declara que el miembro o constructor permite el acceso:

  • Si el miembro o el constructor se declara público, entonces se permite el acceso.

  • Todos los miembros de las interfaces son implícitamente públicos.

  • De lo contrario, si el miembro o el constructor se declaran protegidos, entonces el acceso solo se permite cuando se cumple una de las siguientes condiciones:

  • El acceso al miembro o al constructor ocurre dentro del paquete que contiene la clase en la que se declara el miembro o constructor protegido.

  • El acceso es correcto como se describe en §6.6.2 . (Esta cláusula se refiere a las reglas que permiten que las clases derivadas accedan a miembros protegidos de superclases; §6.6.2 comienza: "Se puede acceder a un miembro protegido o constructor de un objeto desde fuera del paquete en el que se declara solo por el código que es responsable de la implementación de ese objeto ". Luego se desarrolla sobre eso.)

  • De lo contrario, si el miembro o el constructor se declara privado, entonces se permite el acceso si y solo si ocurre dentro del cuerpo de la clase de nivel superior ( §7.6 ) que encierra la declaración del miembro o constructor.

  • De lo contrario, decimos que hay acceso predeterminado, que se permite solo cuando el acceso se produce desde el paquete en el que se declara el tipo.