Вы находитесь на странице: 1из 166

TEMA 5.

PROGRAMACIN ORIENTADA A OBJETOS

Introduccin a la OOP y el lenguaje Java


1.Programacin orientada a objetos 2.El lenguaje Java 3.Compilacin, bytecode y JVMs 4.Entornos de desarrollo Java 5.Java vs otros lenguajes OO

Programacin orientada a objetos

Programacin orientada a objetos


4

Aparece

a finales de los 60, pero es a principios de los 80 cuando con el lenguaje Smalltalk comienza un inters claro hacia este paradigma La programacin orientada a objetos es el paradigma de programacin y anlisis y diseo de aplicaciones claramente dominante en la actualidad Hoy prcticamente no se concibe un lenguaje de programacin sin caractersticas de orientacin a objetos: Eiffel, C++, Java, C#, etc.

Programacin orientada a objetos


5

Las ventajas del paradigma OO son mltiples:


Es intuitiva, describe un problema en trminos similares a los que utiliza la mente humana Permite construir soluciones ms seguras y con un mantenimiento ms sencillo Fomenta la reutilizacin y el trabajo en equipo. Escalabilidad de las aplicaciones Incorpora los conceptos de abstraccin, ocultacin de informacin y encapsulacin heredados de los tipos de datos abstractos Incorpora mecanismos especficos y extremadamente poderosos como son la herencia, el polimorfismo y la ligadura dinmica Admite de manera muy natural en algunos lenguajes el soporte de genericidad (patrones) y la definicin de operadores. No soportados por Java

Las caractersticas principales del paradigma OO:


Programacin orientada a objetos


6

El

desarrollo siguiendo el enfoque orientado a objetos es un proceso integral que incluye mtodos especficos de anlisis y diseo, notacin grfica (UML) y lenguajes de programacin orientados a objetos Las soluciones obtenidas durante la fase de anlisis y diseo no son especficas para ningn lenguaje de programacin orientado a objetos

El lenguaje Java

El lenguaje Java
8

Desarrollado en los laboratorios de Sun, es uno de los lenguajes de programacin orientado a objetos que mayor repercusin ha tenido en los ltimos aos Basado en C++ pero simplificado, mucho ms fcil de usar, de ms alto nivel y menos propenso a errores

Amplsima biblioteca estndar de clases predefinidas Las aplicaciones Java pueden ser ejecutadas indistintamente en cualquier plataforma sin necesidad de recompilacin Amplio espectro: programacin tradicional, distribuida, GUI, Web, dispositivos mviles, etc. Gestin avanzada de memoria mediante el uso de un recolector de basura Gestin avanzada de errores, tanto en tiempo de compilacin como de ejecucin Soporte sencillo de mltiples hebras de ejecucin Pueden integrarse mdulos escritos en C/C++ Lenguaje abierto. Kits de desarrollo y documentacin gratuitos en la red

El lenguaje Java
9

Existen distintas ediciones de Java para el desarrollo de aplicaciones en distintos mbitos:


Aplicaciones de propsito general (J2SE) Aplicaciones de gestin en entornos empresariales (J2EE) Aplicaciones para telfonos mviles, PDAs y otros dispositivos electrnicos que permitan aplicaciones empotradas (J2ME)

El lenguaje Java
10

La

ms utilizada es sin duda la edicin estndar (J2SE). Los ejemplos de cdigo Java que veremos a lo largo de los siguientes captulos pertenecen a esta edicin, aunque tambin utilizaremos algunas clases pertenecientes a J2EE

El lenguaje Java
11

Existen dos kits diferentes que pueden ser descargados de la pgina oficial de Oracle:

El Java Development Kit (JDK) permite desarrollar y ejecutar aplicaciones Java El Java Runtime Environment (JRE) permite nicamente la ejecucin

J2SE incluye bibliotecas muy extensas y completas, que permiten la implementacin de casi cualquier tipo de aplicacin:

Seguridad EEDDs Componentes (JavaBeans) Internacionalizacin E/S XML Redes y acceso a Internet Programacin distribuida (RMI, CORBA) Matemtica de precisin arbitraria

Sonido Interfaz de usuario (AWT, SWING) Grficos 2D Manipulacin, carga y descarga de imgenes Impresin Acceso a bases de datos (JDBC) Gestin de preferencias y configuraciones

12

Compilacin, bytecode y JVMs

Compilacin, bytecode y JVMs


13

Java sigue un esquema no tradicional de compilacin/ ejecucin:


La compilacin genera un ejecutable en bytecode o cdigo intermedio independiente Para su ejecucin se requiere un JRE especfico de la plataforma. El JRE est formado por una mquina virtual java (JVM) y las libreras de clases. La JVM interpreta el bytecode o realiza su compilacin just-in-time para que su ejecucin sea ms eficiente

Compilacin, bytecode y JVMs


14

Ventajas de este sistema:


Se compila la aplicacin una nica vez y los ejecutables en bytecode obtenidos son vlidos para cualquier plataforma. El cdigo fuente queda a salvo Es muy robusto. La mquina virtual Java es capaz de detectar y notificar gran cantidad de errores durante la ejecucin de la aplicacin (como accesos a elementos fuera de un vector) El recolector de basura no ocupa espacio en el ejecutable, ya que viene integrado en la JVM Los ejecutables son pequeos porque las libreras de clases vienen proporcionadas junto a la JVM en el JRE de la plataforma concreta Velocidad. Evidentemente la interpretacin o incluso compilacin just-in-time del bytecode produce aplicaciones ms lentas que en el caso de la ejecucin directa de un binario. El recolector de basura puede suponer una sobrecarga adicional al procesador La generalidad tiene como inconveniente que no se aprovecha totalmente la potencia de la mquina y del sistema operativo. Por ejemplo, el aspecto de una aplicacin Java puede resultar simple y poco atractivo en comparacin con las aplicaciones nativas

Inconvenientes:

15

Entornos de desarrollo Java

Entornos de desarrollo Java


16

JDK. El kit de desarrollo bsico proporcionado por Oracle. Es lo mnimo que se necesita para desarrollar. til si se necesita compilar aplicaciones Java de manera espordica o en general para programadores con espiritu espartano. Puede bajarse gratuitamente para cualquier plataforma de www.oracle.com netBeans. El IDE Java ms popular, realizado ntegramente en Java (y por tanto multiplataforma). Consume bastantes recursos. Tiene una arquitectura extensible con mdulos especficos para desarrollo web, aplicaciones mviles, diseo UML, etc. Puede obtenerse gratuitamente de www.netbeans.org

