Fundamentos de Java — Parte IV

Clases y Objetos

Alan Badillo Salas
Full Stack Java
4 min readSep 7, 2018

--

El concepto de Clase se refiere a abstaer un sistema, mecanismo o entidad mediante el modelado de Artibutos y Métodos. Cuando definimos una clase debemos pensar en cuáles son los atributos y métodos que van a representar una entidad. Los atributos se refieren a los elementos que describen al objeto, es decir, al estado interno de la entidad, por ejemplo, si tenemos una entidad Persona para un sistema de ventas quizás propongamos atributos como nombre, edad, peso, dirección, teléfono, etc. Sin embargo, si hablamos de la entidad Persona pero para un sistema gubernamental quizás propongamos atributos más descriptivos incluyendo su fecha de nacimiento, su CURP, su INE, estado civil, etc. Entonces los atributos de una entidad que serán modelados a través de la clase dependerán del tipo de sistema y lo que se desee almacenar. En cuánto a los métodos, nos referimos a un conjunto de funciones propios de la entidad que tienen acceso a los atributos del objeto. Piense por ejemplo, en una entidad llamada Venta, la cual tienen atributos propios de una venta en nuestro sistema como, fecha, monto, etc. Sin embargo, a dicha entidad además le queremos proporcionar funcionalidad como registrar una venta, validar un monto, cancelar la venta, etc. Esta funcionalidad se va a programar en la clase mediante métodos, y todas las instancias de la clase (los objetos) tendrán acceso a dicha funcionalidad, para realizar las tareas correspondientes sobre la entidad.

Vamos a ver un ejemplo de una clase definida para la entidad Robot, la cual posee atributos para ubicarse dentro de un plano 2D y métodos que le proporcionan la funcionalidad para desplazarse. Revisa bien los métodos y atributos.

Observa que hemos declararo la clase Robot2D al igual que otras clases anteriores, sin embargo está clase no tiene punto de entrada (no es ejecutable). La clase define tres atributos double x, double y, y double a los cuales representan el estado interno del robot. Los atributos no fueron explícitamente asignados, por lo que su valor inicial será el valor por defecto de sus primitivos (cero doble 0d). Cuándo los atributos son primitivos, estos se inicializarán en el valor por defecto y cuando son complejos se inicializarán a null. También podemos ver que se han definido tres métodos public void avanzar(double d), public void girarIzquierda(double w) y public void girarDerecha(double w). Dichos métodos realizan la funcionalidad indicada en los comentarios, observa que accedemos a los atributos del objeto mediante this.x, this.y y this.a (se puede acceder sin this explícitamente, pero no es una buena práctica).

Pruebas Unitarias y Clases Auto-Ejecutables

Las clases que contienen un punto de entrada dónde se instancian a sí mismas para comprobar que su funcionalidad sea correcta se consideran Clases Auto-Ejecutables. Sin embargo, cuándo creamos otra clase que define el punto de entrada con funcionalidad para crear instancias de otras clases para comprobar su funcionalidad, entonces dichas clases se conocen como Pruebas Unitarias. Vamos a modificar la clase Robot2D para agregar un punto de entrada que realice pruebas unitarias mediante una instancia del robot e imprimiendo su posición después de aplicarle algunos giros y desplazamientos. Revisa el código cuidadósamente para predecir que valor se va a a imprimir y cómo antes de ejecutarlo en el repl. Nota que la clase Main funciona como Prueba Unitaria para la clase Robot2D.

Observa que en el repl hemos definido dos clases, la clase Main por defecto y la clase Robot2D. La clase Main tiene un punto de entrada dónde crea una instancia del robot mediante Robot2D robot = new Robot2D(), de esta forma se reserva un nuevo contexto de memoria en el heap para todo el espacio que necesite la clase (al menos lo de sus tres variables atributo). En este momento podemos advertir que un Objeto es una Instancia de una Clase. Después se manda a ejecutar el método avanzar del objeto robot y se imprime el valor de sus atributos, desupés se llaman a otros métodos y se imprimen los resultados. Si se revisa correctamente la salida del programa se puede observar que se manda a avanzar al robot 10 pasos en dirección de su ángulo que inicialmente es cero, por lo que llegará a la posición (10, 0), luego se girará al roboto a la izquierda (en el sentido contrario a las manecillas del reloj) 90 grados o Pi/2 radianes y nuevamente avanzando 10 pasos, ahora llegando al punto (10, 10), finalmente se gira al robot a la derecha (en el sentido de las manecillas del reloj) 90 grados nuevamente y avanzando otros diez pasos llegando al punto final (20, 10).

Ahora con el concepto de clase puedes empezar a modelar entidades y checar si su funcionalidad es correcta mediante pruebas unitarias. Resuelve los siguientes problemas para desarrollar tus habilidades de modelado.

Problema 1. Crear la clase Persona sólo con los atributos necesarios (considera los elementales).

Problema 2. Crear la clase Automóvil con los atributos necesarios y un método llamado public void prender() que modifique un atributo llamado encendido a true.

Problma 3. De la clase anterior modifica el método prender() para que mande un mensaje Trono socket porque ya está encendido si es que se manda a llamar al método prender cuando el atributo encendido es true.

Problema 4. Crea una clase llamada Calculadora que no tenga atributos, sólo los métodos para hacer la suma, resta, multiplicación y división entre dos números. Los métodos tienen que devolver un double y recibir ambos operadores.

Problema 5. Modifica la clase Robot2D para implementar los métodos public void cuadrado(double l) y public void pentagono(double l) los cuales deben hacer que el robot haga un recorrido en un cuadrado o pentágono de lado l e imprime cada vértice para comprobar que sea correcto (debe regresar al punto de inicio).

--

--

Alan Badillo Salas
Full Stack Java

L. Matemáticas Aplicadas UAM-Cuajimalpa. M. en Inteligencia Artificial IPN-CIDETEC. Desarrollador Full Stack MEAN/MERN. Data Scientist.