Taller de Programación Java Programación orientada a objeto TECNOLOGÍAS DE LA INFORMACIÓN Y COMUNICACIÓN Director de Escuela/ Marcelo Lucero Yáñez ELABORACIÓN Experto disciplinar / Edgard Cárcamo Diseñador instruccional / Evelyn Aguilera VALIDACIÓN Experto disciplinar / Sergio Rivera Jefa de diseño instruccional y multimedia / Alejandra San Juan Reyes DISEÑO DOCUMENTO Didactic Taller de Programación Java / Programación orientada a objeto 2 Contenido Criterio de evaluación: .......................................................................................................... 4 1. CONCEPTO DE CLASE Y OBJETO ............................................................................ 4 1.1. CLASE ......................................................................................................................... 5 1.1.1. CARACTERÍSTICAS DE UNA CLASE. ......................................................................... 6 1.1.2. CARACTERÍSTICAS DE UN OBJETO. ......................................................................... 7 1.1.2.1. ATRIBUTOS: TIPOS DE DATOS Y VALORES POR DEFECTO ..................................... 8 1.1.2.2. OPERACIONES: OPERADORES Y EXPRESIONES. .................................................. 11 EJEMPLIFICACIÓN ................................................................................................................. 14 2. PRINCIPIOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS. ........................ 15 2.1. ABSTRACCIÓN......................................................................................................... 15 2.2. POLIMORFISMO ....................................................................................................... 15 2.3. ENCAPSULAMIENTO................................................................................................ 16 2.4. HERENCIA ................................................................................................................ 17 EJEMPLIFICACIÓN ................................................................................................................. 18 Taller de Programación Java / Programación orientada a objeto 3 Criterio de evaluación: • Construyen clases de objetos a aplicando principios fundamentales de la programación orientada a objetos, de acuerdo a necesidades utilizando UML 1. CONCEPTO DE CLASE Y OBJETO Para comenzar nos remontaremos un poco atrás en el tiempo, en los primeros modelos de programación estos se desarrollaban de manera estructurada, esto quiere decir que el código de las aplicaciones se escribía de manera lineal y secuencial, sin embargo era un tanto complejo adaptarse a este tipo de programación ya que no se asemejaba mucho a la realidad, es por esto que nace la programación orientada a objetos, como una necesidad de acercar la programación al mundo real. Ahora bien, para explicar paradigma de la programación orientada a objetos diremos que nuestro mundo, o todo lo que conocemos, está compuesto de entidades u objetos, como pueden ser: el automóvil, la lavadora, el televisor o el teléfono, entre muchos otros. El paradigma de programación orientado a objetos (POO) provee las abstracciones necesarias para poder construir sistemas de información o Software de una forma más cercana a esta percepción del mundo real. Figura 1 Programación Orientada a Objetos Taller de Programación Java / Programación orientada a objeto 4 Cuando desarrollamos una aplicación en base a la programación orientada a objetos esta nos permite analizar la aplicación o problema descomponiéndola en unidades individuales las cuales son los objetos, sin embargo para poder crear objetos estos requieren primero ser definidos indicando cuáles serán sus características y que es lo que podrán realizar. 1.1. CLASE La definición de los objetos es conocida como clase, podemos pensar en los objetos como casas, las cuales tienen ciertas medidas, formas, colores, ventanas, puertas, etc. sin embargo, no podemos construir una casa sin primero definir cómo será la casa, cuáles serán sus medidas y todas las características que esta poseerá, para esto se define el plano de la casa, lo que equivale a la clase del objeto y al igual que un plano de una casa en donde desde un plano se pueden construir muchas casas, desde una clase se pueden construir muchos objetos que mantengan las características que se definieron en la clase. Por ejemplo, piense que está intentando construir una aplicación para dibujar figuras geométricas. El programa debe ser capaz de dibujar y pintar triángulos con diferentes formas, tamaños y colores, para esto lo primero que debemos realizar es construir la clase triangulo, la que definirá cuáles serán las características que compartirán los triángulos y que acciones podrán realizar estos, en este caso la clase triangulo debiese tener las siguientes características: - lado A, lado B y lado C, mientras que lo que podría hacer es pintar el triángulo de algún color especifico. Teniendo nuestra clase definida podemos crear tantos objetos como queramos, por ejemplo crearemos dos triángulos, uno será un triángulo equilátero al cual le daremos 3cm en cada uno de sus lados y lo pintaremos de rojo, mientras que al otro triangulo le daremos 5cm en el lado A y B, mientras que en lado C le daremos 8cm y lo pintaremos verde, esto nos dará como resultado dos objetos a partir de la clase triángulo, esto quiere decir que tendremos dos Triángulos que comparten las mismas características pero que sus valores son distintos entre sí. Figura 2 Representación gráfica de los objetos. Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java Taller de Programación Java / Programación orientada a objeto 5 Para resumir, una clase puede definirse como un tipo de datos, cuyas variables son objetos o instancias de una clase. También, puede decirse que el concepto de clase es estático y el concepto de objeto es dinámico; ya que, sólo este (el objeto) sólo existe en tiempo de ejecución. Cada objeto de una clase comparte con el resto las operaciones, y a la vez, posee sus propios valores para los atributos que posee: su estado. Las operaciones, también llamados métodos, se usarán tanto para cambiar el estado de un objeto, como para comunicar objetos entre sí mediante el paso de mensajes. 1.1.1. CARACTERÍSTICAS DE UNA CLASE. Como se mencionó anteriormente, las clases son las plantillas para hacer objetos. Por lo tanto, una clase servirá para definir una serie de objetos con propiedades (atributos), comportamientos (operaciones o métodos) y semántica común. Entonces, se debe pensar en una clase como un molde. A través de las clases se obtienen los objetos. Es decir, antes de poder utilizar un objeto se debe definir la clase a la que pertenece, es por esto que a continuación veremos de que se componen las clases y como las podemos representar. Las clases se componen de: • Atributos: son las características que poseerán los objetos, por ejemplo si estuviésemos definiendo un automóvil sus características serían: color, peso, largo, ancho, etc. debemos tener en cuenta que cuando definimos las clases solo se indican las características sin asignar aun valores a estas, en otras palabras en la clase se define por ejemplo la característica color pero no se indica cual es el color en específico ya que esto se define al crea al objeto. • Métodos: las funciones miembro de la clase. Son las acciones (u operaciones) que puede realizar la clase. El diseño de clases se realiza a través de un Diagrama de Clases con notación UML. Figura 3 Clase en notación UML Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java Taller de Programación Java / Programación orientada a objeto 6 Ahora bien, la representación de la clase Triángulo que se utilizó como ejemplo con la abstracción expuesta sobre sus atributos y métodos en notación UML sería: Figura 4 Clase Triángulo en notación UML. Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java De acuerdo con la figura 3, el nombre de la clase sería Triángulo, sus atributos: ladoA, ladoB, ladoC, color y sus métodos: dibujar() y pintar(). Cabe indicar que los atributos que contendrá la clase deben poseer algún tipo de dato que indique qué valores aceptará y qué operaciones se podrá realizar sobre él. En este caso los lados serían tipo numérico, por lo que solo aceptarían números y operaciones matemáticas con ellos, mientras que el color sería texto, por lo que aceptará caracteres sin posibilidad de aplicar operaciones matemáticas sobre él. También diremos que los métodos son las operaciones o acciones que puede realizar la clase por medio de algún algoritmo de programación, el cual podría necesitar valores de entrada (como argumentos) y devolver – o no -- un valor de salida. En este caso los métodos serian pintar y dibujar. 1.1.2. CARACTERÍSTICAS DE UN OBJETO. Un objeto es cualquier entidad representable en un programa. Un objeto en un sistema posee: una identidad, un estado y un comportamiento. El estado marca las condiciones de existencia del objeto dentro del programa. Lógicamente este estado puede cambiar. Un automóvil puede estar detenido, en marcha, en desperfecto, funcionando, sin gasolina, entre otros. El comportamiento determina como responde el objeto ante peticiones de otros objetos. Por ejemplo, un objeto conductor puede lanzar el mensaje arrancar a un automóvil. El comportamiento determina qué es lo que hará el objeto. La identidad determina que cada objeto es único aunque tengan el mismo valor. No existen dos objetos iguales. Lo que sí existe es dos referencias al mismo objeto. Los objetos se manejan por referencias, existiendo una referencia a un objeto, de modo que esa referencia permitirá cambiar los atributos del objeto. Incluso puede Taller de Programación Java / Programación orientada a objeto 7 haber varias referencias al mismo objeto, de modo que si una referencia cambia el estado del objeto, el resto (lógicamente) mostrarán esos cambios. Los objetos por valor son los que no usan referencias, y por el contrario, usan copias de valores concretos. En Java estos objetos son los tipos de datos primitivos: int, char, byte, short, long, float, double y boolean. El resto son todos objetos (incluidos los arrays y Strings). Ahora hablaremos de la visibilidad de los atributos y métodos de un objeto. Tanto los atributos como los métodos de un objeto pueden tener dos tipos de visibilidad: público o privado. Esto indica si los atributos y métodos serán solo accesibles dentro del mismo objeto o si serán accesibles desde otros objetos. Un objeto se podría representar como dos circunferencias, una interna que permanece oculta al mundo exterior y que contendría todos los detalles de la implementación del objeto, y otra circunferencia concéntrica externa, que representa lo que el objeto muestra al mundo exterior y le permite utilizar para interactuar con él. Figura 5 Representación de un objeto. Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java 1.1.2.1. ATRIBUTOS: TIPOS DE DATOS Y VALORES POR DEFECTO Ahora que ya sabemos lo que es una clase, un objeto y de que se componen entonces veremos cómo se definen estas partes de la clase. Un atributo es una propiedad o característica de una clase que almacena datos de una clase u objeto dependiendo del momento en que se les utilice. Entonces, se puede decir también que las variables son los contenedores de los datos que utiliza un programa. Cada variable ocupa un espacio en la memoria RAM del computador para almacenar un dato determinado. En el lenguaje de programación Java, las variables tienen un nombre o identificador que sólo puede contener letras, números y el carácter de subrayado. El nombre puede contener cualquier carácter Unicode, sin embargo no pueden contener espacios ni comenzar por un número. Taller de Programación Java / Programación orientada a objeto 8 El programador tiene libertad para elegir el nombre de los atributos, los métodos y de otros elementos de un programa. Existen reglas muy estrictas sobre los nombres que se utilizan como identificadores de clases, atributos o de métodos. Todo identificador debe empezar con una letra que puede estar seguida de más letras o dígitos. Una letra es cualquier símbolo del alfabeto y el carácter ‘_’ (guión bajo). Un dígito es cualquier carácter entre ‘0’ y ‘9’. Los identificadores Triángulo, color, ladoA, ladoB, sumaLados son válidos. El identificador 1lado no sería válido porque empieza con un dígito y no con una letra. Cualquier identificador que empiece por una letra seguida de más letras o dígitos es válido siempre y cuando no forme parte de las palabras reservadas del lenguaje de programación Java. Java distingue entre letras mayúsculas y minúsculas, esto significa que los identificadores sumaLados y sumalados son distintos. Existen unas normas básicas para los identificadores en Java que se deben respetar: • Los nombres de atributos o variables y métodos empiezan siempre con minúsculas. Si se trata de un nombre compuesto la primera palabra debe comenzar por minúscula y las siguientes deben comenzar con mayúscula ejemplo: apellidoPaterno, apellidoMaterno • Los nombres de clases empiezan siempre con mayúsculas. En los nombres compuestos, cada palabra comienza con mayúscula y no se debe utilizar el guión bajo para separar las palabras. Por ejemplo, Triangulo, Isósceles, o TriánguloRectángulo son nombres válidos. • Los nombres de constantes en Java se escriben mayúsculas. Para nombres compuestos se utiliza el guión bajo para separar las palabras. Por ejemplo, PI, LADO, IVA, TOTAL_LADOS son nombres válidos. Java es un lenguaje de programación fuertemente tipado porque cada tipo de datos (como entero, carácter, hexadecimal, decimal, entre otros) está predefinido como parte del lenguaje y todas las constantes o variables definidas para un programa debe describirse con uno de los tipos de datos. En Java existen dos categorías de tipos de datos: 1. Primitivos. (int, char, boolean, entre otros) 2. Objeto (tipos creados por el programador) Los tipos de datos primitivos en Java son valores únicos ya que ellos no tienen capacidades (tamaños) especiales. Java soporta 8 tipos de datos primitivos: Taller de Programación Java / Programación orientada a objeto 9 Figura 6 Tipos de datos primitivos en Java. Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java Los tipos de datos primitivos se pueden organizar en 4 grupos: 1. Numéricos enteros: byte, short, int y long. Los 4 representan números enteros con signo. 2. Carácter: char representa un carácter codificado en el sistema Unicode. Los valores de este tipo de datos siempre deben estar rodeados por comillas simples. 3. Numérico decimal: float y double representan números decimales en coma flotante. 4. Lógicos: boolean es el tipo de dato lógico; los dos únicos valores posibles que puede representar un dato lógico son true y false. true y false son palabras reservadas de Java. Por otro lado, están los tipos de datos objeto u Object que son los creados por el programador En esta categoría se integra el tipo String que posee propiedades y métodos, donde el lenguaje de programación Java permite definir un nuevo objeto con el delimitador de comilla doble (“), por lo que se puede concatenar (unir) texto utilizando el operador (+) con los nombres de los objetos de tipo String y las porciones de texto delimitados con (“). Las palabras reservadas o claves del lenguaje de programación Java (Java Language Keywords) se muestran en la siguiente figura (para la versión del JDK 8): Taller de Programación Java / Programación orientada a objeto 10 Figura 7 Palabras clave del lenguaje de programación Java. Fuente: The Java™ Tutorials (https://docs.oracle.com) 1.1.2.2. OPERACIONES: OPERADORES Y EXPRESIONES. Los programas de computador realizan numerosas operaciones aritméticas y matemáticas de diferente complejidad; en esta sección se mostrará la forma en la que el lenguaje de programación Java usa operadores y expresiones para resolver dichas operaciones. Los operadores fundamentales que utiliza son: • Aritméticos, lógicos y relacionales. • De manipulación de bits. • Condicionales. • Especiales. Java también analiza las conversiones de tipos de datos (cast) y las reglas que seguirá el compilador cuando diferentes tipos de operadores concurren en una misma expresión; tales reglas se conocen como prioridad y asociatividad. Los programas en Java constan de datos, sentencias de programas y expresiones, estas últimas normalmente representan una ecuación o fórmula matemática; por ejemplo: 2*ladoIgual+lado; en la que los símbolos más y producto (+, *) son los operadores de suma y producto; el número 2 y las variables ladoIgual y lado son los operandos; en síntesis, una expresión es una secuencia de operaciones y operandos que especifica un cálculo. Taller de Programación Java / Programación orientada a objeto 11 Cuando se utiliza el operador + entre números o variables se le llama operador binario debido a que suma dos números. Otro tipo de operador en Java es el unitario o unario, que actúa sobre un único valor; si la variable x vale 5, -x equivaldrá -5; el signo negativo (-) indica la resta del operador unitario. Java soporta un amplio conjunto de operadores unitarios, binarios y de otros tipos. El operador = asigna el valor de la expresión que se encuentra en la parte derecha a la variable de la izquierda; por ejemplo: lado = 8; celsius = 28; coordX = 525; coordY = 725; La tabla 1 contiene los cinco operadores de asignación adicionales (signo igual “=”) y que Java proporciona; éstos actúan como una notación abreviada para expresiones que se utilizan con frecuencia; por ejemplo: si se desea multiplicar 2 por i, se puede escribir: i = i * 2; Java proporciona un operador abreviado de asignación (*=) que realiza una asignación equivalente: i *= 2; equivale a i = i * 2; Figura 8 Tabla 1 Tipos de operadores de asignación adicionales en Java. Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java Los operadores aritméticos en Java sirven para realizar procedimientos matemáticos básicos y siguen las reglas algebraicas típicas de jerarquía o prioridad que especifican la precedencia de dichas operaciones. Por ejemplo, al considerar la siguiente expresión: x + t * 2 De acuerdo con las reglas citadas, la multiplicación se realiza antes que la suma; por consiguiente, la expresión anterior equivale a: x + (t * 2) Taller de Programación Java / Programación orientada a objeto 12 En Java, como en la mayoría de los lenguajes, las expresiones dentro del paréntesis se evalúan primero; después se realizan los operadores unitarios, seguidos por los operadores de multiplicación, división, resto, suma y resta. Se puede observar que cuando + y - se utilizan delante de otro operador, actúan como unitarios más y menos. +27 //27 significa que es positivo -9 //9 significa que es negativo En las siguientes tablas: 2 y 3, se muestran los “operadores aritméticos” y la “precedencia de operadores matemáticos básicos”: Figura 9 Tabla 2 Operadores aritméticos en Java. Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java Figura 10 Tabla 3 Precedencia de operadores matemáticos básicos en Java. Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java Nota: En el siguiente enlace de The Java™ Tutorials puede revisar en detalle todos los operadores admitidos en Java versión JDK 8: Taller de Programación Java / Programación orientada a objeto 13 EJEMPLIFICACIÓN A continuación, te invitamos a revisar el siguiente caso en donde se explican las clases y sus componentes: Un restaurant de comida típica chilena desea automatizar la manera de ingresar la reserva de mesas, permitiendo con esto que los clientes puedan realizar reservas online por medio de su sitio web. Para poder dar solución a este desafío lo primero que se pide es determinar que clases son las que participaran de este proceso, al llevar a cabo un análisis de lo requerido se obtienen las siguientes clases: Figura 11 Clases Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java Al analizar las clases obtenidas podemos determinar la siguiente información: - Existen 3 clases distintas las cuales son: Mesa, Reserva y Cliente. - La clase Mesa posee los atributos: número el cual recibe valores numéricos, capacidad que también recibe valores numéricos, piso que es del mismo tipo de datos que los anteriores y estado (del tipo boolean por lo que su valor puede ser true o false). - La clase mesa posee los métodos realizarMantencion() y habilitar() - La clase Cliente posee los atributos correo, nombre y apellido, los cuales son del tipo carácter, mientras que el teléfono es numérico sin decimales. - La clase Cliente posee los métodos realizarReserva() y anularReserva() - La clase Reserva posee como atributos un número que identifica cada reserva como única, la fecha y la hora de la reserva. Además, si nos detenemos un poco en la mesa y el cliente, podemos ver que estos atributos no son de tipo primitivo, sino del tipo de datos de las otras clases que se obtuvieron. - Los métodos de la clase Reserva son ingresarReserva y anularReserva - También podemos darnos cuenta que todos los atributos de las tres clases poseen un signo negativo antes de su nombre lo que indica que su Taller de Programación Java / Programación orientada a objeto 14 visibilidad es privada, mientras que los métodos de las tres clases poseen un signo + antes de su nombre, lo que indica que son públicos. 2. PRINCIPIOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS. 2.1. ABSTRACCIÓN Es una característica de los seres humanos o la propiedad que considera los aspectos más significativos o esenciales de un problema y define una solución en esos mismos términos. Es la etapa crucial de representación de la información en relación con la interfaz y el usuario; se representa con un tipo definido por el usuario, con el diseño de una clase que implementa la interfaz correspondiente. Por lo tanto, una clase en Java u otros lenguajes es un elemento que traduce una abstracción a un tipo definido por el usuario y combina representaciones de datos y métodos para manipular esa información en un paquete o librería. La abstracción posee diversos grados denominados niveles; éstos ayudan a estructurar la complejidad intrínseca que poseen los sistemas del mundo real; en el análisis de un sistema hay que concentrarse en qué hace y no en cómo lo hace. El principio de la abstracción es más fácil de entender con una analogía del mundo real; por ejemplo: supongamos que necesitamos comprar un computador, si vamos nosotros a buscar el computador nos fijaremos en características como el procesador, la memoria ram, la tarjeta gráfica y el almacenamiento, sin embargo, si enviamos a nuestra madre a comprar el computador, aunque se encuentre frente a los mismos computadores ella se enfocara en otras características como el precio, el color y si trae alguna impresora de regalo, esto es la abstracción poder enfocarse en atributos específicos de un objeto para representarlo según el contexto en el cual se vaya a utilizar. 2.2. POLIMORFISMO Es la propiedad que le permite a una operación o función tener el mismo nombre en diferentes clases y actuar de modo distinto en cada una de ellas; por ejemplo: se puede abrir una puerta, una ventana, un libro o un cuaderno; en cada caso se realiza una acción diferente. Entonces, cada clase conoce cómo realizar esa operación. En POO, el concepto de polimorfismo implica la capacidad de una operación de ser interpretada sólo por el propio objeto que lo invoca; desde un punto de vista Taller de Programación Java / Programación orientada a objeto 15 práctico de ejecución del programa, el polimorfismo se realiza en tiempo de ejecución, ya que durante la compilación no se conoce qué tipo de objeto, y por consiguiente, cuál operación fue invocada. Ahora bien, en la vida real hay numerosos ejemplos de polimorfismo: piense que en una serviteca o taller mecánico de automóviles existen diferentes marcas, modelos, cilindrada, tipo de combustible, entre otros, que constituyen una clase. Entonces, se necesita realizar una operación típica como cambiar el aceite; ésta es la misma, los principios de trabajo son iguales, sin embargo, dependiendo del auto en particular, la operación cambiará e incluirá diferentes acciones. En el lenguaje de programación Java, esta característica facilita la implementación de varias formas de un mismo método, con los cual se puede acceder a varios métodos distintos que tienen el mismo nombre. Existen dos tipos principales de polimorfismo, que son: 1. Por reemplazo: es cuando existen en dos o más clases diferentes métodos con el mismo nombre, pero haciéndolo de forma diferente. 2. Por sobrecarga: es el mismo nombre de método utilizado varias veces, ejecutándolo de diferente forma y diferenciándose por el argumento o parámetro en tipo y en cantidad. 2.3. ENCAPSULAMIENTO En POO, el encapsulamiento o encapsulación significa reunir en cierta estructura todos los elementos que en determinado nivel de abstracción, se pueden considerar de una misma entidad, y considera el proceso de agrupamiento de datos y operaciones relacionadas bajo una misma unidad de programación, lo que aumenta la cohesión de los componentes del Software. En este caso, los objetos que poseen las mismas características y comportamiento se agrupan en clases que son unidades de programación que encapsulan datos y operaciones; esto quiere decir que la encapsulación oculta lo que hace un objeto de lo que hacen otros objetos del mundo exterior, por lo que se denomina también ocultación de datos. Un objeto tiene que presentar una “cara” al mundo exterior, de modo que pueda iniciar operaciones; el televisor tiene un conjunto de botones, que pueden estar en el mismo aparato o incorporados en un control remoto. Una lavadora de ropa tiene un conjunto de mandos e indicadores que establecen la temperatura y el nivel del agua. Los botones del televisor y los mandos de la lavadora constituyen la comunicación con el mundo exterior, que se denominan interfaces. Taller de Programación Java / Programación orientada a objeto 16 En esencia, la interfaz de una clase representa un contrato de prestación de servicios entre ella y los demás componentes del sistema; de este modo, los clientes de un componente sólo necesitan conocer los servicios que éste ofrece y no cómo están implementados internamente. Por consiguiente, se puede modificar la implementación de una clase sin afectar a las restantes relacionadas con ella. Existe una separación entre la interfaz y la implementación: la primera establece qué se puede hacer con el objeto; de hecho, la clase actúa como una caja negra; es estable, la implementación se puede modificar. Otro ejemplo, se puede encontrar en los automóviles: no se necesita conocer el funcionamiento de la caja de cambios, el sistema de frenos o la climatización para que el conductor utilice todos estos dispositivos. 2.4. HERENCIA En la vida diaria se utiliza el concepto de clases divididas en subclases, que conduce al de herencia; por ejemplo: la clase animal se divide en mamíferos, anfibios, insectos, aves, entre otros; la clase vehículo se divide en automóviles, camiones, autobuses, motocicletas, entre otros. A su vez, la clase electrodoméstico se divide en lavadora, refrigerador, tostadora, microondas, y así sucesivamente. La idea principal de estas divisiones reside en el hecho de que cada subclase comparte características con la clase de la cual se deriva. Los automóviles, camiones, autobuses y motocicletas tienen motor, ruedas y frenos; pero, además de estas características compartidas, cada subclase tiene las propias; los automóviles, por ejemplo, pueden tener maletero, cinco asientos; los camiones, cabina y caja para transportar carga, entre otras. La clase principal de la que derivan las restantes se denomina base, padre o superclase; las subclases también se denominan derivadas o hijas. Las clases reflejan que el mundo real contiene objetos con propiedades o atributos y comportamiento; la herencia manifiesta que dichos objetos tienden a organizarse en jerarquías; esta jerarquía, desde el punto de vista del modelado, se denomina relación de generalización o “es-un”. En POO, la relación de generalización se denomina herencia; cada clase derivada hereda las características de la cual es base y además añade sus propias características, atributos y métodos (operaciones). Las clases bases también pueden ser subclases o derivarse de otras superclases. Con esto, el programador puede definir una clase Animal que encapsule todas las propiedades o atributos (altura, peso, número de patas, entre otras) y las Taller de Programación Java / Programación orientada a objeto 17 operaciones o métodos (comer, dormir, andar, entre otros) que pertenecen a cada uno. Los animales específicos como mono, perro, gato o loro tienen a su vez características propias. Como las técnicas de herencia se representan con la citada relación “es-un”, se puede decir que Perro es-un Animal con características propias: ladrar, entre otras; además, comparte con Gato y Loro las características propias de cualquier animal, como saltar, comer, beber, correr, dormir, entre muchas otras. Otro ejemplo basado en la industria del automóvil es el siguiente: la clase caja de cambios hace unos años tenía cuatro marchas adelante y una atrás; posteriormente se incorporó una delantera y en los últimos años ya se comercializan automóviles con seis; también se pueden considerar las cajas automáticas como otra extensión de la clase base. EJEMPLIFICACIÓN A continuación, te invitamos a revisar el siguiente caso en donde se explican los conceptos asociados a los principios de la Programación Orientada a Objetos: Una empresa de rent a car requiere un sistema para automatizar el proceso de arriendo de vehículos, la empresa presta el servicio de arriendo de diferentes tipos de vehículos dentro de los cuales todos comparten las siguientes características, una placa patente, una marca, modelo, color y kilometraje. Además comparten ciertas acciones como es arrendar y devolver. Sin embargo algunos tipos de vehículos poseen ciertas características especiales, como por ejemplo las camionetas poseen la capacidad del pickup, los automóviles poseen el rendimiento en km/lts y los furgones poseen la capacidad de pasajeros. En base a esta información se obtienen las siguientes clases: Taller de Programación Java / Programación orientada a objeto 18 Figura 12 Empresa de rent a car Fuente: Edgard Cárcamo, 2019, para módulo Taller de Programación Java A partir de estas clases las cuales se conectan mediante herencia podemos determinar la siguiente información: - Como camioneta, automóvil y furgón poseían características en común se creó una súper clase llamada vehículo, la cual contiene todos los atributos y métodos en común de las otras clases. - Camioneta, automóvil y furgón heredan de la clase vehículo por lo que las 3 clases poseen los mismos atributos y métodos que la clase vehículo - Cada una de las clases camioneta, automóvil y furgón definen sus propios atributos que los diferencian de las otras clases. - Las tres clases vuelven a definir los métodos arrendar y devolver, esto sucede debido a que el valor de arriendo y las condiciones del arriendo de cada una es distinto, es por esto que las clases deben sobrescribir los métodos de la clase padre, esta sobre escritura es lo que se conoce como polimorfismo - Podemos ver que todos los atributos son privados, esto es para mantener la encapsulación de la clase. Taller de Programación Java / Programación orientada a objeto 19