Entornos de desarrollo Java


17

Eclipse. Junto a netBeans, el entorno de desarrollo Java gratuito ms utilizado. Tambin permite el desarrollo en C++ y otros lenguajes de programacin. Puede descargarse en www.eclipse.org Borland JBuilder. Excelente entorno integrado de desarrollo Java de Borland. Existen versiones limitadas que pueden bajarse de www.borland.com Microsoft Visual J++. Uno de los ms populares, aunque las aplicaciones obtenidas pueden presentar problemas de compatibilidad con el SDK oficial de Java, por el uso de libreras especificas de Microsoft. Permite construir aplicaciones Java dentro de la plataforma .NET. La versin express puede obtenerse gratuitamente.

18

Java vs otros lenguajes OO

Java vs otros lenguajes OO


19

20

Programacin orientada a objetos en Java


1.Clases de objetos 2.Proteccin de miembros 3.Proteccin de clases 4.Inicializacin y finalizacin 5.Creacin de objetos 6.Trabajando con objetos 7.Relaciones entre objetos 8.Clases anidadas e interiores 9.Autoreferencias 10.Aplicaciones orientadas a objetos 11.Herencia 12.Adicin, redefinicin y anulacin 13.Proteccin y herencia 14.Herencia mltiple 15.Polimorfismo 16.Ligadura dinmica 17.Informacin de clases en tiempo de ejecucin 18.Otros temas de inters en Java

21

Clases de objetos

Clases de objetos
22

Las clases de objetos representan conceptos o entidades significativos en un problema determinado. Una clase describe las caractersticas comunes de un conjunto de objetos, mediante dos elementos:

Atributos (o variables miembro, variables de clase). Describen el estado interno de cada objeto Operaciones (o mtodos, funciones miembro). Describen lo que se puede hacer con el objeto, los servicios que proporciona

Clases de objetos
23

Durante

la ejecucin de la aplicacin se producir la instanciacin de la clase, es decir, la creacin de los objetos que representan cada uno de los individuos con sus caractersticas propias, es decir, valores especficos para sus atributos

Clases de objetos
24

La implementacin de esta clase en Java se realizara en un fichero con nombre Cuenta.java, y su contenido sera el siguiente:

Los atributos pueden ser de cualquiera de los tipos bsicos de Java: boolean, char, byte, short, int, long, float y double, referencias a otros objetos o arrays de elementos de alguno de los tipos citados

Clases de objetos
25

Al

contrario que C++, Java realiza la definicin e implementacin de la clase en el mismo lugar, en un nico fichero .java

Clases de objetos
26

El

acceso a los atributos de la clase desde la implementacin de las operaciones se realiza de forma directa Los atributos u operaciones estticas (static) no son afectados por el proceso de instanciacin de objetos a partir de la clase De un atributo esttico no se genera una copia por cada objeto que se crea. Existe una nica copia compartida y accesible desde todos los objetos de la clase Una operacin esttica nicamente puede acceder a miembros estticos

Clases de objetos
27

El atributo nOp mantiene una cuenta global del nmero de operaciones realizadas en las cuentas del banco, para la realizacin de estadsticas. La operacin leerNOperaciones() permite leer este contador La operacin eurosAPesetas() es una operacin auxiliar de la clase Cuenta para ser usada cuando sea necesaria una conversin de moneda

28

Proteccin de miembros de la clase

Proteccin de miembros de la clase


29

El principio de ocultacin de informacin se plasma en los lenguajes OO en diversos mecanismos de proteccin de los miembros de la clase UML permite asociar tres niveles de proteccin diferentes a cada miembro de la clase:

