Java ofrece varios modificadores de acceso y herramientas para controlar qué partes del código son visibles y accesibles desde diferentes clases o paquetes. Comprender esto es crucial para escribir programas seguros, organizados y fáciles de mantener.
1. Modificadores de acceso
Los modificadores de acceso definen quién puede acceder a un atributo, método o clase. Los principales modificadores son:
| Modificador | Alcance/Visibilidad |
|---|---|
public | Accesible desde cualquier clase. |
protected | Accesible desde el mismo paquete y subclases incluso en otros paquetes. |
| (Sin modificador) | Accesible solo desde el mismo paquete (llamado «nivel de paquete»). |
private | Accesible solo dentro de la clase donde se define. |
Ejemplo:
public class Ejemplo {
public int publico; // Visible desde cualquier lugar
protected int protegido; // Visible en el mismo paquete y subclases
int paquete; // Visible solo dentro del paquete
private int privado; // Visible solo en esta clase
}
Uso práctico de cada modificador:
public: Úsalo para métodos y atributos que deben ser accesibles desde cualquier parte, como un método de utilidad.protected: Ideal para proteger detalles de implementación que solo deben ser visibles para las subclases.- Sin modificador: Útil para encapsular funcionalidades dentro de un paquete.
private: Úsalo para atributos que deben mantenerse internos a la clase y ser accesibles mediante métodos (getters y setters).
2. Modificadores adicionales
Además de los modificadores de acceso, Java ofrece modificadores que definen el comportamiento de los miembros de una clase:
static:
Se aplica a atributos o métodos que pertenecen a la clase, no a una instancia específica.
Ejemplo práctico:
public class Matematica {
public static final double PI = 3.14159;
public static double calcularAreaCirculo(double radio) {
return PI * radio * radio;
}
}
public class UsoStatic {
public static void main(String[] args) {
System.out.println(Matematica.calcularAreaCirculo(5));
}
}
final:
Se usa para declarar constantes, métodos que no se pueden redefinir y clases que no se pueden extender.
Ejemplo:
public final class Constante {
public static final String MENSAJE = "Esto es inmutable";
}
abstract:
Declara métodos o clases incompletas que deben ser implementadas por subclases.
Ejemplo:
public abstract class Animal {
public abstract void hacerSonido();
}
public class Perro extends Animal {
@Override
public void hacerSonido() {
System.out.println("Guau guau");
}
}
3. Alcance de variables
El alcance determina dónde se puede usar una variable en el código. En Java, hay tres tipos principales de alcance:
Variables de instancia:
Declaradas dentro de una clase, pero fuera de cualquier método.
Son únicas para cada objeto.
Ejemplo:
public class Persona { String nombre; // Variable de instancia }
public class Persona {
String nombre; // Variable de instancia
}
Variables locales:
Declaradas dentro de un método o bloque.
Solo existen mientras el método o bloque está en ejecución.
Ejemplo:
public void saludar() {
String mensaje = "Hola"; // Variable local
System.out.println(mensaje);
}
Variables estáticas:
Declaradas con static y compartidas por todas las instancias de la clase.
Ejemplo:
public class Contador {
public static int contadorGlobal = 0;
}
4. Buenas prácticas para la visibilidad y alcance
Usa private para atributos:
Protege tus datos internos y proporciónales acceso a través de métodos getters y setters.
Ejemplo:
public class Producto {
private String nombre;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Minimiza el uso de variables estáticas:
Aunque son útiles, pueden causar problemas en programas multihilo si no se gestionan correctamente.
Evita el uso excesivo de public:
Mantén tu código modular y evita exponer detalles innecesarios.
5. Ejemplo práctico completo
public class Vehiculo {
private String marca; // Solo accesible dentro de esta clase
protected int velocidadMaxima; // Visible en subclases
public static int numeroDeVehiculos = 0; // Compartido por todas las instancias
public Vehiculo(String marca, int velocidadMaxima) {
this.marca = marca;
this.velocidadMaxima = velocidadMaxima;
numeroDeVehiculos++;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
public static void mostrarNumeroDeVehiculos() {
System.out.println("Vehículos creados: " + numeroDeVehiculos);
}
}
Resumen
- Los modificadores de acceso controlan la visibilidad de clases, métodos y atributos (
public,protected,private). - Los modificadores adicionales como
static,finalyabstractdefinen comportamientos específicos. - Gestionar correctamente el alcance y la visibilidad es esencial para mantener un código limpio, seguro y escalable.