Modificadores de acceso en Java: public, private y default

Modificadores de acceso en Java: public, private y default

Llegamos a la parte de Encapsulación en la programación orientada a objetos. En concreto, te voy a mostrar con ejemplos, como funcionan los modificadores de acceso public, private y default de Java.


¿Qué es el encapsulamiento?

El encapsulamiento es un principio de diseño de software que se aplica a muchos lenguajes de programación y no solo a Java. En programación en general, el encapsulamiento se refiere a la idea de ocultar los detalles de implementación de una clase o componente detrás de una interfaz pública, con el fin de proteger la integridad de los datos y facilitar el mantenimiento y la reutilización del código.

Seguramente, esto no te diga gran cosa, de modo, que vamos a ver como podemos utilizar el encapsulamiento en Java con sus modificadores de acceso.

¿Qué son los modificadores de acceso de Java?

Los modificadores de acceso son palabras clave que se utilizan para controlar el alcance de una clase, un método, una variable o un constructor. En Java, existen cuatro modificadores de acceso:

  • public.
  • private.
  • protected.
  • default(sin modificador o private-package).

En este capítulo, vas a ver ejemplos con los modificadores public, private y default. El modificador protected lo dejo para otro capítulo, cuando tratemos el tema de la herencia de clases, ya que están ampliamente ligados.

El modificador de acceso public de Java

El modificador de acceso public de Java se utiliza para indicar que un método o un campo de una clase es accesible desde cualquier lugar del código. Es decir, que es público.

Por ejemplo, si queremos que el campo nombre de la clase Usuario sea accesible desde cualquier lugar del código, podemos declararlo como public:

class Usuario {
    public String nombre;
    String apellidos;
    int edad;
    String direccion;
    String telefono;
}

En este ejemplo, el atributo nombre es public. El resto, al no especificar ningún modificador de acceso, quedan en valor default o default-package, al igual que ocurría con las clases.

Eso significa, que el campo nombre, puede ser accedido hasta fuera de su paquete. En cambio, el resto, son accesibles en otras clases pertenecientes al paquete.

Hagamos una prueba desde un archivo que está fuera del paquete.

Si intento modificar el campo nombre asignándole otro valor, puedo hacerlo:

import paquetePruebas.Usuario;

public class Main {
    public static void main(String[] args) {
        //Instancias de Usuario
        Usuario usuario1 = new Usuario("Juan", "Pérez García", 32, "Av. del Pacífico, 23", "+34-91-000-0000");
        usuario1.nombre = "Gabriel";

        //Llamada al método de uno de los objetos
        usuario1.mostrarDatos();  // se llama al método mostrarDatos del objeto usuario2

    }
}

Resultado en la consola

Nombre: Gabriel
Apellidos: Pérez García
Edad: 32
Dirección: Av. del Pacífico, 23
Teléfono: +34-91-000-0000

Primero se llamaba Juan y ahora se llama Gabriel.

En cambio, si intento modificar un campo como la edad que está en modo default, no me dejará.

import paquetePruebas.Usuario;

public class Main {
    public static void main(String[] args) {
        //Instancias de Usuario
        Usuario usuario1 = new Usuario("Juan", "Pérez García", 32, "Av. del Pacífico, 23", "+34-91-000-0000");
        usuario1.edad = 22;

        //Llamada al método de uno de los objetos
        usuario1.mostrarDatos();  // se llama al método mostrarDatos del objeto usuario2

    }
}

Error en la consola

java: edad is not public in paquetePruebas.Usuario; cannot be accessed from outside package

El error dice que el campo edad no es público y que no puede ser accedido desde fuera del paquete.

El modificador de acceso default de Java

El modificador de acceso private-package, también conocido como default o default-package, como habrás deducido por el apartado anterior, deja las variables, métodos, clases… con un acceso solo permitido para el propio paquete. Por lo tanto, si tengo un paquete llamado paquetePruebas, que tiene varios archivos Java. Todos los elementos que lleven ese modificador, serán accesibles solo desde ese mismo paquete.


Este modificador, como he indicado en otras ocasiones, se asigna por defecto si no indicamos un modificador de acceso.

El modificador de acceso private de Java

El modificador de acceso private es mucho más restrictivo, ya que solo permite que los elementos a los que se le aplica, sean accesibles y modificables desde la propia clase. En ningún sitio más. Incluso si la clase desde la que se intenta acceder está en el mismo archivo o paquete.

Por ejemplo, el campo nombre, es privado. Dentro de la clase, puedo acceder a dicho campo, y modificarlo sin problemas.

package paquetePruebas;

public class Usuario {
    //Atributos
    private String nombre;
    String apellidos;
    int edad;
    String direccion;
    String telefono;

    public void cambiaValor(){
        nombre = "Andrea";
    }

En cambio, si lo intento desde otra, aunque esté en el mismo archivo…

En este ejemplo, supongamos que tenemos solo el archivo PruebaAcceso en la raíz. Nada más. Tenemos el campo nombre como privado en la clase Usuario.

En la clase PruebaAcceso, instancio un objeto de Usuario con unos valores iniciales, incluido el nombre. En este momento, si que puedo acceder desde fuera al campo privado, gracias al método constructor que está dentro de la propia clase.

Esto demuestra, que podemos crear objetos y con los campos privados fuera de la propia clase, pero una vez instanciados, se volverán constantes desde fuera de esa clase.

En la línea 31, intento modificar el valor del campo nombre, me da error. Incluso si intento, aunque sea solo utilizar un print() para ver su valor en la consola.

class Usuario {
    //Atributos
    private String nombre;
    String apellidos;
    int edad;
    String direccion;
    String telefono;

    // constructor de la clase
    public Usuario(String nombre, String apellidos, int edad, String direccion, String telefono) {
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.edad = edad;
        this.direccion = direccion;
        this.telefono = telefono;
    }

    //Método para mostrar la información del objeto
    public void mostrarDatos() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Apellidos: " + apellidos);
        System.out.println("Edad: " + edad);
        System.out.println("Dirección: " + direccion);
        System.out.println("Teléfono: " + telefono);
    }
}

public class PruebaAcceso {
    public static void main(String[] args) {
        Usuario usuario = new Usuario("Juan", "Pérez García", 32, "Av. del Pacífico, 23", "+34-91-000-0000");
        usuario.nombre = "Andrea";
    }
}

Error en la consola

java: nombre has private access in Usuario

El error dice: el campo nombre tiene acceso privado en la clase Usuario.

El modificador de acceso private, se emplea con el fin de proteger la integridad de la información y evitar que se modifiquen los datos de manera inesperada.

Todo el temario del curso Java aquí.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

logo css Entrada anterior Sintaxis de los estilos CSS
php mysql bootstrap Entrada siguiente Las variables de PHP