Miembros pblicos (+). Sin ningn tipo de proteccin especial Miembros privados (-). Inaccesibles desde el exterior de la clase Miembros protegidos (#). Similares a los privados aunque se permite su acceso desde las clases descendientes*

* Las veremos ms adelante, al estudiar el mecanismo de la herencia

Proteccin de miembros de la clase


30

En Java un miembro se etiqueta como pblico colocando el identificador public delante de su declaracin Para los miembros privados utilizaremos el identificador private

Proteccin de miembros de la clase


31

Los miembros no etiquetados son accesibles por parte de clases amigas. En C++ y otros lenguajes OO las clases amigas a una dada pueden indicarse explcitamente En Java se consideran amigas todas aquellas que forman parte del mismo paquete

Un fichero fuente java forma en s un paquete y por tanto todas las clases incluidas en l son amigas Las clases incluidas en varios ficheros fuente pueden agruparse en un nico paquete indicando el nombre de paquete al principio de cada fichero mediante el indicador package
Las clases A, B y C son amigas al pertenecer al mismo paquete prueba Las clases D y E son amigas al pertenecer al mismo fichero fuente

Proteccin de miembros de la clase


32

En este ejemplo, las clases Cuenta y Banco son amigas al pertenecer al mismo fichero fuente. El acceso a los atributos de los objetos de la clase Cuenta almacenados en el vector interno de Banco queda as garantizado. El atributo saldo puede mantenerse como privado puesto que existe una operacin que permite obtener su valor:

Proteccin de miembros de la clase


33

Atencin: todas las clases que no se declaren como pertenecientes a ningn paquete de forma explcita, pertenecen a un paquete por defecto y por tanto son amigas Un paquete crea un espacio de nombres propios. Esto significa que la clase pasa a tener como prefijo el propio nombre del paquete. A la hora de utilizarla tenemos tres opciones:

Utilizar su nombre completo: prueba.A Importar esa clase, para poder utilizarla sin el prefijo. Esto se indica al principio del cdigo fuente mediante import prueba.A Importar directamente todas las clases del paquete, que se usaran sin prefijo: import prueba.*

Proteccin de miembros de la clase


34

Un paquete puede estar situado dentro de otro paquete formando estructuras jerrquicas. Ejemplo: miapp.prueba.A Java obliga a que exista una correspondencia entre la estructura de paquetes de una clase y la estructura de directorios donde est situada La raiz de la estructura de directorios debe estar incluida en el classpath de Java (parmetro cp <dir>)

Las clases miapp.prueba.A, miapp.prueba.B y miapp.C deben estar en la siguiente estructura de directorios:

35

Proteccin de clases

Proteccin de clases
36

Por

proteccin de clases entendemos un nivel superior de la ocultacin de informacin, a nivel de clases. Es decir, se trata de especificar que clases pueden ser utilizadas y cuales no, y por quin Dentro de un paquete, las clases son amigas y por tanto no existen restricciones respecto a la utilizacin de una clase por las otras Sin embargo, desde el punto de vista del exterior, nicamente podrn ser utilizadas las clases pblicas del paquete, es decir, aquellas con el identificador public situado delante de su declaracin

Proteccin de clases
37

Atencin: Java slo permite una clase pblica por fichero fuente, y el nombre de la clase y el fichero deben coincidir obligatoriamente

En nuestro ejemplo, si queremos que la clase Cuenta pueda ser utilizada desde el exterior del fichero Cuenta.java deberemos declararla como pblica

38

Inicializacin y finalizacin

Inicializacin y finalizacin
39

La

iniciacin de los atributos de la clase se realiza en Java, al igual que en C++, mediante el uso de constructores cuyo nombre coincide con el de la clase

Inicializacin y finalizacin
40

Java

permite la sobrecarga de operaciones, por tanto se pueden definir varios constructores posible para una clase siempre que se diferencien en la lista de argumentos

Inicializacin y finalizacin
41

Nota: vase el apartado I/O: Reading and Writing del tutorial Java de Sun como apoyo para entender el cdigo del nuevo constructor

Inicializacin y finalizacin
42

Si

no se proporciona ningn constructor, Java proporciona automticamente un constructor por defecto, que no recibe argumentos y realiza una inicializacin por defecto de los atributos Una vez implementado un constructor propio por parte del programador, Java elimina dicho constructor, aunque puede ser definido nuevamente de manera explcita

Inicializacin y finalizacin
43

Naturalmente los constructores pueden ser marcados como pblicos, privados, protegidos o con acceso a nivel de paquete, lo que especificar quien puede crear objetos de esta clase y de que manera

Inicializacin y finalizacin
44

Cuando

finaliza el uso de un objeto, es frecuente la realizacin de ciertas tareas antes de su destruccin, principalmente la liberacin de la memoria solicitada durante su ejecucin. Esto se realiza en C++ y otros lenguajes OO en los denominados destructores Estos destructores son operaciones invocadas automticamente justo antes de la destruccin del objeto Sin embargo, en Java la liberacin de memoria se realiza de manera automtica por parte del recolector de basura, por tanto la necesidad de este tipo de operaciones no existe en la mayor parte de los casos

Inicializacin y finalizacin
45

Sin

embargo s puede ser necesario realizar alguna tarea no relacionada con la liberacin de memoria antes de la destruccin del objeto, como por ejemplo salvar el estado de la clase en un fichero o base de datos Java permite introducir cdigo para este fin implementando una operacin pblica especial denominada finalize. Esta operacin es invocada automticamente antes de la destruccin del objeto por parte del recolector de basura

Inicializacin y finalizacin
46

Siguiendo nuestro ejemplo, vamos asegurarnos de que el estado de una cuenta queda salvado en disco antes de su destruccin, para poder ser recuperada posteriormente. Para ello introducimos el cdigo de escritura en fichero en la operacin finalize de la clase Cuenta

Problema: no es posible saber con seguridad en que momento ser invocada finalize, puesto que el recolector de basura puede decidir su eliminacin en un momento indeterminado, e incluso no ser eliminado hasta el final de la ejecucin de la aplicacin

Inicializacin y finalizacin
47

Una posible solucin es ordenar al recolector de basura que realice una limpieza de memoria inmediata, para asegurar la finalizacin de los objetos. Esto se realiza mediante Runtime.getRuntime().gc() Por motivos de eficiencia, lo anterior es poco recomendable, sobre todo si se hace con frecuencia Una mejor opcin es definir una operacin ordinaria con este mismo propsito, a llamar de manera explcita cuando haya finalizado el uso del objeto

Introduciremos en la clase Cuenta una operacin pblica salvar en lugar de finalize, con la misma implementacin. Tras finalizar las operaciones sobre la cuenta, invocaremos a salvar para guardar los cambios realizados

48

Creacin de objetos

Creacin de objetos
49

En

Java los objetos se crean nicamente de forma dinmica. Para ello se utiliza el operador new, de manera similar a C++ Los objetos en Java se utilizan siempre a travs de referencias. Las referencias son similares a los punteros de C/C++, aunque su uso es mucho ms sencillo Por tanto los pasos a seguir en la creacin de un objeto son:
Declarar una referencia a la clase Crear un objeto mediante el operador new invocando al constructor adecuado Conectar el objeto con la referencia

Creacin de objetos
50

La creacin de un objeto de la clase Cuenta se realizara de la siguiente forma:

En cambio, los tipos bsicos (int, long, float, etc.) s pueden ser creados directamente en la pila. Esto es posible porque Java no los implementa realmente como clases de objetos, por motivos de eficiencia y comodidad, ya que su uso es muy frecuente

Creacin de objetos
51

Las cadenas de caracteres se implementan con una clase (String). Sin embargo no suele ser necesaria su creacin de manera explcita, ya que Java lo hace de manera automtica al asignar una cadena constante*

Los arrays tambin deben ser creados dinmicamente con new como si fueran objetos

* Vase el apartado Characters and Strings del tutorial de Java de Sun para ms informacin

Creacin de objetos
52

Si

el array es de referencias a objetos, habr que crear adems cada uno de los objetos referenciados por separado

La

destruccin de los objetos se realiza de manera automtica cuando el recolector de basura detecta que el objeto no est siendo usado, es decir, no est conectado a ninguna referencia

53

Trabajando con objetos

Trabajando con objetos


54

Trabajar

con un objeto Java es similar a C++, aunque las referencias permiten un uso mucho ms sencillo

Trabajando con objetos


55

En este ejemplo se pide un nmero de cuenta al usuario y una cantidad a retirar. A continuacin se carga la cuenta solicitada y se realiza el reintegro

Trabajando con objetos


56

Naturalmente

el compilador producir un error ante cualquier acceso ilegal a un miembro de la clase

El

acceso a un miembro esttico se realiza utilizando el nombre de la clase en lugar de un objeto

57

Relaciones entre objetos

Relaciones entre objetos


58

Un

conjunto de objetos aislados tiene escasa capacidad para resolver un problema. En una aplicacin real los objetos colaboran e intercambian informacin, existiendo distintos tipos de relaciones entre ellos A nivel de diseo, podemos distinguir entre 5 tipos de relaciones bsicas entre clases de objetos: dependencia, asociacin, agregacin, composicin y herencia*
* La veremos ms adelante, en un apartado especfico

Relaciones entre objetos


59

La dependencia es la relacin menos importante. Simplemente refleja que la implementacin de una clase depende de otra Una dependencia puede indicar la utilizacin de un objeto de una clase como argumento de una operacin de otra o en su implementacin

Como vimos anteriormente, la clase Cuenta requiere las clases FileOutputStream y ObjectOutputStream de la librera de clases de Java para la implementacin de la operacin salvar

Relaciones entre objetos


60

En cambio, la asociacin es la relacin ms importante y comn. Refleja una relacin entre dos clases independientes que se mantiene durante la vida de los objetos de dichas clases o al menos durante un tiempo prolongado En UML suele indicarse el nombre de la relacin, el sentido de dicha relacin y las cardinalidades en los dos extremos

Vamos a sustituir el atributo titular por una asociacin con una nueva clase Cliente completa

Relaciones entre objetos


61

Una

asociacin se implementa en Java introduciendo referencias a objetos una clase como atributos en la otra Si la relacin tiene una cardinalidad superior a uno entonces ser necesario utilizar un array de referencias. Tambin es posible utilizar una estructura de datos dinmica del paquete java.util como Vector o LinkedList para almacenar las referencias Normalmente la conexin entre los objetos se realiza recibiendo la referencia de uno de ellos en el constructor o una operacin ordinaria del otro

Relaciones entre objetos


62

Relaciones entre objetos


63

La

agregacin es un tipo especial de asociacin donde se aade el matiz semntico de que la clase de donde parte la relacin representa el todo y las clases relacionadas las partes Realmente Java y la mayora de lenguajes orientados a objetos no disponen de una implementacin especial para este tipo de relaciones. Bsicamente se tratan como las asociaciones ordinarias

Relaciones entre objetos


64

La composicin es un tipo de agregacin que aade el matiz de que la clase todo controla la existencia de las clases parte. Es decir, normalmente la clase todo crear al principio las clases parte y al final se encargar de su destruccin

Supongamos que aadimos un registro de movimientos a la clase Cuenta, de forma que quede constancia tras cada ingreso o reintegro

Relaciones entre objetos


65

Las

composiciones tienen una implementacin similar a las asociaciones, con la diferencia de que el objeto principal realizar en algn momento la construccin de los objetos compuestos

Relaciones entre objetos


66

Nota: tambin sera necesario modificar el otro constructor y la operacin salvar para tener en cuenta la lista de movimientos a la hora de leer/escribir la informacin de la Cuenta en disco

67

Clases anidadas e interiores

Clases anidadas e interiores


68

Java y algunos otros lenguajes OOP permiten la definicin de una clase de objetos dentro de otra, con una doble utilidad:

Organizar mejor el cdigo. Empaquetar en una clase principal otras que no tienen utilidad o sentido fuera del contexto de sta Evitar colisiones de nombres. La clase principal define un espacio de nombres al que pertenecen las anidadas

Al igual que cualquier otro miembro de una clase, una clase anidada puede ser esttica o no esttica y utilizar los niveles de proteccin public, private y protected El tipo de clase anidamiento ms sencillo es aquel en que la clase contenida se declara como esttica

Clases anidadas e interiores


69

Desde el punto de vista de la organizacin del cdigo, tendra mucho ms sentido introducir la clase Movimiento en el interior de Cuenta. Al ser declarada como privada, se impedira su utilizacin desde el exterior

Clases anidadas e interiores


70

Cuando la clase anidada no es esttica, se denomina clase interior y tiene caractersticas especiales:

Pueden ser creadas nicamente dentro de la clase continente Tiene acceso completo y directo a todos los atributos y operaciones del objeto que realiza su creacin

Los objetos de la clase interior quedan ligados permanentemente al objeto concreto de la clase continente que realiz su creacin No debe confundirse este elemento con la relacin de composicin, aunque en muchos casos es posible utilizar clases interiores para la implementacin de este tipo de relaciones

Clases anidadas e interiores


71

Implementando la clase Movimiento como una clase interior es posible copiar el valor del saldo actual de la cuenta que realiza el movimiento de manera directa

Clases anidadas e interiores


72

73

Autoreferencias

Autoreferencias
74

En

ocasiones es necesario obtener una referencia en la implementacin de una operacin al propio objeto sobre el que ha sido invocada la operacin Esta referencia se obtiene en C++ y Java mediante el operador this Cuando encontremos this en una expresin, podremos sustituirlo mentalmente por este objeto Aunque no es necesario, podemos utilizar this para llamar desde la implementacin de una operacin a otra operacin del mismo objeto

Autoreferencias
75

La llamada a la operacin ingreso desde ingresoInteresMes() puede realizarse utilizando this como referencia del objeto sobre el que se invoca la operacin

En este ejemplo, el uso de this es realmente til. Nos permite implementar la operacin transferirDesde() llamando a una operacin transferirHasta(), previamente implementada

Autoreferencias
76

Otra utilidad de this en Java es realizar una llamada a un constructor desde otro constructor

Pero atencin: un constructor no es una operacin ordinaria. nicamente puede llamarse a un constructor desde otro constructor y debe ser la primera instruccin dentro de la implementacin

77

Aplicaciones orientadas a objetos

Aplicaciones orientadas a objetos


78

En

una aplicacin orientada a objetos debe existir una clase que represente la propia aplicacin. Este sera el punto donde comenzara la ejecucin de la misma En lenguajes no totalmente orientados como C++ en la funcin main se crea una instancia de esta clase y se llama a alguna operacin como ejecutar para arrancar la aplicacin. Sin embargo esto no es obligatorio, y un mal programador puede realizar una aplicacin hbrida, con cdigo no orientado a objetos

Aplicaciones orientadas a objetos


79

En un lenguaje orientado a objetos puro como Java esta clase de aplicacin es obligatoria. La mquina virtual Java se encarga de instanciar esta clase y llamar a una operacin especial con nombre main. La existencia de esta operacin especial es lo que caracteriza a la clase de aplicacin

La clase de aplicacin debe ser pblica y no tener ningn constructor o un constructor por defecto Al menos debe implementar la operacin main, con la siguiente declaracin: public static main(String[] args)

Aplicaciones orientadas a objetos


80

A la hora de ejecutar la aplicacin, deber indicarse esta clase a la mquina virtual Java

Tras compilar los ficheros de la ltima versin de nuestro ejemplo: Cliente.java, Cuenta.java y BancoApp.java obtendremos los ficheros en byte code: Cliente.class, Cuenta.class, Movimiento.class y BancoApp.class Finalmente, pasando la clase BancoApp.class a la mquina virtual java pondremos en funcionamiento la aplicacin

Nota: Las clases que constituyen una aplicacin Java tambin pueden distribuirse de manera mucho ms compacta en un nico fichero JAR. Consltese la bibliografa para ver como crean y utilizan estos ficheros

81

Herencia

Herencia
82

La herencia es un mecanismo de la OOP que permite construir una clase incorporando de manera implcita todas las caractersticas de una clase previamente existente. Las razones que justifican su necesidad son variadas:

Modelado de la realidad. Son frecuentes las relaciones de especializacin/generalizacin entre las entidades del mundo real, por tanto es lgico que dispongamos de un mecanismo similar entre las clases de objetos Evitar redundancias. Toda la funcionalidad que aporta una clase de objetos es adoptada de manera inmediata por la clase que hereda, por tanto evitamos la repeticin de cdigo entre clases semejantes Facilitar la reutilizacin. Una clase no tiene por qu limitarse a recibir una serie de caractersticas de otra clase por herencia de forma pasiva. Tambin disponen de cierto margen de adaptacin de estas caractersticas Soporte al polimorfismo

Herencia
83

Sea una clase A. Si una segunda clase B hereda de A entonces decimos:


A es un ascendiente o superclase de B. Si la herencia entre A y B es directa decimos adems que A es la clase padre de B B es un descendiente o subclase de A. Si la herencia entre A y B es directa decimos adems que B es una clase hija de A

En Java, Eiffel, Smalltalk y otros lenguajes orientados a objetos puros, todas las clases heredan automticamente de una superclase universal. En Java esta superclase se denomina Object

Herencia
84

Existen diferentes situaciones en las que puede aplicarse herencia:

Especializacin. Dado un concepto B y otro concepto A que representa una especializacin de A, entonces puede establecerse una relacin de herencia entre las clases de objetos que representan a A y B. En estas situaciones, el enunciado A es un B suele ser aplicable

Extensin. Una clase puede servir para extender la funcionalidad de una superclase sin que represente necesariamente un concepto ms especfico

Herencia
85

Especificacin. Una superclase puede servir para especificar la funcionalidad mnima comn de un conjunto de descendientes. Existen mecanismos para obligar a la implementacin de una serie de operaciones en estos descendientes

Construccin. Una clase puede construirse a partir de otra, simplemente porque la hija puede aprovechar internamente parte o toda la funcionalidad del padre, aunque representen entidades sin conexin alguna

Herencia
86

Ejemplos
Distintos

de herencia:
tipos de cuentas bancarias

Herencia
87

Elementos

de una interfaz de usuario

Herencia
88

Estructuras

de datos

Herencia
89

Vamos a estudiar la implementacin de la herencia en Java mediante el ejemplo de un conjunto de tareas programables: TPReloj (actualizar un reloj digital cada segundo), TPAviso (mostrar un aviso peridicamente) y TPEjecucion (ejecucin de un comando cada cierto tiempo)

Herencia
90

La clase TareaPeriodica tiene las caractersticas comunes a los tres tipos de tarea: periodo de ejecucin en segundos, hora de la ltima ejecucin y bandera de estado activo/inactivo)

