Los modificadores de acceso en Java, algo muchas veces no comprendidos del todo por muchos Java devs, incluso por algunos con algo de experiencia, a pesar de que es uno de los puntos básicos que seguro te van a preguntar en cualquier vacante para programador Java. En esta serie de posts te explicaré los modificadores de acceso que existen y cómo se aplican. Comencemos con los mas sencillos de entender, osea los que se aplican a las clases, los cuales solo son dos:
- public
- default
(NOTA: También se puede “modificar” el acceso a una clase a través de algo llamado Java Modules introducidos a partir de Java 9, pero eso será tema para otro post)
Cuando una clase tiene asignado public cualquier otra clase dentro del proyecto puede acceder a ella. Tomemos como ejemplo las siguientes clase llamadas MiClase1 y MiClase2, en donde ambas vienen de diferentes paquetes (y tambien diferentes archivos, por supuesto) dentro de un proyecto:
// Archivo MiClase1.java
package com.package1;
public class MiClase1{}
// Archivo MiClase2.java
package com.package2;
import com.package1.MiClase1;
public class MiClase2{
public static void main(String[] args){
MiClase1 obj = new MiClase1();
}
}
En este caso, dentro de MiClase2 puedo crear una instancia de MiClase1 sin problemas porque esta ultima tiene el modificador de acceso public. La cosa cambia cuando se trata del modificador default, el cual se expresa sencillamente sin poner ningún modificador, únicamente la clase. A continuación un ejemplito modificando un poco la clase anterior MiClase1:
// Archivo MiClase1.java
package com.package1;
class MiClase1{}
// Archivo MiClase2.java
package com.package2;
import com.package1.MiClase1; // Error aqui
public class MiClase2{
public static void main(String[] args){
MiClase1 obj = new MiClase1();
}
}
Le hemos quitado el public a la definición de la clase MiClase1, por lo cual adoptará el modificador de acceso default. En este caso tendremos un error en la linea 3 de MiClase2, puesto que no es posible hacer un import de MiClase1 dentro de MiClase2. El mensaje de error que te daría seria algo como MiClase1 is not public in com.package1; cannot be accessed from outside package. El modificador de acceso default asignado a una clase hace que dicha clase solo se pueda usar dentro del mismo paquete al que pertenece. Por lo tanto, para que MiClase2 pudiese crear una instancia de MiClase1, tendríamos que mover a MiClase2 al paquete com.package1 de la siguiente manera:
// Archivo MiClase1.java
package com.package1;
class MiClase1{}
// Archivo MiClase2.java
package com.package1;
// import com.package1.MiClase1; Esto ya es opcional
public class MiClase2{
public static void main(String[] args){
MiClase1 obj = new MiClase1();
}
}
Ahora si es posible crear una instancia de MiClase1 dentro de MiClase2. Ademas, podemos omitir el import que tenia anteriormente debido a que ambas clases ahora están en el mismo paquete, ya no se necesita un import.
En resumen, existen dos modificadores de acceso para las clases en Java que son public y default public. El modificador public hace que la clase se pueda ver en todo el proyecto, incluso en paquetes distintos del suyo, y default solo permite usar la clase dentro del paquete al que pertenece.