POO (Programación Orientada a Objetos), public, private y clases en Java - 1

Para entrar al conocido mundo de la programación orientada a objetos en Java se necesita comprender el concepto de clase y sus utilidades. Para esto resaltaremos dos puntos: La definición y su estructura.

1.       En Java, las clases son la base para la programación orientada a objetos (POO). Una clase es una plantilla o modelo que define un conjunto de propiedades y comportamientos comunes que comparten los objetos que se crean a partir de ella.

2.       Para definir una clase en Java, se utiliza la palabra reservada “class”, seguida del nombre de la clase. Dentro de una clase se pueden definir variables, métodos y constructores. Los métodos son funciones que se definen dentro de una clase y se utilizan para realizar operaciones específicas.

Veamos un ejemplo:

Supongamos que has creado una clase llamada "Estudiante" que hace referencia a un estudiante universitario. Para crearla, debes hacer clic derecho en la carpeta "src" ubicada en el "Package Explorer", seleccionar "New" y luego "class".


 (Haz clic en las imágenes si no son muy claras)

Observa que no se marcó la casilla “public static void main(String[] args)”, ya que este método se encuentra en la clase “App” ya creada en posts anteriores. Si no tienes esta clase créala con el método “main” marcando la casilla y luego la clase “Estudiante”.

Luego de creada la clase, debes agregar las características correspondientes del estudiante, como el nombre, universidad y carrera. Puedes hacerlo declarando variables con las características como nombre.


En la imagen se puede observar que las variables se han declarado como tipo "String", lo cual es adecuado dado que se asignarán valores de texto. Sin embargo, es importante notar que se utiliza un modificador llamado “private” que antecede al tipo. Este modificador restringe el acceso a las variables únicamente a la misma clase donde fueron declaradas. Por lo tanto, si desde la clase “App” intentamos acceder a un objeto “Estudiante” y a alguna propiedad con el modificador “private”, no será posible hacerlo. Sin embargo, si llamamos a alguna propiedad dentro de la misma clase “Estudiante”, sí será posible acceder a ella. Este concepto se llama encapsulamiento y es una medida de seguridad que ayuda a prevenir errores y asegura que el código sea más robusto y fácil de mantener en el futuro.

Se accede a la propiedad nombre mediante el uso de “this” y se asigna a un nueva variable “a” sin problemas.


Se instancia la clase “Estudiante” en la clase “App” y se intenta acceder a la propiedad nombre sin éxito.


 La forma correcta de acceder a los atributos o variables de clase es mediante el uso de “getters” y “setters”, lo que significa que debes declarar métodos “get” para acceder a las variables de “Estudiante” desde otra clase, y métodos “set” para asignar un valor a las mismas variables desde otra clase.

Para crear estos métodos, haz clic derecho en la ventana con el código, selecciona “Source” y luego haz clic en “Generate Getters and Setters…”. También puedes utilizar el atajo o “shortcut” “Alt + Shift + s” y en la pequeña ventana hacer clic en “Generate Getters and Setters…”.

Como ya mencioné anteriormente, con los métodos “get” y “set”, podrás acceder a los atributos de la clase “Estudiante de forma segura y controlada evitando el acceso directo a las variables privadas desde una clase externa y es una buena práctica de programación.

Como último consejo de este punto, si tu código no es fácil de leer puedes presionar las teclas “Ctrl + Shift + f” y tu código tendrá un espaciado correcto.


Constructor y métodos.

Hasta ahora, hemos creado una clase “Estudiante” con tres atributos privados para restringir su acceso solo a la misma clase, y también hemos creado los métodos “getter” y “setter” para acceder a estos atributos desde fuera de la clase.

Ahora necesitamos crear un contructor para la clase. Para hacerlo, puedes hacer clic derecho en la ventana del código, seleccionar “Source” y luego “Generate Constructor using Fields…”. Este constructor será útil más adelante, pero asegúrate de generarlo después de la declaración de las variables. Si no está en el lugar correcto, puedes copiarlo y pegarl
o en el lugar adecuado. En la siguiente imagen, el constructor se encuentra a partir de la fila 8.