Herencia
91

La

operacin ejecutarTarea realmente no tiene una implementacin concreta a este nivel

Herencia
92

Para que una clase herede de otra, utilizaremos el indicador extends en la declaracin de la clase

Atencin!: Aunque el cdigo de estas clases compila perfectamente, la implementacin de los constructores es formalmente incorrecta. Ms adelante veremos por qu.

Herencia
93

Atencin!: Aunque el cdigo de estas clases compila perfectamente, la implementacin de los constructores es formalmente incorrecta. Ms adelante veremos por qu.

Herencia
94

Todos las clases en Java heredan en ltima instancia de Object. Incluso si creamos una clase independiente, Java la hace heredar implcitamente de Object

Esto hace que las clases formen una jerarqua con Object como raz

Herencia
95

En la implementacin de una operacin de la subclase no existe diferencia aparente entre un atributo u operacin propia de la clase y un atributo u operacin heredados

Ahora podemos crear y usar objetos de cualquiera de las clases anteriores. Desde el exterior tampoco existen diferencias aparentes entre la llamada a una operacin heredada o propia de la clase:

Herencia
96

La inicializacin de los atributos de una superclase en el constructor de una subclase presenta varios inconvenientes serios:

Resulta redundante. La superclase tiene ya un constructor que hace ese trabajo. Por qu repetir cdigo entonces? Si la clase tiene una larga lista de ascendientes, entonces el constructor sera muy largo La superclase puede tener una inicializacin compleja, y la inclusin del cdigo de inicializacin en la subclase puede requerir un conocimiento excesivo de la superclase por parte del implementador

