Modificadores de acceso en Java.
En el lenguaje de programación Java existen palabras reservadas que son modificadores de acceso a los miembros de la clase. Modifican quien tiene acceso a los miembros dentro de una jerarquía de clases. En este artículo describo el uso y el alance de estos modificadores.

Créditos de fotografía de portada: marcos mayer en Unsplash
Encapsulamiento.
Quiero empezar esta entrada con un poco de información sobre el principio de encapsulamiento.:
Es el ocultamiento del estado o de los datos miembro de un objeto de manera que sólo se pueda cambiar mediante las operaciones definidas para ese objeto
Wikipedia
El encapsulamiento es uno de los pilares de la Programación Orientada a Objetos, y siempre es recomendable su uso, pues a través de él, podemos definir el alcance y visibilidad de cualquier atributo o método de una clase, con un enfoque de POO.
¿Cuáles son los miembros de una clase?.
En un artículo anterior te he mostrado una introducción a la Programación Orientada a Objetos, en donde puedes consultar los conceptos básicos de este paradigma si es que aún no estás familiarizado con él. Sólo recuerda que los miembros de una clase son las propiedades o atributos de una clase. Dicho de otra forma menos técnica, son las variables en donde guardarás los datos de los objetos que se construyan a partir de la clase.
¿Qué son los modificadores de acceso?.
Básicamente, un modificador de acceso es una palabra clave en Java que indica quien tiene derecho a acceder a los miembros de una clase.
Proporcionan un mecanismo para favorecer el encapsulamiento, mientras a la vez protegen a los miembros de accesos y/o modificaciones no deseadas.
Los modificadores también juegan un papel importante en la herencia, estableciendo que propiedades se pueden heredar, y cuáles no.
¿Cuáles son los modificadores de acceso?.
Java proporciona cuatro tipos de acceso a los miembros de una clase:
- public
- private
- protected
- default
A continuación, te explico a detalle cada uno de ellos.
Modificador de acceso public.
Como su nombre lo dice, lo declarado como public es público. Este es el nivel de acceso que no protege a los miembros de la clase. En este nivel de acceso:
- Una clase, propiedad, método, constructor o interfaz declaradas como public pueden ser accedidos desde cualquier otra clase.
- Todos los métodos y variables públicas de una clase, son heredadas por sus subclases.
- No existen restricciones en el acceso a los miembros de una clase.
- Incluso se pueden usar los miembros de una clase que está en otro paquete.
Para ejemplificar el uso de éste modificador, observa la siguiente clase, que define una variable y un método público, y que pertenece a un paquete diferente al que se encuentra el programa principal.
/* * d.CodinGames.com * Una clase con miembros públicos */ package otropaquete; /** * @author Gaby Nieva - d.codinGames.com */ public class A { public int unaVariable; public void mostrarVariable(){ System.out.println("El valor de unaVariable es: " + this.unaVariable); } }
Ahora, observa el uso de la variable desde el método main de la clase principal:
/* * d.CodinGames.com * Programa para ejemplificar el uso de los modificadores de acceso */ package proyectomodificadores; import otropaquete.*; /** * @author Gaby Nieva - d.CodinGames.com */ public class ProyectoModificadores { public static void main(String[] args) { A objetoA = new A(); objetoA.unaVariable = 10; objetoA.mostrarVariable(); } }
Del ejemplo anterior, resalto lo siguiente:
- Observa cómo la clase A se encuentra en el paquete llamado otropaquete
- Para que main pueda utilizar la clase A, debe importar otropaquete, cómo puedes ver en la línea 7: import otropaquete.*;
- Debido a que unaVariable está declarada con acceso público, main puede modificar directamente su valor a través del operador punto, lo que sucede en la línea 16. Por directamente me refiero a que no es necesario usar un setter para asignarle un valor.
- El método mostrarVariable también es público, por lo que main también lo puede invocar sin problema, como te muestro en la línea 17.
Entonces, como puedes deducir, el acceso a un miembro público requiere el uso del operador punto, de la siguiente manera:
nombreObjeto.nombreMiembro = valor;
Modificador de acceso private.
Como su nombre lo indica, los miembros y los métodos de una clase declarados de esta forma, permanecen privados para las clases externas, y sólo son accesibles dentro de la clase en la que se están declarando. En este nivel de acceso:
- Todos los miembros declarados como private sólo pueden ser accedidos dentro de la clase, pero no fuera de ella.
- Las variables que son declaradas private pueden ser accesadas fuera de la clase sólo si los métodos setter y getters son públicos. Esta regla se cumple aún con clases hijas.
- El modificador de acceso privado es el nivel de acceso más restringido, por lo que ni las clases, ni los constructores pueden ser private, ¡a menos que quieras que nadie pueda usar tu clase 😀 !
- En general, se aconseja utilizar private para declarar variables de una clase, y a los métodos de acceso getters y setters tipo public.
En la figura 1 te muestro un método de una clase hija que intenta utilizar un miembro de su clase padre. El atributo en cuestión se llama nombre, y ha sido declarado con el modificador de acceso private. El error nos está indicando exactamente lo que está pasando: nombre tiene acceso privado en Persona (la clase padre) y por lo tanto no se puede utilizar de esa forma, sino únicamente a través de su settter o getter respectivo.

