Modificadores De Acceso
Modificadores de acces
En Java, los modificadores de acceso se utilizan para establecer la visibilidad de las clases, métodos y atributos. Estos modificadores permiten controlar qué partes del código pueden acceder a estos elementos, promoviendo la encapsulación y protegiendo los datos de accesos no deseados.
Existen cuatro modificadores de acceso en Java:
- public
- private
- protected
- default (sin especificar modificador)
A continuación, te explico cada uno de estos modificadores con ejemplos:
1. public
El modificador public hace que el elemento (clase, método o atributo) sea accesible desde cualquier clase dentro del mismo proyecto o incluso desde proyectos externos si la clase es parte de una biblioteca.
Características:
- Puede ser accedido desde cualquier clase, incluso desde otras clases fuera del paquete.
- No hay restricciones en su acceso.
Ejemplo de uso del modificador public:
public class Persona {
public String nombre;
public void saludar() {
System.out.println("Hola, mi nombre es " + nombre);
}
}
public class Main {
public static void main(String[] args) {
Persona persona = new Persona();
persona.nombre = "Juan"; // Se accede directamente a la variable pública
persona.saludar(); // Llamada al método público
}
}
Salida esperada:
Hola, mi nombre es Juan
En este caso, tanto el atributo nombre como el método saludar() son públicos y accesibles desde cualquier parte del código, incluso desde la clase Main que está en otro lugar.
2. private
El modificador private restringe el acceso a la misma clase en la que está definido. Esto significa que el elemento marcado como private no puede ser accedido desde fuera de la clase, ni siquiera por las clases que heredan de ella.
Características:
- Solo es accesible dentro de la misma clase.
- Se utiliza para proteger los atributos y métodos de ser modificados o accedidos directamente desde otras clases.
Ejemplo de uso del modificador private:
public class Persona {
private String nombre; // Atributo privado
private void mostrarNombre() { // Método privado
System.out.println("Mi nombre es " + nombre);
}
public void setNombre(String nombre) {
this.nombre = nombre; // Método público para modificar el nombre privado
}
public void obtenerNombre() {
mostrarNombre(); // Llamada al método privado desde dentro de la clase
}
}
public class Main {
public static void main(String[] args) {
Persona persona = new Persona();
// persona.nombre = "Juan"; // ERROR: no se puede acceder directamente al atributo privado
persona.setNombre("Juan"); // Se accede al atributo privado a través de un método público
persona.obtenerNombre(); // Llamada al método público que llama al privado
}
}
Salida esperada:
Mi nombre es Juan
En este caso, el atributo nombre y el método mostrarNombre() son privados, por lo que no pueden ser accedidos directamente desde la clase Main. En cambio, se utiliza el método setNombre() para modificar el valor de nombre y obtenerNombre() para llamar al método privado mostrarNombre().
3. protected
El modificador protected permite que el elemento sea accesible dentro de la misma clase, dentro del mismo paquete y también por subclases (clases que heredan de la clase con el modificador protected), incluso si estas subclases están en un paquete diferente.
Características:
- Es accesible dentro de la misma clase y dentro del mismo paquete.
- También es accesible desde subclases, aunque estén en paquetes diferentes.
Ejemplo de uso del modificador protected:
public class Animal {
protected String nombre;
protected void hacerSonido() {
System.out.println("El animal hace un sonido.");
}
}
public class Perro extends Animal {
public void ladrar() {
nombre = "Perro"; // Acceso al atributo protected desde la subclase
hacerSonido(); // Llamada al método protected desde la subclase
System.out.println("El perro ladra.");
}
}
public class Main {
public static void main(String[] args) {
Perro perro = new Perro();
perro.ladrar(); // Llamada a un método protegido desde la subclase
}
}
Salida esperada:
El animal hace un sonido.
El perro ladra.
En este ejemplo:
- La clase
Perrohereda deAnimaly puede acceder a los atributos y métodos marcados comoprotecteden la clase base (Animal). nombreyhacerSonido()son accesibles dentro de la subclasePerroaunque estén en diferentes paquetes (si fuera el caso), pero no serían accesibles fuera de la jerarquía de clases o fuera del paquete sin la relación de herencia.
4. default (sin modificador)
En Java, cuando no se especifica un modificador de acceso, el valor predeterminado es default o paquete-privado. Esto significa que el acceso al elemento está limitado a clases dentro del mismo paquete. Es como si se usara protected dentro del paquete, pero sin extenderse a clases fuera de este.
Características:
- Es accesible solo desde otras clases dentro del mismo paquete.
- No es accesible fuera del paquete, ni desde clases que heredan de la clase.
Ejemplo de uso del modificador default (sin modificador):
public class Animal {
String nombre; // Modificador default
void hacerSonido() { // Modificador default
System.out.println("El animal hace un sonido.");
}
}
public class Perro {
public void ladrar() {
Animal animal = new Animal();
animal.nombre = "Perro"; // Accede al atributo default porque está en el mismo paquete
animal.hacerSonido(); // Llama al método default porque está en el mismo paquete
System.out.println("El perro ladra.");
}
}
public class Main {
public static void main(String[] args) {
Perro perro = new Perro();
perro.ladrar(); // Accede a los miembros default de Animal
}
}
Salida esperada:
El animal hace un sonido.
El perro ladra.
En este caso, la clase Perro está en el mismo paquete que Animal, por lo que puede acceder tanto al atributo nombre como al método hacerSonido() aunque estos no tengan un modificador de acceso explícito (es decir, están usando el modificador default). Si Main estuviera en otro paquete, no podría acceder a estos elementos.
Resumen de los modificadores de acceso
| Modificador | Visibilidad | Uso típico |
|---|---|---|
public |
Accesible desde cualquier parte del código (mismo paquete o externo) | Cuando necesitas que una clase, método o atributo sea accesible desde cualquier lugar del programa. |
private |
Solo accesible dentro de la misma clase | Para ocultar datos internos y proteger el estado del objeto, garantizando que solo se puedan modificar mediante métodos controlados. |
protected |
Accesible dentro del mismo paquete y desde subclases (incluso en otros paquetes) | Cuando quieres que un método o atributo sea accesible dentro de la misma clase, subclases y dentro del mismo paquete. |
default |
Accesible sólo dentro del mismo paquete | Utilizado cuando se desea permitir el acceso solo dentro del paquete sin exponer el elemento fuera de él. Es el modificador por defecto. |