Herencia
97

El procedimiento correcto consiste en realizar una llamada al constructor de la superclase para que realice la inicializacin de los atributos heredados En Java esta llamada al constructor de la superclase se realiza con la operacin super() seguida de los parmetros de inicializacin de alguno de los constructores del padre de la clase

La implementacin correcta del constructor de la clase TPAviso sera por tanto la siguiente:

Herencia
98

Y de las otras dos subclases:

Herencia
99

nicamente

debe llamarse explcitamente a un constructor del ascendiente inmediato El constructor de este ltimo realizar a su vez una llamada a un constructor de su ascendiente inmediato y as sucesivamente hasta inicializar todos los atributos heredados

Herencia
100

Para terminar, es posible impedir la herencia a partir de una clase declarndola como final Sin embargo, esta es una caracterstica que debe ser utilizada con prudencia, ya que puede restringir en exceso la extensin y reutilizacin de las clases del sistema en el futuro

101

Adicin, redefinicin y anulacin

Adicin, redefinicin y anulacin


102

La herencia en s no sera tan interesante si no fuera por la posibilidad de adaptar en el descendiente los miembros heredados

Adicin. Trivialmente el descendiente puede aadir nuevos atributos y operaciones que se suman a los recibidos a travs de la herencia Redefinicin. Es posible redefinir la implementacin de una operacin heredada para adaptarla a las caractersticas de la clase descendiente. Tambin es posible cambiar el tipo de un atributo heredado Anulacin. Cuando un atributo u operacin heredados no tienen utilidad en el descendientes, pueden ser anulados para impedir su utilizacin