Para abordar el tema de métodos tomemos como referencia a los “getters” y “setters” de la clase “Estudiante”. Estos tienen el modificador “public”, lo que les permite ser accedidos desde fuera de la clase. En el caso de los “setters”, son de tipo “void”, lo que significa que solo ejecutan el código que está dentro de las llaves “{}”, sin devolver ningún valor. Sin embargo, pese a no devolver valores, es necesario pasarles un valor como argumento o parámetro en el paréntesis del método. En este paréntesis, se especifica el nombre del parámetro y su tipo de dato.



 Como se observa en la imagen el método “setNombre” es un “setter” al que podemos acceder desde fuera de la clase “Estudiante” por ser público. El método recibe un argumento llamado “nombre” que, dentro de las llaves, se asigna a “this.nombre” de la siguiente forma: this.nombre = nombre. La expresión “this.nombre” es la llamada a la variable privada “nombre” de color azul de la clase, lo cual no genera errores porque la ejecución ya no se encuentra fuera de la clase que la contiene sino dentro, y el “igual” le asigna el valor del parámetro “nombre” de color marrón.

Instancia de clase

Sitúate en la clase “App” haciendo doble clic en el archivo “App.java” en el “Package Explorer”. Dentro del método “main()” deberás crear una variable de nombre “estudiante” y tipo de dato “Estudiante” de la siguiente forma:


Ahora debes asignarle un valor de tipo “Estudiante”, pero ¿a qué se refiere esto?

Veamos otro ejemplo para comparar. Si declaramos la variable llamada “vari1” de tipo “String”, debemos agregarle un valor de tipo “String”, es decir, un texto. Si declaramos la variable “num1” de tipo “Integer”, le debemos asignar un valor del tipo correspondiente, que en este caso sería un número. Sin embargo, al declarar la variable llamada ”estudiante” y asignarle el tipo “Estudiante”, debemos asignarle un valor de tipo “Estudiante” que no tenemos. Es aquí donde entra en juego el concepto de instancia de clase. Usando la palabra reservada “new”, podemos utilizar la clase “Estudiante” como una plantilla para crear un objeto de tipo “Estudiante”. 



Sin embargo, aún no acaba la instrucción para instanciar a la clase “Estudiante”, debemos llamar al constructor agregando unos paréntesis. Si revisas la clase “Estudiante” abriendo el archivo “Estudiante.java”, el constructor tiene los siguientes parámetros: nombre, universidad y carrera. Entonces debemos agregar sus valores dentro del paréntesis en el mismo orden.


Al instanciar la clase “Estudiante” se ha creado un objeto de la clase “estudiante”, con todos los atributos y métodos correspondientes. Adicionalmente, por el constructor pasaron los parámetros “Flavio”, “UNFV” y “Física”, de forma que tengamos un objeto con esos valores.

Si estás siguiendo el post y de la mano escribiendo el código, te propongo mostrar lo que has aprendido creando un nuevo objeto llamado “estudiante2” y agregando tu nombre, universidad o alguna institución educativa a la que asistes y carrera respectivamente como parámetros. Para el ejemplo, agregaré “Pepito”, “Universidad FAS”, “Estadística”.




Antes de continuar voy a plantear una analogía. Supongamos que nuestro amigo en común “Monty” tiene dos mascotas: un perro y un gato. Él anota tres características de cada uno como sigue:

            Mascota1:

-          Tipo: perro

-          Nombre: Scrapy

-          Años: 7

 

Mascota2:

-          Tipo: gato

-          Nombre: Pelusa

-          Años: 5

Se ha dado cuenta que si tiene una plantilla para mascotas puede rellenar los campos cada vez que tenga una mascota nueva. de la siguiente forma:

            Mascota:

-          Tipo:

-          Nombre:

-          Años:

Tanto la “mascota1” y “mascota2” son conocidos como objetos o instancias en programación, ya que son entidades que poseen características o atributos, al igual que cualquier otro objeto en nuestro alrededor. Ambos fueron creados a partir de la misma clase (plantilla), llamada “Mascota”, por tanto, tienen las mismas variables, pero sus valores pueden ser iguales o diferentes.

