Modificadores de acceso

Publicado el 28 de Septiembre, 2021
Java Programación Orientada a Objetos
¿Qué es la programación?
Tiempo de lectura aproximado: 15 minutos.
En este artículo vamos a explicarte qué son los modificadores de acceso y para qué son utilizados. Además, te compartiremos la funcionalidad que tiene cada uno de ellos.

Los modificadores de acceso son aquellas palabras reservadas que nos permiten especificar la accesibilidad de un miembro o un tipo. Estos pueden ser variables, métodos, clases, entre algunos otros. Con ellos, podemos definir el nivel de visibilidad y accesibilidad que tendrán dentro del programa.

Son la base de la encapsulación en la Programación Orientada a Objetos para restringir el acceso a los miembros de las clases, evitando el mal uso de las propiedades.

¿Cuáles son los modificadores de acceso?

En Java tenemos 4: public, private, protected y package.

public

El modificador de acceso public, permite que los miembros sean accesibles desde cualquier parte del programa, este es el menos restrictivo.

En algunas definiciones, este es el modificador de acceso por defecto. Puede ser aplicado en clases, clases anidadas, métodos, propiedades y constructores.

Te compartimos un ejemplo de su uso:

                            
    public class Ejemplo {
        public String instagram = "@codigazosit";

        public void mostrarInstagram() {
            System.out.println("Síguenos en " + instagram);
        }
    }
                            

También, los métodos definidos en las interfaces son por defecto públicos, aunque no sea declarado explícitamente, los siguientes dos ejemplos representan lo mismo.

                            
    interface MiInterface {
        public void saludar();
    }
                            
                            
    interface MiInterface {
        void saludar();
    }
                            

Un comportamiento similar ocurre en los constructores por defecto de nuestras clases, que también es público.

                            
    public class MiClase {
        public MiClase() {
            //Instrucciones
        }
    }
                            

private

Caso contrario a public, el modificador de acceso private es el más restrictivo de todos. Únicamente permite la visualización de los miembros dentro de la clase en la cual fueron definidos. Si alguna otra clase intenta acceder a ellos, generará un error de compilación, ya que no son visibles.

Este debe de ser declarado explícitamente con la palabra reservada private, ya que no hay miembros que por defecto se declaren como privados.

                            
    public class Ejemplo { 
        private Integer numeroPrimo = 11;
    }
                            

De esta forma, la variable numeroPrimo solamente puede ser accedida desde la clase Ejemplo.

Una restricción del lenguaje con respecto al modificador de acceso private, es que no es posible declarar clases privadas a menos que se encuentren dentro de otra clase:

                            
    public class Ejemplo { 
        private Integer numeroPrimo = 11;

        private class Ejemplo2 {
            //Instrucciones
        }
    }
                            

Los métodos definidos en las interfaces tampoco pueden ser declarados con private.

Además, existe un comportamiento particular cuando declaramos constructores como privados. Al hacerlo, no es posible crear instancias de la clase a través de ese constructor.


    public class Persona {
        private String nombre;
        private Integer edad;
    
        private Persona() {
            //No es posible crear instancias con este constructor privado
        }
    
        public Persona(String nombre, Integer edad) {
            this.nombre = nombre;
            this.edad = edad;
        }
    }                            
                            

protected

Este modificador de acceso nos permite darle visibilidad a los miembros que se encuentren dentro del mismo paquete y a las subclases (incluso si las subclases están en otro paquete).

De la misma forma que private, debe ser definido explícitamente y puede ser aplicado a propiedades, métodos, constructores y clases anidadas.


   package common;

   public class Funciones {
   
       protected Funciones() {
           // Solamente se pueden crear instancias en clases
           // que se encuentren en el mismo paquete (en este caso: common)
       }
   
       protected Double sumar(Double x, Double y) {
           return x + y;
       }
   }                   
                            

Si queremos acceder al método sumar() desde una clase hija, será posible si está definido con protected.


    package main;
    
    import common.Funciones;

    public class Operadores extends Funciones {

        public Double sumar(Double x, Double y) {
            return super.sumar(x, y);
        }
    }                    
                            

Puedes notar que los paquetes donde se encuentran ambas clases son diferentes.

Los métodos abstractos pueden ser declarados como protected, algo que en las interfaces no es posible.


    abstract class Animal {
        protected abstract void comer();
    }                          
                            

package

Este modificador de acceso es el que se declara por defecto cuando no definimos uno explícitamente, también es conocido como default o default package.

Su funcionalidad es muy similar a la de protected, con la diferencia de que package no puede acceder a los miembros heredados.

Un miembro tiene este modificador de acceso en el momento en el que no definimos alguno de los otros tres (salvo en los cuales public es el declarado por defecto).

Puede ser aplicado a propiedades, clases, métodos, constructores y clases anidadas.


    class Animal {
        // Creamos una clase sin modificador de acceso, por lo cual toma default 
        // y es visible desde el mismo paquete.

        //Creamos una variable que es accesible desde el mismo paquete en el que se encuentre la clase.
        String nombre;

        //Creamos un método que es accesible desde el mismo paquete en el que se encuentre la clase.
        void comer() {
            //Instrucciones
        }

        // Definimos una clase anidada que es accesible desde el mismo paquete en
        // el que se encuentre la clase padre.
        class Alimentos {
            //Propiedades, métodos, etc.
        }
    }                          
                            

Conclusión

Cada modificador de acceso tiene un uso diferente como hemos visto, utilizarlos adecuadamente en base a nuestras necesidades nos facilitará darle mantenimiento a nuestras aplicaciones y a darles un uso adecuado a los miembros para los cuales fueron creados.

No olvides visitar nuestra cuenta de Instagram @codigazosit

Te compartimos el post de este artículo por si tienes alguna duda o comentario.

Instagram Post: Modificadores de acceso

¡Muchas gracias por tu visita!

Encuéntranos en nuestras redes
Donaciones