No todos los lenguajes orientados a objetos soportan estas caractersticas, en especial la anulacin

Adicin, redefinicin y anulacin


103

La redefinicin se realiza en Java y la mayora de los lenguajes OO definiendo nuevamente la operacin (con los mismos argumentos) en el descendiente

Las clases descendientes TPReloj, TPEjecucion y TPAviso no estn operativas todava porque la implementacin de ejecutarTarea() que contienen es la heredada de TareaPeriodica, que no hace nada en particular Es preciso redefinir esta operacin en cada una de las subclases para que realicen las tareas correspondientes

Adicin, redefinicin y anulacin


104

Adicin, redefinicin y anulacin


105

Adicin, redefinicin y anulacin


106

Cada tarea ejecuta ahora su funcin, aunque la llamada es aparentemente la misma

Despus de la redefinicin, en el descendiente es posible llamar a la versin original de la operacin en el ascendiente mediante: super.operacionRedefinida()

Adicin, redefinicin y anulacin


107

Otro

uso posible de la palabra clave final es impedir la redefinicin de una operacin en las subclases

Adicin, redefinicin y anulacin


108

La anulacin es un mecanismo menos til, y con menor soporte por parte de los lenguajes de programacin En Java es posible impedir el acceso a un atributo redeclarndolo en una subclase como privado o protegido, segn sea el nivel de proteccin que se desee

Adicin, redefinicin y anulacin


109

Sin embargo, Java no permite redefinir una operacin haciendo su nivel de acceso ms restrictivo Una solucin parcial consistira en redefinirla como vaca o incluyendo un cdigo que impida su utilizacin

110

Proteccin y herencia

Proteccin y herencia
111

Hemos visto anteriormente como los distintos niveles de proteccin limitan el acceso a los miembros de la clase desde el exterior. Pero como afectan estos niveles de proteccin a los miembros heredados?

Miembros pblicos. Son accesibles desde los descendientes, y se heredan como pblicos Miembros privados. No son accesibles desde los descendientes Miembros con acceso a nivel de paquete. Son accesibles desde los descendientes siempre y cuando pertenezcan al mismo paquete que el ascendiente. Se heredan con el mismo nivel de proteccin

Un nuevo nivel de proteccin es el de miembros protegidos (protected). Un miembro protegido es accesible nicamente desde los descendientes

Proteccin y herencia
112

Adems, un miembro protegido mantiene en las subclases el nivel de acceso protegido


En nuestro ejemplo, los atributos de la clase TareaPeriodica son accesibles desde TPReloj, TPEjecucion y TPAviso porque al pertenecer al mismo paquete son amigas Para permitir el acceso a los atributos de la clase TareaPeriodica nicamente desde los descendientes es conveniente marcarlos como protegidos

113

Clases abstractas

Clases abstractas
114

Existen

clases que representan conceptos tan genricos que no tiene sentido su instanciacin en objetos Adems en este tipo de clases puede ser imposible o intil la implementacin de ciertas operaciones La utilidad de este tipo de clases est en la aplicacin de herencia para obtener clases que representan conceptos concretos para los que s que tiene sentido su instanciacin

La clase TareaPeriodica es un claro ejemplo: por s sola no tiene utilidad, pero simplifica mucho la construccin de las otras tres clases. De hecho, la operacin ejecutarTarea() en TareaPeriodica no tiene una implementacin til

Clases abstractas
115

Estas

clases se denominan clases abstractas y este tipo de operaciones sin implementacin posible, operaciones abstractas Las operaciones abstractas deben ser implementadas obligatoriamente en alguna de las subclases para que la clase correspondiente sea instanciable Una clase abstracta puede no tener ninguna operacin abstracta, pero una clase que contenga al menos una operacin abstracta debe ser declarada como abstracta En Java, utilizando la declaracin abstract podremos establecer una clase o una operacin como abstracta

Clases abstractas
116

Vamos a declarar la clase TareaPeriodica y su operacin ejecutarTarea() como abstractas

Clases abstractas
117

Java devuelve ahora un error en tiempo de compilacin si se intenta crear un objeto de la clase TareaPeriodica

La abstraccin de una clase se propaga por la jerarqua de herencia hasta que todas las operaciones quedan implementadas

Clases abstractas
118

La idea de clase abstracta, llevada al extremo, nos lleva en Java a las interfaces. Una interfaz es similar a una clase totalmente abstracta:

Todas las operaciones de la interfaz son implcitamente abstractas, es decir, carecen de implementacin Una interfaz no puede contener atributos

Las interfaces sirven para especificar las operaciones que obligatoriamente deben implementar una serie de clases La implementacin de una interfaz no se realiza mediante herencia (extends) sino mediante implements. No obstante, el comportamiento es similar al de la herencia, aunque ms sencillo

Clases abstractas
119

La idea de clase implementa una interfaz, esta implementacin debe ser completa, es decir, de todas las operaciones de la interfaz

Podemos transformar TareaPeriodica en una interfaz, de forma que especifique lo que tiene que implementar cualquier clase que represente una tarea peridica. Este enfoque proporciona mayor libertad a la hora de disear las otras clases

Clases abstractas
120

La interfaz TareaPeriodica y la clase TPReloj tendran ahora el siguiente aspecto. Las otras clases tendran implementaciones similares

Clases abstractas
121

Clases abstractas
122

Una clase puede implementar ms de una interfaz Una interfaz puede heredar de otra interfaz Cuando utilizar una interfaz en lugar de una clase abstracta?

Por su sencillez se recomienda utilizar interfaces siempre que sea posible Si la clase debe incorporar atributos, o resulta interesante la implementacin de alguna de sus operaciones, entonces declararla como abstracta

En la biblioteca de clases de Java se hace un uso intensivo de las interfaces para caracterizar las clases. Algunos ejemplos:

Para que un objeto pueda ser guardado en un fichero la clase debe implementar la interfaz Serializable Para que un objeto sea duplicable, su clase debe implementar Cloneable Para que un objeto sea ordenable, su clase debe implementar Comparable

123

Herencia mltiple

Herencia mltiple
124

Consiste en la posibilidad de que una clase tenga varios ascendientes directos Puede surgir de manera relativamente frecuente y natural durante el diseo

Herencia mltiple
125

Tiene claramente aspectos positivos