El mismo concepto se aplica a nuestras instancias previas, “estudiante” y “estudiante2”, las cuales también fueron creadas a partir de la misma clase (plantilla) “Estudiante”, y por ende, comparten las mismas variables con valores diferentes.

Para verificar el correcto funcionamiento de nuestro código, es necesario imprimir los nombres de cada estudiante. Para lograrlo, puedes hacer uso de la clase “System” y el método “getNombre()” de cada estudiante, el cual permitirá obtener el nombre de cada una de las instancias de la clase “Estudiante”. Es importante recordar que las instancias fueron creadas a partir de una misma clase, por lo que comparten los mismos métodos, incluyendo el constructor.


Vamos a ejecutar el código. Si no recuerdas como hacerlo, puedes hacer clic derecho sobre la clase “App.java” en el “Package Explorer”, luego seleccionar “Run As” y finalmente hacer clic en “Java Application”.


Como puedes ver los nombres de cada instancia son diferentes, de esta forma puedes crear varios objetos de un mismo tipo. Lo que sucede es que en memoria se asigna un espacio diferente para cada uno, pese a ser del mismo tipo “Estudiante” tienen un identificador diferente. Si deseas ver el identificador, imprime directamente el objeto, no su método “getNombre()”. Este concepto será de gran ayuda cuando tengas realizar cierta lógica con el objeto más adelante.


Constructor sin parámetros

Siguiendo con el ejemplo anterior, abre la clase “Estudiante.java”, copia y pega el constructor, pero borra los parámetros y las instrucciones dentro de las llaves. Procura que este constructor sin parámetros se encuentre justo debajo de las variables y por encima del constructor con parámetros.


Ahora crea instancia nuevamente la clase “Estudiante” con el nombre “estudiante3”, y el paréntesis déjalo vacío, sin parámetros. Verás que no habrá error. 


De esta forma puedes crear un objeto con parámetros específicos, si los agregas en el paréntesis o un objeto limpio con atributos sin valor si dejas vacío el paréntesis. Tienes libertad de crear los constructores con el número de parámetros que creas necesarios para tu proyecto.

Si en este momento imprimes el valor del atributo “nombre” de “estudiante3” llamando al método “getNombre()” no debería mostrarse nada en consola porque no tiene valor.

Vamos a hacer uso del método “setNombre()” y “setUniversidad()”, y luego imprimiremos el sus valores. Para hacerlo agrega la instrucción “estudiante3.setNombre(“Bob”)”. Observa que dentro del paréntesis le pasamos el valor que queremos guardar en el atributo nombre como un parámetro. Eres libre de cambiar el valor si deseas, pero es necesario agregarlo, ya que, el método “setNombre” requiere un parámetro en la clase “Estudiante”. Repite este proceso con el método “setUniversidad()” pasando el valor que prefieras como parámetro y luego imprime los valores usando la clase  “System”. Puedes guiarte de la siguiente imagen.


Si algo no te ha quedado claro aún, vuelve a leer cuantas veces sea necesario. Estos conceptos te sacarán de apuros en un futuro.

Antes de finalizar, me gustaría dejar unas actividades del tema y una específica de Monty.

-        Crea el objeto “estudiante4” con el constructor sin parámetros.

-        Agrega un nombre al “estudiante4”.

-        Agrega una universidad al “estudiante4”.

-        Imprime los valores en consola de nombre y universidad del estudiante 4.

-        Sin borrar nada del código, cambia el nombre del “estudiante4” por “Patricio Estrella”.

-        Imprime nuevamente en consola los valores de nombre y universidad del estudiante 4.

-        Haz cambios en los valores de los atributos de los estudiantes anteriores como se hizo con el estudiante 4.

Como último punto a detallar, te comento que la clase estudiante puede tener como atributo a otra clase. Por ejemplo, Monty ha dejado como tarea que crees la clase Mascota que se comentó líneas arriba y la agregues como atributo de la clase Estudiante. ¿Podrías resolverlo? La solución se verá en la segunda parte de este post.

¡Felicidades! Ya estás un paso más cerca de crear una aplicación con Java.


Comentarios

Entradas populares de este blog

Instalación del IDE Eclipse para Java y JShell

Instalación de java y manejo de versiones