Modificadores de acceso public, protected, default y private en Java. Encapsulamiento en Java

Los modificadores de acceso nos introducen al concepto de encapsulamiento. El encapsulamiento busca de alguna forma controlar el acceso a los datos que conforman un objeto o instancia, de este modo podríamos decir que una clase y por ende sus objetos que hacen uso de modificadores de acceso (especialmente privados) son objetos encapsulados.

Los modificadores de acceso permiten dar un nivel de seguridad mayor a nuestras aplicaciones restringiendo el acceso a diferentes atributos, métodos, constructores asegurándonos que el usuario deba seguir una "ruta" especificada por nosotros para acceder a la información.

Es muy posible que nuestras aplicaciones vayan a ser usadas por otros programadores o usuarios con cierto nivel de experiencia; haciendo uso de los modificadores de acceso podremos asegurarnos de que un valor no será modificado incorrectamente por parte de otro programador o usuario. Generalmente el acceso a los atributos se consigue por medio de los métodos get y set, pues es estrictamente necesario que los atributos de una clase sean privados.

Nota: Siempre se recomienda que los atributos de una clase sean privados y por tanto cada atributo debe tener sus propios métodos get y set para obtener y establecer respectivamente el valor del atributo.

Nota 2: Siempre que se use una clase de otro paquete, se debe importar usando import. Cuando dos clases se encuentran en el mismo paquete no es necesario hacer el import pero esto no significa que se pueda acceder a sus componentes directamente.

Veamos un poco en detalle cada uno de los modificadores de acceso

Modificador de acceso private

El modificador private en Java es el más restrictivo de todos, básicamente cualquier elemento de una clase que sea privado puede ser accedido únicamente por la misma clase por nada más. Es decir, si por ejemplo, un atributo es privado solo puede ser accedido por lo métodos o constructores de la misma clase. Ninguna otra clase sin importar la relación que tengan podrá tener acceso a ellos.

	
package aap.ejemplo1;
public class Ejemplo1
{
	private int atributo1;//Este atributo es privado
	private int contador = 0; //Contador de registro

	//Si un atributo es privado podemos crear método get y set ...
	//... para éste y permitir el acceso a él desde otras instancias

	public void setAtributo1(int valor)
	{
		contador++;//Contador que lleva el registro de ediciones del atributo1
		atributo1 = valor;//Establecemos el valor del atributo
	}

	public int getAtributo1()
	{
		return atributo1;//Retornamos el valor actual del atributo
	}
	
	//Get para el contador
	public int getContador()
	{
		return contador;
	}
	//Notar que no ponemos un set, pues no nos interesa que el contador pueda ser cambiado.
}
	

En el ejemplo anterior vemos lo que mencioné al comiendo, tenemos un atributo privado y permitimos el acceso a él únicamente por medio de los métodos de get y set, notemos que estos métodos son públicos y por tanto cualquiera puede accederlos. Lo realmente interesante con los métodos get y set es que nos permiten realizar cualquier operación como por ejemplo llevar una cuenta de la veces que se estableció el valor para el atributo permitiéndonos mantener nuestro sistema sin problemas. También debemos notar que debido a que los métodos get y set son propios de la clase no tienen problemas con acceder al atributo directamente.

El modificador por defecto (default)

Java nos da la opción de no usar un modificador de acceso y al no hacerlo, el elemento tendrá un acceso conocido como defaulto acceso por defecto que permite que tanto la propia clase como las clases del mismo paquete accedan a dichos componentes (de aquí la importancia de declararle siempre un paquete a nuestras clases).

	
package aap.ejemplo2;
public class Ejemplo2
{
	private static int atributo1;//Este atributo es privado
	static int contador = 0; //Contador con acceso por defecto

	public static void setAtributo1(int valor)
	{
		contador++;//Contador que lleva el registro de ediciones del atributo1
		atributo1 = valor;//Establecemos el valor del atributo
	}

	public static int getAtributo1()
	{
		return atributo1;//Retornamos el valor actual del atributo
	}
}
	
	
package aap.ejemplo2;
public class Ejemplo2_1
{
    public static int getContador()
    {
            return Ejemplo2.contador;//Accedemos directamente al contador desde otra clase
    }
}
	

Modificador de acceso protected

El modificador de acceso protected nos permite acceso a los componentes con dicho modificador desde la misma clase, clases del mismo paquete y clases que hereden de ella (incluso en diferentes paquetes). Veamos:

	
package aap.ejemplo3;

public class Ejemplo3
{
    protected static int atributo1;//Atributo protected
    private static int atributo2; //Atributo privado
    int atributo3;//Atributo por default
    
    public static int getAtributo2()
    {
        return atributo2;
    }
}
	
	
package aap.ejemplo3_1;

import aap.ejemplo3.Ejemplo3;//Es necesario importar la clase del ejemplo 3

public class Ejemplo3_1 extends Ejemplo3
{
    public static void main(String[] args)
    {        
        //La siguientes dos líneas generan error, pues atributo2 es privado y atributo 3 es default
        //System.out.println(atributo2);
        //System.out.println(atributo3);
        
        System.out.println(atributo1);//Sí tenemos acceso a atributo1
    }
}
	

Modificador public

El modificador de acceso public es el más permisivo de todos, básicamente public es lo contrario a private en todos los aspectos (lógicamente), esto quiere decir que si un componente de una clase es public, tendremos acceso a él desde cualquier clase o instancia sin importar el paquete o procedencia de ésta.

	
package aap.ejemplo4;

public class Ejemplo4
{
    public static int atributo1; //Atributo publico
    
    public static void metodo1()
    {
        System.out.println("Método publico");
    }
}

	
	
package paquete.externo;

import aap.ejemplo4.Ejemplo4; //importamos la clase del ejemplo4

public class ClaseExterna
{
    public static void main(String[] args)
    {
        System.out.println(Ejemplo4.atributo1);
        //Tuvimos Acceso directo por ser publico

        Ejemplo4.metodo1(); //Metodo1 también es publico
    }
}
	

A continuación y ya para finalizar, pondré una pequeña tabla que resume el funcionamiento de los modificadores de acceso en Java.

Modificador La misma clase Mismo paquete Subclase Otro paquete
private No No No
default No No
protected Sí/No No
public

Debo aclarar algo en el caso del modificador de acceso protected y el acceso desde suclases. Es un error común pensar que se puede crear un objeto de la clase madre y luego acceder al atributo con acceso protected sin problemas, sin embargo esto no es cierto, puesto que el modificador protected lo que nos permite es acceder al atributo heredado desde el ámbito de la clase hija y no directamente. Sé que esto es un poco confuso así que te invito a ver el video explicativo al final de esta sección para quedar más claros.

Eso ha sido todo en esta sección, no te olvides de dejar tus comentarios y de suscribirte a nuestras redes sociales para estar al tanto de las novedades en el sitio.

La última actualización de este artículo fue hace 1 año