Surge de manera natural al describir la estructura de un sistema Proporciona mucha flexibilidad a la hora de construir clases nuevas Complica el diseo. La jerarqua de clases deja de ser tal jerarqua para pasar a ser una red Provoca problemas de eficiencia. La llamada a una operacin heredada implica la bsqueda por mltiples caminos Ambigedad: dos atributos u operaciones con el mismo nombre pueden llegar a una clase por dos caminos distintos Herencia repetida: en una estructura con forma de rombo, un atributo u operacin puede llegar a una clase por dos caminos distintos

Pero tambin aspectos negativos


Herencia mltiple
126

La apuesta de los creadores de Java es clara: no permitir la herencia mltiple, por las razones expuestas anteriormente A veces es posible sustituir la herencia mltiple por una combinacin herencia/composicin, aunque el resultado no puede considerarse equivalente

Herencia mltiple
127

Adems, Java s que permite la implementacin de una o varias interfaces adems de la herencia, lo que puede considerarse una forma restringida de herencia mltiple Una clase puede heredar de otra e implementar una o varias interfaces sin que aparezcan los problemas asociados con la herencia mltiple

128

Polimorfismo

Polimorfismo
129

Son dos mecanismos relacionados que otorgan a la OOP una gran potencia frente a otros paradigmas de programacin nicamente tienen sentido por la existencia de la herencia El polimorfismo (o upcasting) consiste en la posibilidad de que una referencia a objetos de una clase pueda conectarse tambin con objetos de descendientes de sta

Polimorfismo
130

El sentido del polimorfismo es realizar una generalizacin, olvidar los detalles concretos de uno o varios objetos de distintas clases y buscar un punto comn a todos ellos en un ancestro

Polimorfismo
131

La mayora de las veces, las conexiones polimorfas se realizan de manera implcita en el paso de argumentos a una operacin. De esta manera es posible escribir operaciones polimorfas que reciban objetos de mltiples clases

Polimorfismo
132

Otra aplicacin muy til es la construccin de estructuras de datos que puedan mantener objetos de distintas clases

Vamos a implementar una nueva clase GestorTareas que va a contener una lista de tareas a realizar. La llamada a chequearEjecutar() realizar la comprobacin y ejecucin de las tareas que lo requieran

Polimorfismo
133

Polimorfismo
134

Pero siempre debe quedar claro que tras la conexin polimorfa nicamente podemos acceder a las operaciones pertenecientes a la clase asociada a la referencia. El resto de operaciones del objeto no son accesibles a travs de esta referencia

Polimorfismo
135

En Java, una referencia a Object puede ser conectada a cualquier objeto, puesto que como sabemos es un ancestro de todas las clases

Adems, las interfaces implementadas por una clase tambin pueden ser utilizadas para realizar conexiones polimorfas

136

Ligadura dinmica

Ligadura dinmica
137

Entendemos

por resolucin de una llamada el proceso por el cual se sustituye una llamada a una funcin por un salto a la direccin que contiene el cdigo de esta funcin Normalmente, la resolucin de llamadas se realiza en tiempo de compilacin, porque resulta ms sencillo y sobre todo ms eficiente. Cuando la aplicacin se est ejecutando, las llamadas ya estn preparadas. Este enfoque se denomina ligadura esttica f() CALL _f

Ligadura dinmica
138

El problema aparece en OOP cuando realizamos una conexin polimorfa y llamamos a una operacin redefinida

El compilador no tiene informacin para resolver la llamada. Por defecto utilizara el tipo de la referencia, y por tanto generara una llamada a A.f() Pero la referencia r puede apuntar a objetos de las clases A, B o C, con distintas versiones de f()

Ligadura dinmica
139

La solucin consiste en esperar a resolver la llamada al tiempo de ejecucin, cuando se conoce realmente los objetos conectados a r, y cul es la versin de f() apropiada. Este enfoque de resolucin de llamadas se denomina ligadura dinmica y es mucho ms lenta y compleja que la esttica Hay tres enfoques posibles a la hora de escoger entre ligadura esttica o dinmica:

Establecer la ligadura esttica por defecto. El programador puede activar la ligadura dinmica para una funcin concreta cuando lo ve necesario (C++) Utilizar un compilador inteligente que decide la ligadura esttica o dinmica en funcin del empleo que se hace de cada funcin (Eiffel) Establecer la ligadura dinmica para todas las funciones y evitar problemas a costa de eficiencia en la ejecucin (Smalltalk, Java)

Ligadura dinmica
140

Por tanto, la ligadura dinmica, por defecto en Java, garantiza siempre la llamada a la versin correcta de cada funcin, con independencia del uso de conexiones polimorfas o no

Por tanto en Java las llamadas a la funcin ejecutarTarea() se resuelven correctamente, a pesar de realizarse a travs de una referencia a TareaPeriodica

141

Informacin de clases en tiempo de ejecucin

142

Informacin de clases en tiempo de ejecucin


Tras

realizar una conexin polimorfa es frecuente la necesidad de volver a recuperar el objeto original, para acceder a sus operaciones propias Se trata de la operacin inversa al polimorfismo (upcasting), denominada downcasting Si el polimorfismo implica una generalizacin, el downcasting implica una especializacin Al contrario que el upcasting, el downcasting no puede realizarse directamente mediante una conexin con una referencia de la clase del objeto

143

Informacin de clases en tiempo de ejecucin

Tras crear un objeto de tipo TPReloj y conectarlo mediante una referencia a TareaPeriodica, intentamos recuperar nuevamente una referencia de tipo TPReloj al objeto. No es posible de manera directa

Un simple casting permite forzar la conexin a la referencia

144

Informacin de clases en tiempo de ejecucin


Un

intento de casting imposible generar una excepcin ClassCastException en tiempo de ejecucin

145

Informacin de clases en tiempo de ejecucin

Podemos capturar esta excepcin para determinar si el objeto apuntado por la referencia es del tipo esperado o no, realizando acciones diferentes en cada caso

146

Informacin de clases en tiempo de ejecucin

147

Informacin de clases en tiempo de ejecucin


Mucho

ms cmodo es utilizar instanceof para determina si el objeto es de la clase esperada antes de realizar el casting

148

Informacin de clases en tiempo de ejecucin


La

operacin getClass() de Object devuelve un objeto de la clase Class que permite obtener en tiempo de ejecucin gran cantidad de informacin de la clase a la que pertenece el objeto. El atributo esttico class de la clase tambin devuelve una referencia a este objeto