Modificador de acceso protected.
Este modificador de acceso busca proteger a los miembros declarados de esta forma. No es el nivel de protección más alto que tiene Java. En este nivel de acceso:
- Las variables, métodos y constructores que son declarados protected en una superclase pueden ser accedidos solo por las subclases en otro paquete o cualquier clase dentro del paquete de la clase con los miembros protegidos.
- El acceso protegido les da a las clases hijas la oportunidad de usar el método o variable mientras que a su vez lo protege de que clases no relacionadas traten de acceder a ellos.
- Los miembros protected de una superclase sólo están accesibles para la superclase, la subclase y otras clases del MISMO PAQUETE.
- Este modificador de acceso no puede ser aplicado a clases e interfaces, sólo a miembros y métodos.
Observa el siguiente ejemplo. La clase A es la clase padre de B, y ambas se encuentran en el paquete otropaquete.
/* * d.CodinGames.com * La clase padre de B */ package otropaquete; /** * @author Gaby Nieva - d.codinGames.com */ public class A { public int unaVariable; protected int otraVariable; public void mostrarVariable(){ System.out.println("El valor de unaVariable es: " + this.unaVariable); } }
El atributo de A llamado otraVariable ha sido declarado como protected. Por esa razón, B puede utilizarlo directamente y modificar su valor como si estuviera declarado en B. Eso se realiza en un método que también tiene acceso protegido llamado modificarOtraVariable.
/* * d.CodinGames.com * Una clase hija de A */ package otropaquete; /** * * @author Gaby */ public class B extends A{ protected void modificarOtraVariable(){ this.otraVariable = 18; } }
La clase principal ProyectoModificadores está en un paquete diferente, llamado proyectomodificadores (línea 7). En el método main se declaran dos objetos, uno de la clase A y otro de la clase B. El atributo unavariable tiene acceso público, eso ya lo habíamos discutido arriba. Pero el método modificarOtraVariable tiene acceso protegido, y como B está en otro paquete, no puede ser accedido, de ahí que se presente el error que observas en la figura 2.
/* * d.CodinGames.com * Programa para ejemplificar el uso de los modificadores de acceso */ package proyectomodificadores; import otropaquete.*; /** * @author Gaby Nieva - d.CodinGames.com */ public class ProyectoModificadores { public static void main(String[] args) { A objetoA = new A(); B objetoB = new B(); objetoA.unaVariable = 10; objetoA.mostrarVariable(); objetoB.modificarOtraVariable(); } }

Modificador de acceso por default.
Cuando no utilizas un modificador de acceso específico (public, private, o protected), Java le asigna uno por default a la variable o método que estés declarando. Este se conoce como el modificador de acceso por defecto o por default. Este nivel de acceso:
- Permite a la clase y a TODAS las clases del mismo paquete acceder a los miembros y/o métodos (semejante a public)
- Pero las clases que no estén en el mismo paquete no podrán acceder a los miembros y/o métodos
Es un error común olvidar escribir el modificador de acceso al declarar una variable o definir un método. Pero de esa manera sin querer le estarás dando acceso a todas las clases del paquete y eso no necesariamente es bueno.

Recuerda que al estar trabajando con el paradigma Orientado a Objetos debe uno buscar aprovechar las ventajas que éste te ofrece, por lo que mi recomendación sería siempre utilizar private a no ser que necesites un tipo de acceso diferente. Y por favor, no olvides escribir explícitamente el modificador que requieras.
Si te pareció interesante el artículo, no olvides compartirlo en tus redes sociales.
¡Hasta la próxima entrada!