Programación Orientada A Objetos: Tecnológico Nacional de México Instituto Tecnológico de Nuevo León
Programación Orientada A Objetos: Tecnológico Nacional de México Instituto Tecnológico de Nuevo León
SUBDIRECCIÓN ACADÉMICA
TEMA # 1
Introducción al paradigma de la programación orientada a objetos.
Actividad #2
Subir la práctica de Hola Mundo.
En el mundo real, las personas identifican los objetos como elementos que pueden ser percibidos
por los cinco sentidos; cuentan con propiedades específicas que definen su estado como posición,
tamaño, color, forma, textura, etcétera; además tienen ciertos comportamientos que los hacen
diferentes de otros objetos. Martin y Odell definen un objeto como “cualquier cosa, real o
abstracta, en la que se almacenan datos y aquellos métodos (operaciones) que manipulan los
datos”. Para realizar esa actividad se añaden a cada objeto de la clase los propios datos y los
asociados con sus propios métodos miembro que pertenecen a la clase. Un mensaje es una
instrucción que se envía a un objeto, el cual se ejecutará al recibirlo; incluye el identificador que
contiene la acción a realizar por el objeto junto con los datos que éste necesita para efectuar su
trabajo; los mensajes, por consiguiente, forman una ventana del objeto al mundo exterior. Una vez
que una clase fue definida, un programa puede contener una instancia de la clase, denominada
objeto de la clase; éste se crea con el operador new aplicado a un constructor; por ejemplo, un
objeto de la clase Punto inicializado a las coordenadas. El operador new crea el objeto y devuelve
una referencia al objeto creado; esta referencia se asigna a una variable del tipo de la clase; el
objeto permanecerá vivo siempre que esté referenciado por una variable de la clase que es
instancia. Un objeto es una instancia de una clase; se pueden tener varias instancias de una clase
llamada, por ejemplo, auto; con un Audi rojo, de dos puertas; un Renault azul, de cuatro puertas y
uno todo terreno, verde, de cinco puertas; cada instancia es un objeto al que se puede dar nombre
o dejarlo anónimo y se representa en los diagramas de objetos.
Clases
1.9 Java como lenguaje y plataforma de programación.
Java es un lenguaje de programación de propósito general, posiblemente, uno de los
más populares y utilizados en el desarrollo de programas de software, especialmente
para internet y web; actualmente se encuentra en numerosas aplicaciones, dispositivos,
redes de comunicaciones, etcétera, como: • Servidores web. • Bases de datos
relacionales. • Sistemas de información geográfica (SIG/GIS, Geographical Information
System). • Teléfonos celulares (móviles). • Sistemas de teledetección. • Asistentes
digitales personales (PDA). • Sistemas medioambientales. Pero Java no sólo es un
lenguaje de programación, sino que también constituye una plataforma completa para
el desarrollo de software; posee una biblioteca gigantesca de clases y aplicaciones con
numerosos códigos reutilizables y un entorno de programación que proporciona
servicios tales como seguridad, portabilidad entre sistemas operativos y recolección
automática de basura
1.10.1 Características de Java En C, C++ o Pascal
El compilador traduce el código fuente directamente al lenguaje máquina de su
computadora, entendible por su CPU; estos lenguajes necesitan un compilador
diferente para cada tipo de CPU y en consecuencia, cuando los programas escritos en
estos lenguajes se traducen a código máquina no son portables, de modo que el código
fuente debe ser recompilado para cada tipo de máquina o CPU. Para solucionar este
problema y hacer que los programas de Java sean independientes de la máquina y se
puedan transportar o “portar” fácilmente a otras máquinas y también puedan ejecutarse
en navegadores web, los creadores de Java introdujeron el concepto, citado
anteriormente, de máquina virtual Java y el bytecode como el lenguaje máquina de la
CPU específica, donde la máquina virtual Java los ejecuta o interpreta
2.2 Creación de un programa en Java.
Java tiene dos tipos de programas: aplicaciones y applets. Un applet es un programa
de aplicación que se ejecuta como parte de una página web, se almacena en un sitio
remoto en la misma web, pero se ejecuta en la computadora local del usuario. En el
capítulo 22 profundizaremos en este concepto; mientras tanto, nos centraremos en las
aplicaciones Java que no necesitan formar parte de una página web para ejecutarse.
2.4 Metodología de desarrollo basada en clases
Un método típico para desarrollar software con clases durante la resolución de un problema se
estructura así: 1. Analizar el problema y especificar sus requerimientos. 2. Diseñar las clases
para resolverlo mediante: a) Localización de las clases relevantes que existen en biblioteca. b)
Modificación de las mismas cuando sea necesario. c) Diseño de nuevas clases, si se requiere.
3. Implementación de las clases nuevas y las modificadas. 4. Prueba y verificación del
programa terminado. 5. Mantenimiento y actualización.
Análisis
Implica la identificación del problema considerando las entradas o datos de este, la
salida o resultados deseados y los requerimientos adicionales o restricciones de la
solución. En esta etapa es importante identificar las clases que participarán en la
resolución del problema; si el problema ha sido bien analizado y sus especificaciones
bien definidas, normalmente, la identificación de las clases se deduce de la descripción
del problema y de las especificaciones
Diseño
Requiere analizar las clases existentes reutilizables, identificar las que se deseen
modificar e identificar las que se deben escribir desde el principio. Esta etapa suele ser
la más difícil en el proceso de resolución del problema porque, para cada clase, hay
que reconocer los datos de los que será responsable y los métodos que operarán sobre
los datos.
Implementación
Implica la escritura de las clases definidas en Java y la identificación de las bibliotecas
de clases que se utilizarán directamente o aquellas que se modificarán; también se
debe escribir el código que describa los cambios.
Pruebas
(testing) Una vez terminado y sometido al proceso de compilación y ejecución, el
programa se deberá ejecutar usando diferentes conjuntos de datos para verificar que
funcione de acuerdo con las especificaciones. Existen diferentes tipos de pruebas para
POO, dos de ellas son las unitarias y las de integración; en las primeras se comprueba
la funcionalidad de cada clase de manera individual, mientras que en las segundas se
verifica su funcionamiento correcto.
2.6.4 BlueJ
EDI, que tiene editor integrado, compilador, máquina virtual y depurador para escritura
de programas; también tiene una presentación gráfica para estructuras de clases y
soporta edición de texto y gráficos; además de permitir la creación de objetos
interactivos, pruebas interactivas y construcción de aplicaciones incrementales.
Resumen.
1.- • El proceso de resolución de un problema mediante una computadora consta de las
siguientes etapas: análisis del problema, diseño del algoritmo, codificación,
compilación, ejecución, verificación y pruebas, mantenimiento y documentación.
2.- Un algoritmo es un proceso de resolución de problemas paso a paso con el que se
obtiene una solución en un tiempo finito.
3.- Los dos enfoques básicos de programación más utilizados son: programación
estructurada y programación orientada a objetos.
4.- En diseño y programación estructurada, un problema se divide en subproblemas
menores; cada uno de ellos se resuelve para, a continuación, integrar las soluciones.
5.- En diseño y programación orientada a objetos se identifican elementos que, a su
vez, son instancias o componentes de las clases; un programa orientado a objetos es
una colección de objetos que interactúan entre sí.
6.- Las clases son las plantillas o modelos de datos a partir de las cuales se crean o
instancian objetos
7.- Los objetos representan elementos del mundo real y se generan como instancias o
ejemplares de las clases.
8.- Un intérprete es un programa que lee y traduce cada instrucción en bytecode al
lenguaje máquina de la computadora y a continuación lo ejecuta.
9.- Los entornos de desarrollo facilitan el proceso de creación y ejecución de
programas en Java; los entornos de desarrollo integrados o EDI (IDE, por sus siglas en
inglés) más conocidos y utilizados en enseñanza
10.- Sun (ahora Oracle) ofrece un kit de desarrollo en Java; su última versión hasta julio
de 2010 es JDK 6 update 21
11.- Para ejecutar un programa Java, en primer lugar se debe traducir a un lenguaje
intermedio denominado bytecode para después interpretarlo en el lenguaje máquina
específico. Bytecode es el lenguaje máquina para la JVM (Java virtual machine).
12.- • La máquina virtual Java (JVM) es una supuesta computadora que permite a los
programas ser independientes de la máquina, lo que facilita la portabilidad de los
programas fuente entre diferentes tipos de computadoras.
Java proporciona un grupo de clases que almacenan secuencias de objetos de cualquier tipo: las colecciones; éstas se
diferencian en la forma de organizar los objetos y, en consecuencia, en la manera de recuperarlos.
La clase Vector se encuentra en el paquete java.util y es una de estas colecciones, tiene un comportamiento similar a un
arreglo unidimensional; guarda objetos o referencias de cualquier tipo, crece dinámicamente, sin necesidad de tener que
programar operaciones adicionales; el arreglo donde almacena los elementos es de tipo Object, y su
Esta clase agrupa elementos como un arreglo; es equivalente a Vector, pero con las mejoras introducidas por Java 2;
permite acceder a cualquier elemento, insertar o borrar a partir del índice en cualquier posición, aunque un tanto
ineficiente si se realiza en posiciones intermedias. A partir de Java 5 es una clase genérica y, por consiguiente, se puede
establecer el tipo concreto de los elementos; esta clase tiene tres constructores:
public ArreayList();
Las clases abstractas representan conceptos generales, engloban las características comunes de un conjunto de objetos.
Persona, en un contexto laboral, es una clase abstracta que engloba las propiedades y métodos comunes a todo tipo de
individuo que trabaja para una empresa. Las clases abstractas declaran métodos y variables instancia, y normalmente
tienen métodos abstractos; si una clase tiene un método abstracto debe declararse abstracta; una característica
importante de estas clases es que de ellas no se pueden definir objetos, es decir, no se puede instanciar de una clase
abstracta; el compilador devuelve un error siempre que se intenta crear un objeto de dichas clases. Las clases abstractas
están en lo más alto de la jerarquía de clases, son superclases base y, por consiguiente, siempre se establece una
conversión automática de clases derivada a base abstracta.
Una clase interna es la que se declara dentro de otra clase; se puede decir que es anidada. Un objeto de la clase
Direccion puede hacer referencia a los miembros de Alumno; los objetos de la clase interna disponen de una referencia
implícita al objeto que los contiene. Las clases internas declaran atributos y métodos de igual forma que las externas o
de nivel superior, con la peculiaridad de que sus métodos pueden acceder a los atributos de su clase externa. Hay cuatro
tipos de clases internas:
b) locales
c) static
d) anónimas
La compilación de una clase que contiene a una clase interna genera dos archivos: Externa.class y Externa$Interna.class.
Para la máquina virtual son dos clases normales; en el ejemplo 12.4 la compilación generará los archivos Alumno.class y
Alumno$Direccion.class. Las clases anónimas se utilizan con mucha frecuencia en la gestión de eventos.
12.4.1 Clases internas miembro
Éstas se definen dentro de otra clase al nivel superior, es decir, al nivel establecido por las llaves de apertura y cierre:
class Externa { ... class Interna }. Las clases internas así definidas pueden tener visibilidad pública o privada; se debe
recordar que las clases externas o normales no pueden tener visibilidad privada; Si la visibilidad de la clase interna lo
permite, también se pueden crear objetos desde el exterior de la clase.
Estas clases se definen dentro de un bloque de código y, por consiguiente, son locales, su visibilidad se limita al bloque;
se crean dentro de un método, donde también se crean sus objetos. El ámbito de la clase local es el método donde se
define; por consiguiente no se declaran con etiquetas de visibilidad; siempre están ocultas al exterior del bloque o
método donde se han declarado. Las clases locales pueden acceder a los miembros de la clase externa y también a las
variables del método declaradas con el atributo final.
Las clases internas static se utilizan para ocultar una clase dentro de otra; se pueden definir perfectamente como clase
externa. Los objetos de la clase interna static pueden existir con independencia de los objetos de la clase externa; de
hecho se puede crear un objeto de dicha clase interna sin haber creado un objeto de la clase externa; son tan
independientes que los métodos de estas clases sólo tienen acceso a los miembros de la clase externa mediante una
referencia del objeto externo; esto no es necesario en el caso de los miembros static de la clase externa.
Este tipo de clases internas no se identifican con un nombre, se definen a la vez que se crea la instancia u objeto de la
clase; de ellas no se pueden crear múltiples objetos, sólo el ligado con la definición. La clase anónima no sólo puede
implementar una interfaz sino que también puede derivar o extender una clase
La herencia o relación es-un, es la relación existente entre dos clases: una es la derivada que se crea a partir de otra ya
existente, denominada base; la nueva hereda de la ya existente; por ejemplo: si existe una clase Figura y se desea crear
una clase Triangulo, esta última puede derivarse de la primera pues tendrá en común con ella un estado y un
comportamiento, aunque tendrá sus características propias; Triangulo es-un tipo de Figura; otro ejemplo es Programador
que es-un tipo de Empleado. Como la clase base y la clase derivada tienen código y datos comunes, es evidente que si se
crea la clase derivada de modo independiente, se duplicaría mucho de lo que ya se escribió para la clase base; entonces
la herencia en la clase derivada es una ampliación de la base pues aquélla dispone de sus atributos y métodos propios
más los atributos y métodos heredados; por ello, Java utiliza la palabra reservada extends para crear clases derivadas o
clases que son extensión de otra, de modo que la nueva hereda todos los miembros datos y los métodos que pertenecen
a la ya existente. La declaración de derivación de clases debe incluir la palabra reservada extends y a continuación el
nombre de la clase base de la que se deriva.
Los miembros private de la clase base son los únicos que la derivada no hereda, no se puede acceder a ellos desde
métodos de clases derivadas; los miembros con visibilidad public, protected o la visibilidad predeterminada, que es sin
especificador de visibilidad, se incorporan a la derivada con la misma visibilidad que en la base.
13.1.2 Diseño de clases derivadas
En el diseño de una aplicación orientada a objetos no siempre resulta fácil establecer la relación de herencia más óptima
entre clases; por ejemplo: los empleados de una empresa; existen diferentes tipos de clasificaciones según el criterio de
selección (discriminador) y, entre otros, pueden ser:
En el diseño de una aplicación orientada a objetos no siempre resulta fácil establecer la relación de herencia más óptima
entre clases; por ejemplo: los empleados de una empresa; existen diferentes tipos de clasificaciones según el criterio de
selección (discriminador) y, entre otros, pueden ser: a) modo de pago: sueldo fijo, por horas, comisión; b) tipo de
empresa: industrial o comercial; c) tipo de relación laboral: fijo o temporal.
en la clase derivada La sobrecarga de métodos se produce cuando se define uno con el mismo nombre que otro de la
misma clase pero con distinto número o tipo de argumentos; en la sobrecarga no interviene el tipo de retorno. Una clase
derivada puede redefinir un método de la clase base sin tener exactamente la misma cabecera o signatura, teniendo el
mismo nombre pero distinta lista de argumentos; esta redefinición no oculta el método de la clase base, sino que da
lugar a una sobrecarga del método heredado en la derivada.
En el contexto de herencia, la palabra reservada final aplicada a una clase se emplea para impedir que la clase sea
derivable; es decir, cuando se requiere que una clase no pueda extenderse, se declara con el modificador final.
En las jerarquías de clases, las superclases que se crean a partir de subclases con atributos y comportamientos comunes
y que sirven para derivar otras que comparten sus características, generalmente son abstractas; éstas definen un
concepto o tipo generalizado y sirven para describir nuevas clases; además, no se pueden instanciar, es decir, no se
puede crear ningún objeto de esa clase y sólo tienen significado como una clase base de otras; también corresponden a
conceptos generales que no se traducen en objetos específicos pero que son útiles para proporcionar una descripción de
todas las características comunes de objetos. Las clases abstractas son útiles para realizar implementaciones parciales, es
decir, realizan partes de sus funcionalidades postergando el resto a sus subclases.
Las plantillas de clase permiten definir las clases genéricas que pueden manipular diferentes tipos de datos; una
aplicación importante es la implementación de contenedores, clases que contienen objetos de un tipo dato, tales como
vectores (arreglos), listas, secuencias ordenadas o tablas de dispersión (hash); en esencia, los contenedores manejan
estructuras de datos. En terminología orientada a objetos, las plantillas de clases también se denominan clases
parametrizables. Una clase genérica (parametrizable) es una clase con una o más variables tipo.
15.4 Clase genérica Pila
Se trata de diseñar una clase Pila que permita manipular pilas de diferentes tipos de información; una pila es una
estructura que permite almacenar datos de modo que el último en entrar en la pila es el primero en salir; sus
operaciones usuales son insertar y quitar; la primera (push) añade un elemento en su cima, mientras que la segunda
(pop) elimina o saca un elemento de ella; la figura 15.1 muestra una pila con las operaciones típicas.
En su empeño por estandarizar el manejo de excepciones Java declara un amplio conjunto de clases de excepciones, las
cuales forman una jerarquía en la que la base es Throwable, que deriva directamente de la superclase base Object De
Throwable derivan dos clases: Error y Exception; las excepciones del tipo Error son generadas por el sistema, se trata de
errores irrecuperables y es extraño que se produzcan; por ejemplo: salir de la memoria de la máquina virtual.
Los constructores de flujos que esperan un archivo se sobrecargan para recibir el archivo como cadena y recibir un objeto
de la clase File; este tipo de objeto contiene el nombre del archivo, la ruta y más propiedades relativas a él. La clase File
define métodos para conocer propiedades del archivo, tales como la última modificación, permisos de acceso, tamaño,
etcétera; también para cambiar alguna característica del archivo. Los constructores de File permiten inicializar el objeto
con el nombre de un archivo y la ruta donde se encuentra e inicializarlo con otro objeto File como ruta y el nombre del
archivo.
Todo el proceso de entrada y salida en Java se hace a través de flujos; en los programas hay que crear objetos stream y
en muchas ocasiones hacer uso de los objetos in, out de la clase System; los flujos de datos, caracteres o bytes pueden
ser de entrada y salida. En consonancia, Java declara dos clases que derivan directamente de la clase Object:
InputStream y OutputStream; ambas son abstractas y declaran métodos que deben redefinirse en sus clases derivadas;
la primera es la base de todas las clases definidas para flujos de entrada; la segunda es la base de todas las clases
definidas para flujos de salida
La declaración de la clase cuyos objetos van a persistir debe implementar la interfaz Serializable del paquete java.io, la
cual es vacía, no declara métodos, simplemente indica a la JVM que las instancias de estas clases podrán grabarse en un
archivo.
Los componentes gráficos de una aplicación Java se ubican, directa o indirectamente, en una ventana principal, que es
un objeto marco que deriva de la clase JFrame. Los marcos no se visualizan automáticamente, al principio son invisibles;
para mostrarlos se llama al método setVisible(true).
es una clase abstracta definida en el paquete java.awt que proporciona el contexto gráfico; la clase dispone de métodos
para dibujar todo tipo de elementos, tales como líneas, elipses u óvalos y rectángulos en la pantalla; algunos métodos de
la clase Graphics dibujan figuras y otros dibujan imágenes de mapas de bits (bitmap); esta clase también contiene
métodos para establecer las propiedades de los elementos gráficos tales como fuentes de las letras colores
La modularidad consiste en dividir un programa en módulos que
puedan compilarse por separado, sin embargo tendrá conexiones con
otros módulos. La modularidad también tiene principios y son los
siguientes: Capacidad de descomponer un sistema complejo.
Capacidad de componer a través de sus módulos
holamundo.jar
├── com
│ └── ejemplo
│ └── HolaMundo.class
└── module-info.class
module ejemplo {
requires java.util.logging;
exports com.ejemplo;
}
ENCAPSULAMIENTO
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. 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.
La interfaz de una clase representa un contrato de presentación de servicios entre ella y los
demás componentes del sistema, de este modo, los clientes de un componente solo
necesitan conocer los servicios que este ofrece y no como están implementados
internamente.
Puedes usar el nivel de encapsulación protegido, cuando una clase tendrá clases que deriven
de ella (Herencia), y es necesario que las clases hijas (clases derivadas) requieran acceso a
los atributos de la clase padre (súper clase), entonces los atributos o métodos serán
protected.
Sin embargo, elegir el nivel de encapsulación no es porque uno quiere así por así, debemos
de tener criterio (abstracción) para tener atributos o métodos, privados, públicos o
protegidos.
Herencia
El concepto de clases divididas en subclases se utiliza en la vida diaria y conduce
al de herencia; la clase animal se divide en mamíferos, anfibios, insectos, aves,
etcétera; la clase vehículo se divide en autos, camiones, autobuses, motocicletas,
etcétera. La clase electrodoméstico se divide en lavadora, frigorífico, 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 autos, camiones, autobuses, y motocicletas, tienen motor, ruedas y
frenos; pero, además de estas características compartidas, cada subclase tiene
las propias; los autos, por ejemplo, pueden tener maletero, cinco asientos; los
camiones, cabina y caja para transportar carga, entre otras características. 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 (del inglés is-a). En programación orientada a
objetos, 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 operaciones. Las clases bases también pueden ser
subclases o derivarse de otras superclases. Así, el programador puede definir una
clase Animal que encapsule todas las propiedades o atributos (altura, peso,
número de patas, etc.) y el comportamiento u operaciones (comer, dormir, andar)
que pertenecen a cada uno. Los animales específicos como mono, jirafa, canguro
o pingüino 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 mono es-un Animal con características propias: subir a lo árboles,
saltar entre ellos, entre otras; además, comparte con jirafa, canguro y pingüino las
características propias de cualquier animal, como comer, beber, correr, dormir,
etcétera. 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.
La herencia permite la creación de nuevas clases a partir de otra ya existente; la
que sirve de modelo se llama base y la que se creó, hereda: sus características,
además se pueden personalizar añadiendo rasgos adicionales. Las clases
creadas a partir de una base se denominan derivadas.
Niveles de herencia Como comentamos, la jerarquía de herencia puede tener más
de dos niveles; una clase hija también puede ser padre de otra clase hija; por
ejemplo, mamífero es hija de animal y padre de caballo (ver figura 7.11). Las
clases hija o subclases añaden sus propios atributos y operaciones a los de sus
clases base. Una clase puede no tener clase hija, en cuyo caso es una clase hija.
Si una clase tiene sólo un padre, se tiene herencia simple y si tiene más de un
padre, entonces, la herencia es múltiple
Constructores en herencia
Un objeto de una derivada consta de la porción correspondiente de su base y de
los miembros propios; en consecuencia, al construir un objeto de una clase
derivada, primero se construye la parte de su base llamando a su constructor y, a
continuación, se inicializan los miembros propios de la derivada
Herencia múltiple (no soportada en Java)
Se trata de un tipo de herencia en la que una clase hereda el estado o estructura y
el comportamiento de más de una clase base; en otras palabras, hay herencia
múltiple cuando una clase hereda de más de una clase; es decir, existen múltiples
clases base, también llamadas ascendientes o padres, para la clase derivada,
descendiente o hija. La herencia múltiple entraña un concepto más complicado
que la simple, no sólo con relación a la sintaxis sino también respecto al diseño e
implementación del compilador; además, aumenta las operaciones auxiliares y
complementarias, y produce ambigüedades potenciales; incluso, el diseño con
clases derivadas por derivación múltiple tiende a producir más clases que el
diseño con herencia simple. Debido a estas razones Java no ha desarrollado la
herencia múltiple, sólo permite la herencia de una sola clase base; se incluye en
este capítulo a título meramente informativo y por cuestiones de comparación con
otros lenguajes como C++ que sí soportan este tipo de herencia; la figura 13.11
muestra diferentes ejemplos de herencia múltiple.
En herencia simple, el escenario es bastante sencillo, en términos de concepto e
implementación; en herencia múltiple, los escenarios varían ya que las clases
base pueden proceder de diferentes sistemas. Java no permite declarar una clase
derivada o extensión de dos o más clases; si en el diseño de una aplicación hay
herencia múltiple y no puede transformarse a simple, entonces la primera puede
simularse con el mecanismo interface-implements.
Una clase puede derivar de otra e implementar una o más interfaces; por ejemplo,
la clase Helicóptero deriva de Avión e implementa dos interfaces:
public class Helicóptero extends Avión implements Transporte, Vertical {...}
Por otra parte, la herencia múltiple siempre se puede eliminar y convertir en simple
si el lenguaje de implementación no la soporta o considera que tendrá dificultades
en etapas posteriores a la implementación real.
Herencia y genericidad
La herencia se puede aplicar a las clases e interfaces genéricas; una clase
genérica puede heredar de una ordinaria (no genérica).
El polimorfismo es uno de los conceptos fundamentales en la programación orientada a
objetos (POO) y se encuentra ampliamente implementado en el lenguaje de
programación Java. El polimorfismo se refiere a la capacidad de objetos de diferentes
clases de responder a un mismo mensaje de manera diferente. En Java, el polimorfismo
se logra principalmente a través de la herencia y las interfaces. Aquí tienes algunas
características, especificaciones y conceptos clave relacionados con el polimorfismo en
Java:
Herencia y polimorfismo:
Java permite que una clase (subclase) herede comportamientos y características de otra
clase (superclase). El polimorfismo se apoya en esta relación de herencia.
Interfaces y polimorfismo:
Las interfaces son una forma importante de lograr el polimorfismo en Java. Una interfaz
define un conjunto de métodos que una clase debe implementar. Las clases que
implementan una interfaz pueden tratar las instancias de esas clases como objetos de la
interfaz.
Esto permite que diferentes clases implementen una misma interfaz y luego se utilicen
de manera intercambiable a través de referencias de la interfaz.
Los métodos abstractos son métodos que se declaran en una interfaz o en una clase
abstracta, pero no se implementan en esa clase. Deben ser implementados por las clases
concretas que heredan de la interfaz o clase abstracta. Esto permite que múltiples clases
implementen un comportamiento específico de manera diferente, lo que es una forma de
polimorfismo.
Abstracción:
El principio de la abstracción es más fácil de entender con una analogía del mundo real;
por ejemplo: la televisión es un electrodoméstico que se encuentra en todos los hogares;
la mayoría de las personas está familiarizada con sus características y su manejo manual
o con el control remoto: encender, apagar, cambiar de canal, ajustar el volumen, cambiar
el brillo, etcétera, así como añadir componentes externos: altavoces, grabadoras de CD,
reproductores de DVD, conexión de un módem para internet, etcétera. Sin embargo,
¿sabe usted cómo funciona internamente?, ¿conoce cómo recibe la señal por la antena,
por cable, o satélite, traduce la señal y la visualiza en pantalla?