149

Informacin de clases en tiempo de ejecucin


Las libreras de contenedores de Java (java.util) utilizan el polimorfismo para conseguir genericidad, trabajando siempre con Object A la hora de recuperar los objetos almacenados, es necesario utilizar downcasting para conectar con una referencia de la clase apropiada

150

Informacin de clases en tiempo de ejecucin


A partir de la versin 5, Java ha incorporado similar al utilizado por los templates de C++ para especificar el tipo de los elementos del contenedor La ventaja es que la referencia devuelta es directamente del tipo especificado en la creacin del contenedor

151

Informacin de clases en tiempo de ejecucin


Otro inconveniente del uso del polimorfismo para la implementacin de los contenedores es que los tipos simples (int, char, etc.) no pueden almacenarse directamente, al no ser clases de objetos Para solucionarlo, Java incorpora una clase wrapper para cada tipo simple: (int > Integer, char > Character, etc.)

152

Informacin de clases en tiempo de ejecucin


Nuevamente, a partir de la versin 5, este problema se ha eliminado con el autoboxing de tipos simples Es decir, Java transforma un tipo simple en su clase wrapper cuando es necesario de manera automtica Es algo similar a la construccin automtica de String a partir de arrays de caracteres que ya conocemos

153

Otros temas de inters en Java

Otros temas de inters en Java


154

Entrada/Salida. La librera de clases de Java dispone de gran cantidad de clases para la gestin transparente de E/S. Estas clases pueden combinarse para crear flujos de datos especializados E/S Binaria (streams):

Las clases FileInputStream y FileOutputStream permite abrir streams de E/S secuencial a ficheros en disco. La clase RandomAccessFile permite leer y escribir informacin a un fichero de forma aleatoria Las clase BufferedInputStream y BufferedOutputStream permite leer y escribir informacin de un input/output stream, utilizando un buffer intermedio para acelerar las operaciones Las clases DataInputStream y DataOutputStream permite leer y escribir tipos simples en un input/output stream

Otros temas de inters en Java


155

Ejemplo.

Lectura y escritura bsicas en un fichero:

Otros temas de inters en Java


156

E/S de caracteres (readers)


Las clases FileReader y FileWriter permite abrir readers/writers de acceso secuencial a ficheros en disco Las clases BufferedReader y BufferedWriter permite leer y escribir informacin utilizando un buffer intermedio para acelerar las operaciones. Posibilitan el leer/escribir lineas completas Las clases InputStreamReader y OutputStreamWriter permiten convertir un stream en un reader/writer La clase especializada PrintWriter permite escribir directamente cualquier tipo de dato en un writer. Su uso es ms cmodo que el de un BufferedWriter La clase especializada Scanner permite leer de manera sencilla cualquier tipo simple de un fichero de texto. Su uso es ms comodo que mediante BufferedReader

Ver el apartado I/O: Reading and Writing del tutorial Java y las pginas de las clases citadas en el manual de referencia para ms informacin

Otros temas de inters en Java


157

Ejemplo. Escritura de un fichero mediante BufferedWriter y PrintWriter:

Otros temas de inters en Java


158

Hay dos mtodos de lectura:


El primero usa la operacin parse() de las clases wrapper de los tipos bsicos El segundo, ms flexible y sencillo, utiliza la clase Scanner

Otros temas de inters en Java


159

Serializacin. Una de las caractersticas ms potentes de Java es la posibilidad de serializar un objeto, es decir, convertirlo en una secuencia de bytes y enviarlo a un fichero en disco, por un socket a otro ordenador a travs de la red, etc. El proceso sera el siguiente:

Declarar la implementacin de la interfaz Serializable en la clase que deseemos serializar. Se trata de una interfaz vaca, por lo que no hay operaciones que implementar Para serializar el objeto crearamos un stream ObjectOutputStream y escribiramos el objeto mediante la operacin writeObject() Para deserializar el objeto crearamos un stream ObjectInputStream, leeramos el objeto mediante readObject() y realizaramos un casting a la clase del objeto

Ver el apartado Object Serialization del tutorial Java para ms informacin

Otros temas de inters en Java


160

Vamos a modificar ahora el constructor de la clase Cuenta y la operacin salvar() para que sean capaces de cargar y salvar el histrico de movimientos. La capacidad de serializacin de Java permite salvar la lista enlazada de un golpe

Otros temas de inters en Java


161

Otros temas de inters en Java


162

Multitarea. Es posible implementar una o varias tareas que se ejecuten en varias hebras de ejecucin en paralelo, de la siguiente manera

Construir una clase que represente la tarea y herede de la clase Java Thread Redefiniendo la operacin run() de Thread podremos introducir el cdigo que deseamos ejecutar en la hebra Para arrancar la nueva hebra basta con crear un objeto de la clase y ejecutar la operacin start() Si se desea parar la hebra durante un tiempo determinado, puede utilizarse la operacin sleep(int segs) La tarea finaliza cuando se el hilo de ejecucin llega de forma natural al final de la operacin run()

Ver el apartado Threads: doing two or more tasks at once del Tutorial Java para ms informacin

Otros temas de inters en Java


163

Ejemplo: un gestor de tareas que funciona en paralelo con el resto de la aplicacin, realizando la comprobacin peridica de las tareas que requieren ejecucin

Otros temas de inters en Java


164

La operacin terminar() va a permitir forzar la finalizacin del gestor de tareas

Otros temas de inters en Java


165

Esta aplicacin contara con dos hilos de ejecucin en paralelo, uno principal y otro asociado al gestor de tareas

166

Captulo 5. POO Bibliografa


L. Joyanes Aguilar. "Programacin orientada a objetos". Ed. McGraw-Hill, ISBN: 84-481-2015-9, 1998 S. Bennett, S. McRobb, R. Farmer. "Anlisis y diseo orientado a objetos de sistemas". Ed. McGraw-Hill, ISBN: 978-84-481-5640-4 Budd, T."Introduccin a la programacin orientada a objetos". Addison-Wesley Iberoamricana, cop. ISBN; 0201601036. 1994 Weiss, Mark Allen. Estructuras de datos en Java: compatible con Java 2. Addison Wesley, D.L. 2010 Wu, C. Thomas. Introduccin a la programacin orientada a objetos con Java. Madrid: McGraw-Hill, 2001 Eckel, Bruce. Piensa en Java. Pearson Educacin, 2008, XVII

Вам также может понравиться