nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
INTRODUCCION A JAVA
Sun Microsystems, lder en servidores para Internet, uno de cuyos lemas desde hace mucho tiempo ha sido "the network is the computer" (lo que quiere dar a entender que el verdadero ordenador es la red en su conjunto y no cada mquina individual), es quien ha inventado el lenguaje Java, en un intento de resolver simultneamente todos los problemas que se planteaban a los desarrolladores de software por la proliferacin de arquitecturas incompatibles, tanto entre las diferentes mquinas como entre los diversos sistemas operativos y sistemas de ventanas que funcionan sobre una misma mquina, aadiendo la dificultad de crear aplicaciones distribuidas en una red como Internet.
ORIGEN DE JAVA
El uso principal que se hace de Internet e incluso de las redes internas (corporativas) es correo electrnico (e-mail), aunque actualmente hay un auge sorprendente de la navegacin web. Los documentos web pueden contener variedad de texto, grficos de todas clases y proporcionar enlaces hipertexto hacia cualquier lugar de la red. Los navegadores utilizan documentos escritos en lenguaje HTML. La combinacin actual de navegadores HTML/WWW estn limitados pues, a texto y grficos. Si se quiere reproducir un sonido o ejecutar un programa de demostracin, primero hemos de bajarnos (download) el fichero en cuestin y luego utilizar un programa en nuestro ordenador capaz de entender el formato de ese fichero, o bien cargar un mdulo (plug-in) en nuestro navegador para que pueda interpretar el fichero que hemos bajado. Hasta ahora, la nica forma de realizar una pgina web con contenido interactivo, era mediante la interfaz CGI ( Common Gateway Interface ), que permite pasar parmetros entre formularios definidos en lenguaje HTML y programas escritos en Perl o en C. Esta interfaz resulta muy incmoda de programar y es pobre en sus posibilidades. El lenguaje Java y los navegadores con soporte Java, proporcionan una forma diferente de hacer que ese navegador sea capaz de ejecutar programas. Con Java se puede reproducir sonido directamente desde el navegador, se pueden visitar home pages con animaciones, se puede ensear al navegador a manejar nuevos formatos de ficheros, e incluso, cuando se pueda transmitir video por las lneas telefnicas, nuestro navegador estar preparado para mostrar esas imgenes. Utilizando Java, se pueden eliminar los inconvenientes de la interfaz CGI y tambin se pueden aadir aplicaciones que vayan desde experimentos cientficos interactivos de propsito educativo a juegos o aplicaciones especializadas para la televenta. Es posible implementar publicidad interactiva y peridicos personalizados. Por ejemplo, alguien podra escribir un programa Java que implementara una simulacin qumica interactiva (una cadena de adn). Utilizando un navegador con soporte Java, un usuario podra recibir fcilmente esa simulacin e interaccionar con ella, en lugar de conseguir simplemente un dibujo esttico y algo de texto. Lo recibido cobra vida . Adems, con Java podemos estar seguros de que el cdigo que hace funcionar el experimento qumico no contiene ningn trozo de cdigo malicioso que dae al sistema. El cdigo que intente actuar destructivamente o que contenga errores, no podr traspasar los muros defensivos colocados por las caractersticas de seguridad y robustez de Java. Adems, Java proporciona una nueva forma de acceder a las aplicaciones. El software viaja transparentemente a travs de la red. No hay necesidad de instalar las aplicaciones, ellas mismas vienen cuando se necesitan. Por ejemplo, la mayora de los navegadores del Web pueden procesar un reducido nmero de formatos grficos (tpicamente GIF y JPEG). Si se encuentran con otro tipo de formato, el navegador estndar no tiene capacidad para procesarlo, tendra que ser actualizado para poder aprovechar las ventajas del nuevo formato. Sin embargo, un navegador con soporte Java puede enlazar con el servidor que contiene el algoritmo que procesa ese nuevo formato y mostrar la imagen. Por lo tanto, si alguien inventa un nuevo algoritmo de compresin para imgenes, el inventor slo necesita estar seguro de que hay una copia en cdigo Java de ese algoritmo instalado en el servidor que contiene las imgenes que quiere publicar. Es decir, los navegadores GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
con soporte Java se actualizan a s mismos sobre la marcha, cuando encuentran un nuevo tipo de fichero o algoritmo.
CARACTERISTICAS DE JAVA
Las caractersticas principales que nos ofrece Java respecto a cualquier otro lenguaje de programacin, son:
SIMPLE: Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las caractersticas menos usadas y ms confusas de stos. C++ es un lenguaje que adolece de falta de seguridad, pero C y C++ son lenguajes ms difundidos, por ello Java se dise para ser parecido a C++ y as facilitar un rpido y fcil aprendizaje. Java elimina muchas de las caractersticas de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y aadir caractersticas muy tiles como el garbage collector (reciclador de memoria dinmica). No es necesario preocuparse de liberar memoria, el reciclador se encarga de ello y como es un thread de baja prioridad, cuando entra en accin, permite liberar bloques de memoria muy grandes, lo que reduce la fragmentacin de la memoria. Java reduce en un 50% los errores ms comunes de programacin con lenguajes como C y C++ al eliminar muchas de las caractersticas de stos, entre las que destacan: 9 aritmtica de punteros 9 no existen referencias 9 registros (struct) 9 definicin de tipos (typedef) 9 macros (#define) 9 necesidad de liberar memoria (free) Aunque, en realidad, lo que hace es eliminar las palabras reservadas (struct, typedef), ya que las clases son algo parecido. Adems, el intrprete completo de Java que hay en este momento es muy pequeo, solamente ocupa 215 Kb de RAM.
ORIENTADO A OBJETOS: Java implementa la tecnologa bsica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos y con interfaces a esos objetos. Soporta las tres caractersticas propias del paradigma de la orientacin a objetos: encapsulacin, herencia y polimorfismo. Las plantillas de objetos son llamadas, como en C++, clases y sus copias, instancias . Estas instancias, como en C++, necesitan ser construidas y destruidas en espacios de memoria. Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolucin dinmica de mtodos. Esta caracterstica deriva del lenguaje Objective C, propietario del sistema operativo Next. En C++ se suele trabajar con libreras dinmicas (DLLs) que obligan a recompilar la aplicacin cuando se retocan las funciones que se encuentran en su interior. Este inconveniente es resuelto por Java mediante una interfaz especfica llamada RTTI (RunTime Type Identification) que define la interaccin entre objetos excluyendo variables de instancias o implementacin de mtodos. Las clases en Java tienen una representacin en el runtime que permite a los programadores interrogar por el tipo de clase y enlazar dinmicamente la clase con el resultado de la bsqueda.
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulC
DISTRIBUIDO: Java se ha construido con extensas capacidades de i acceder e interactuar con protocolos como travs de la red con tanta facilidad como a los ficheros locales. La verdad es que Java en s no es distribuido, sino programas puedan ser distribuidos, es decir, que se
ROBUSTO: Java realiza verificaciones en busca de problemas tanto en ejecucin. La comprobacin de tipos en Java ayuda a Java obliga a la declaracin explcita de mtodos, eliminar las preocupaciones por parte del programad implementa los arrays autnticos, en vez de listas enlazadas de punteros, con comprob posibilidad de sobrescribir o corromper memoria resultado de punteros que seal caractersticas reducen drsticamente el tiempo de Adems, para asegurar el funcionamiento de la aplicacin, realiza una verific son el resultado de la compilacin de un programa J intrprete Java. No es el cdigo mquina directamen fases del compilador: anlisis de instrucciones, or rdenes. Java proporciona, pues: 9 Comprobacin de punteros 9 Comprobacin de lmites de arrays 9 Excepciones 9 Verificacin de byte-codes
ARQUITECTURA NEUTRAL: Para establecer Java como parte integral de la red, el compilador Java compila su cdigo a un fichero objeto de formato independiente de la arquitectura de la mquina en que se ejecutar. Cualquier mquina que tenga el sistema de ejecucin (run-time) puede ejecutar ese cdigo objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas.
El cdigo fuente Java se "compila" a un cdigo de bytes de alto nivel independiente de la mquina. Este cdigo (byte-codes) est diseado para ejecutarse en una mquina por un sistema run-time, que s es dependiente de la mq En una representacin en que tuvisemos que indicar arquitectura de Java sobre una plataforma genrica, GUIA DE JAVA nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn Java se ha construido con extensas capacidades de interconexin TCP/IP. Existen libreras de rutinas pa acceder e interactuar con protocolos como http y ftp . Esto permite a los programadores acceder a la inf d como a los ficheros locales. La verdad es que Java en s no es distribuido, sino que proporciona las libreras y herramientas para programas puedan ser distribuidos, es decir, que se corran en varias mquinas, interactuando. liza verificaciones en busca de problemas tanto en tiempo de compilacin como en tiempo de ejecucin. La comprobacin de tipos en Java ayuda a detectar errores, lo antes posible, en el ciclo de Java obliga a la declaracin explcita de mtodos, reduciendo as las posibilidades de error. Maneja l eliminar las preocupaciones por parte del programador de la liberacin o corrupcin de memoria. Tambin en vez de listas enlazadas de punteros, con comprobacin de lmites, para evitar la o corromper memoria resultado de punteros que sealan a zonas equivocadas. Estas caractersticas reducen drsticamente el tiempo de desarrollo de aplicaciones en Java. uncionamiento de la aplicacin, realiza una verificacin de los son el resultado de la compilacin de un programa Java. Es un cdigo de mquina virtual que es interpr intrprete Java. No es el cdigo mquina directamente entendible por el hardware, pero ya ha pasado todas las fases del compilador: anlisis de instrucciones, orden de operadores, etc., y ya tiene generada la pil e arrays Para establecer Java como parte integral de la red, el compilador Java compila su cdigo a un fichero objeto de formato independiente de la arquitectura de la mquina en que se ejecutar. Cualquier mquina que tenga el sistema de ejecutar ese cdigo objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas. El cdigo fuente Java se "compila" a un cdigo de bytes de alto nivel independiente de la codes) est diseado para ejecutarse en una mquina hipottica que es implementada time, que s es dependiente de la mquina. En una representacin en que tuvisemos que indicar todos los elementos que forman parte de la arquitectura de Java sobre una plataforma genrica, obtendramos una figura como la siguiente: Prof. Lisbeth Guerra MAS uL LA 8CC8AMAClCn
nterconexin TCP/IP. Existen libreras de rutinas para . Esto permite a los programadores acceder a la informacin a que proporciona las libreras y herramientas para que los tiempo de compilacin como en tiempo de detectar errores, lo antes posible, en el ciclo de desarrollo. reduciendo as las posibilidades de error. Maneja la memoria para or de la liberacin o corrupcin de memoria. Tambin acin de lmites, para evitar la an a zonas equivocadas. Estas acin de los byte-codes , que ava. Es un cdigo de mquina virtual que es interpretado por el ible por el hardware, pero ya ha pasado todas las den de operadores, etc., y ya tiene generada la pila de ejecucin de hipottica que es implementada todos los elementos que forman parte de la obtendramos una figura como la siguiente: GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
En ella podemos ver que lo verdaderamente dependiente del sistema es la Mquina Virtual Java (JVM) y las libreras fundamentales, que tambin nos permitiran acceder directamente al hardware de la mquina. Adems, habr APIs de Java que tambin entren en contacto directo con el hardware y sern dependientes de la mquina, como ejemplo de este tipo de APIs podemos citar: 9 Java 2D: grficos 2D y manipulacin de imgenes 9 Java Media Framework: Elementos crticos en el tiempo: audio, video... 9 Java Animation: Animacin de objetos en 2D 9 Java Telephony: Integracin con telefona 9 Java Share: Interaccin entre aplicaciones multiusuario 9 Java 3D: Grficos 3D y su manipulacin
SEGURO: La seguridad en Java tiene dos facetas. En el lenguaje, caractersticas como los punteros o el casting implcito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso ilegal a la memoria. Cuando se usa Java para crear un navegador, se combinan las caractersticas del lenguaje con protecciones de sentido comn aplicadas al propio navegador. El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los errores de alineacin. Los programadores de C utilizan punteros en conjuncin con operaciones aritmticas. Esto le permite al programador que un puntero referencie a un lugar conocido de la memoria y pueda sumar (o restar) algn valor, para referirse a otro lugar de la memoria. Si otros programadores conocen nuestras estructuras de datos pueden extraer informacin confidencial de nuestro sistema. Con un lenguaje como C, se pueden tomar nmeros enteros aleatorios y convertirlos en punteros para luego acceder a la memoria: printf( "Escribe un valor entero: " ); scanf( "%u",&puntero ); printf( "Cadena de memoria: %sn",puntero ); Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya. Se presenta un programa como una utilidad, resultando tener una funcionalidad destructiva. Por ejemplo, en UNIX se visualiza el contenido de un directorio con el comando ls. Si un programador deja un comando destructivo bajo esta referencia, se puede correr el riesgo de ejecutar cdigo malicioso, aunque el comando siga haciendo la funcionalidad que se le supone, despus de lanzar su carga destructiva. Por ejemplo, despus de que el caballo de Troya haya enviado por correo el GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
/etc/shadow a su creador, ejecuta la funcionalidad de ls presentando el contenido del directorio. Se notar un retardo, pero nada inusual. El cdigo Java pasa muchos tests antes de ejecutarse en una mquina. El cdigo se pasa a travs de un verificador de byte-codes que comprueba el formato de los fragmentos de cdigo y aplica un probador de teoremas para detectar fragmentos de cdigo ilegal -cdigo que falsea punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto-. Si los byte-codes pasan la verificacin sin generar ningn mensaje de error, entonces sabemos que: 9 El cdigo no produce desbordamiento de operandos en la pila 9 El tipo de los parmetros de todos los cdigos de operacin son conocidos y correctos 9 No ha ocurrido ninguna conversin ilegal de datos, tal como convertir enteros en punteros 9 El acceso a los campos de un objeto se sabe que es legal: public, private, protected 9 No hay ningn intento de violar las reglas de acceso y seguridad establecidas El Cargador de Clases tambin ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local, del de los recursos procedentes de la red. Esto limita cualquier aplicacin del tipo Caballo de Troya, ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior. Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida. En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interaccin de ciertos virus. Java no posee una semntica especfica para modificar la pila de programa, la memoria libre o utilizar objetos y mtodos de un programa sin los privilegios del kernel del sistema operativo. Adems, para evitar modificaciones por parte de los crackers de la red, implementa un mtodo ultraseguro de autentificacin por clave pblica. El Cargador de Clases puede verificar una firma digital antes de realizar una instancia de un objeto. Por tanto, ningn objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilacin, con el nivel de detalle y de privilegio que sea necesario. Dada, pues la concepcin del lenguaje y si todos los elementos se mantienen dentro del estndar marcado por Sun, no hay peligro. Java imposibilita, tambin, abrir ningn fichero de la mquina local (siempre que se realizan operaciones con archivos, stas trabajan sobre el disco duro de la mquina de donde parti el applet), no permite ejecutar ninguna aplicacin nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra mquina para hacer peticiones o realizar operaciones con otra. Adems, los intrpretes que incorporan los navegadores de la Web son an ms restrictivos. Bajo estas condiciones (y dentro de la filosofa de que el nico ordenador seguro es el que est apagado, desenchufado, dentro de una cmara acorazada en un bunker y rodeado por mil soldados de los cuerpos especiales del ejrcito), se puede considerar que Java es un lenguaje seguro y que los applets estn libres de virus. Respecto a la seguridad del cdigo fuente, no ya del lenguaje, JDK proporciona un desemsamblador de byte-code, que permite que cualquier programa pueda ser convertido a cdigo fuente, lo que para el programador significa una vulnerabilidad total a su cdigo. Utilizando javap no se obtiene el cdigo fuente original, pero s desmonta el programa mostrando el algoritmo que se utiliza, que es lo realmente interesante. La proteccin de los programadores ante esto es utilizar llamadas a programas nativos, externos (incluso en C o C++) de forma que no sea descompilable todo el cdigo; aunque as se pierda portabilidad. Esta es otra de las cuestiones que Java tiene pendientes.
PORTABLE: Ms all de la portabilidad bsica por ser de arquitectura independiente, Java implementa otros estndares de portabilidad para facilitar el desarrollo. Los enteros son siempre enteros y adems, enteros de 32 bits en GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
complemento a 2. Adems, Java construye sus interfaces de usuario a travs de un sistema abstracto de ventanas de forma que las ventanas puedan ser implantadas en entornos Unix, Pc o Mac.
INTERPRETADO: El intrprete Java (sistema run-time) puede ejecutar directamente el cdigo objeto. Enlazar (linkar) un programa, normalmente, consume menos recursos que compilarlo, por lo que los desarrolladores con Java pasarn ms tiempo desarrollando y menos esperando por el ordenador. No obstante, el compilador actual del JDK es bastante lento. Por ahora, que todava no hay compiladores especficos de Java para las diversas plataformas, Java es ms lento que otros lenguajes de programacin, como C++, ya que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional. Se dice que Java es de 10 a 30 veces ms lento que C, y que tampoco existen en Java proyectos de gran envergadura como en otros lenguajes. La verdad es que ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programacin, y una ingente cantidad de folletos electrnicos que supuran fanatismo en favor y en contra de los distintos lenguajes contendientes con Java. Lo que se suele dejar de lado en todo esto, es que primero habra que decidir hasta que punto Java, un lenguaje en pleno desarrollo y todava sin definicin definitiva, est maduro como lenguaje de programacin para ser comparado con otros; como por ejemplo con Smalltalk, que lleva ms de 20 aos en cancha. La verdad es que Java para conseguir ser un lenguaje independiente del sistema operativo y del procesador que incorpore la mquina utilizada, es tanto interpretado como compilado. Y esto no es ningn contrasentido, me explico, el cdigo fuente escrito con cualquier editor se compila generando el byte-code. Este cdigo intermedio es de muy bajo nivel, pero sin alcanzar las instrucciones mquinas propias de cada plataforma y no tiene nada que ver con el p-code de Visual Basic. El byte-code corresponde al 80% de las instrucciones de la aplicacin. Ese mismo cdigo es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run-time, que s es completamente dependiente de la mquina y del sistema operativo, que interpreta dinmicamente el byte-code y aade el 20% de instrucciones que faltaban para su ejecucin. Con este sistema es fcil crear aplicaciones multiplataforma, pero para ejecutarlas es necesario que exista el run-time correspondiente al sistema operativo utilizado.
MULTITHREADED: Al ser multithreaded (multihilvanado, en mala traduccin), Java permite muchas actividades simultneas en un programa. Los threads (a veces llamados, procesos ligeros), son bsicamente pequeos procesos o piezas independientes de un gran proceso. Al estar los threads contruidos en el lenguaje, son ms fciles de usar y ms robustos que sus homlogos en C o C++. El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real est limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), an supera a los entornos de flujo nico de programa (single-threaded) tanto en facilidad de desarrollo como en rendimiento. Cualquiera que haya utilizado la tecnologa de navegacin concurrente, sabe lo frustrante que puede ser esperar por una gran imagen que se est trayendo. En Java, las imgenes se pueden ir trayendo en un thread independiente, permitiendo que el usuario pueda acceder a la informacin en la pgina sin tener que esperar por el navegador.
DINAMICO: Java se beneficia todo lo posible de la tecnologa orientada a objetos. Java no intenta conectar todos los mdulos que comprenden una aplicacin hasta el tiempo de ejecucin. Las librera nuevas o actualizadas no paralizarn las aplicaciones actuales (siempre que mantengan el API anterior).
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulC
Java tambin simplifica el uso de protocolos nuevos Java sobre la red y encuentra una pieza de la aplic anteriores, Java es capaz de traer a funcionar.
Java, para evitar que los mdulos de byte de la red cada vez que se necesiten, implementa las limpie la cach de la mquina.
Conjunto de programas que usa un programador para c constructor grfico, un compilador y un enlazador. web de SUN. Es la distribucin base que cualquier kit de Java necesitar. Se puede http://java.sun.com/j2se/1.4.2/download.html Adems, en esa misma direccin la tarea de programar, compilar y resolver errores lenguajes ms populares y existen multitud de edito Visual J++ y por supuesto el propio NetBeans, de SU GUIA DE JAVA nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn Java tambin simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta una aplicaci Java sobre la red y encuentra una pieza de la aplicacin que no sabe manejar, tal como se ha explicado anteriores, Java es capaz de traer automticamente cualquiera de esas piezas que el sis Java, para evitar que los mdulos de byte-codes o los objetos o nuevas clases, haya que estar de la red cada vez que se necesiten, implementa las opciones de persistencia, para que no se eliminen INSTALACION DEL JSDK Conjunto de programas que usa un programador para crear una aplicacin. Consta de un editor, un constructor grfico, un compilador y un enlazador. El SDK de Java (JSDK) se proporciona gratuitamente d base que cualquier kit de Java necesitar. Se puede obtener desde aqu http://java.sun.com/j2se/1.4.2/download.html Adems, en esa misma direccin se puede descargar el NetBeans, un potente editor de Java que la tarea de programar, compilar y resolver errores entre otras muchas cosas. Java es actualmente uno d lenguajes ms populares y existen multitud de editores para l. Los ms conocidos son el JDeveloper, J Visual J++ y por supuesto el propio NetBeans, de SUN. Prof. Lisbeth Guerra MAS uL LA 8CC8AMAClCn
o actualizados. Si su sistema ejecuta una aplicacin acin que no sabe manejar, tal como se ha explicado en prrafos utomticamente cualquiera de esas piezas que el sistema necesita para
codes o los objetos o nuevas clases, haya que estar trayndolos opciones de persistencia, para que no se eliminen cuando de rear una aplicacin. Consta de un editor, un l SDK de Java (JSDK) se proporciona gratuitamente desde la obtener desde aqu otente editor de Java que facilitar entre otras muchas cosas. Java es actualmente uno de los res para l. Los ms conocidos son el JDeveloper, JBuilder, GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Sin embargo, aqu trataremos solo el uso del SDK, sin editor, ya que es lo ms recomendable. Si sabemos utilizar el SDK sin herramientas adicionales, tendremos mayor facilidad para usar cualquier editor y siempre que estemos faltos de algn editor, podremos salir del paso sin l. Las herramientas que trae el SDK y que ms utilizaremos son: 9 java (ejecutable): Ejecuta cualquier programa compilado de Java 9 javac (compilador): Compilar el cdigo fuente escrito en Java. Java no se ofrece de forma gratuita. No todas las mquinas disponen de la versin del Java Development Kit para ejecutarse en ellas. Por ello, solamente se comenta la instalacin de JDK en Solaris, Windows y Linux. Actualmente ya hay entornos de desarrollo integrados completos para Java, diferentes del JDK de Sun. Oracle dispone de un entorno de desarrollo de Java, la propia SUN ofrece el entorno NetBeans y Borland posee el JBuilder. Adems Microsoft ofrece soporte Java en su plataforma .NET. No obstante, trataremos solamente el JDK. El entorno bsico del JDK de Java que proporciona Sun est formado por herramientas en modo texto, que son: java, intrprete que ejecuta programas en byte-code. Javac, compilador de Java que convierte el cdigo fuente en byte-code. Javah, crea ficheros de cabecera para implementar mtodos para cualquier clase. Javap, es un descompilador de byte-code a cdigo fuente Java. Javadoc, es un generador automtico de documentos HTML a partir del cdigo fuente Java. Javaprof, es un profiler para aplicaciones de un solo thread. El entorno habitual consiste en un navegador que pueda ejecutar applets, un compilador que convierta el cdigo fuente Java a byte-code y el intrprete Java para ejecutar los programas. Estos son los componenetes bsicos para desarrollar algo en Java. No obstante se necesita un editor para escribir el cdigo fuente, y no son estrictamente necesarias otras herramientas como el debugger, un entorno visual, la documentacin o un visualizador de jerarqua de clases. Cualquier navegador actual servir para mostrar los Applets Java que realicemos. La instalacin en un principio es como la de cualquier otro programa, pero una vez lo hayamos instalado tenemos que incluir en el path del sistema operativo la ruta hacia el directorio bin. Por ejemplo si hemos instalado Java en: c: java En el PATH de nuestro sistema operativo debe estar presente la ruta: c: javabin
CONCEPTOS BASICOS
Java es un lenguaje orientado a objetos, que se deriva en alto grado de C++, de tal forma que puede ser considerado como un C++ nuevo y modernizado o bien como un C++ al que se le han amputado elementos heredados del lenguaje estructurado C.
TOKENS Un token es el elemento ms pequeo de un programa que es significativo para el compilador. Estos tokens definen la estructura de Java. Cuando se compila un programa Java, el compilador analiza el texto, reconoce y elimina los espacios en blanco y comentarios y extrae tokens individuales. Los tokens resultantes se compilan, traducindolos a cdigo de byte Java, que es independiente del sistema e interpretable dentro de un entorno Java. Los cdigos de byte se ajustan al sistema de mquina virtual Java, que abstrae las diferencias entre procesadores a un procesador virtual nico. GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Los tokens Java pueden subdividirse en cinco categoras: Identificadores, palabras clave, constantes, operadores y separadores. a.) Identificadores Los identificadores son tokens que representan nombres asignables a variables, mtodos y clases para identificarlos de forma nica ante el compilador y darles nombres con sentido para el programador. Todos los identificadores de Java diferencian entre maysculas y minsculas (Java es Case Sensitive o Sensible a maysculas) y deben comenzar con una letra, un subrayado(_) o smbolo de dlar($). Los caracteres posteriores del identificador pueden incluir las cifras del 0 al 9. Como nombres de identificadores no se pueden usar palabras claves de Java. Adems de las restricciones mencionadas existen propuestas de estilo. Es una prctica estndar de Java denominar: Las clases: Clase o MiClase. Las interfaces: Interfaz o MiInterfaz. Los mtodos: metodo () o metodoLargo (). Las variables: altura o alturaMedia. Las constantes: CONSTATE o CONSTANTE_LARGA. Los paquetes: java.paquete.subpaquete. Sin entrar en ms detalle en la siguiente lnea de cdigo se puede apreciar la declaracin de una variable entera (int) con su correspondiente identificador: Int alturaMedia; b.) Palabras clave Las palabras claves son aquellos identificadores reservados por Java para un objetivo determinado y se usan slo de la forma limitada y especfica. Java tiene un conjunto de palabras clave ms rico que C o que C++, por lo que s est aprendiendo Java con conocimientos de C o C++, asegrese de que presta atencin a las palabras clave de Java. Las siguientes palabras son palabras reservadas de Java: abstact boolean break byte byvalue case cast catch char class const continue default do double else extends false final finally float for future generic goto GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
if implements import inner instanceof int interface long native new null operator outer package private protected public rest return short static super switch syncroniced this throw throws transient true try var void volatile while Las palabras subrayadas son palabras reservadas pero no se utilizan. La definicin de estas palabras clave no se ha revelado, ni se tiene un calendario respecto a cundo estar alguna de ellas en la especificacin o en alguna de las implementaciones de Java. c.) Literales y constantes Los literales son sintaxis para asignar valores a las variables. Cada variable es de un tipo de datos concreto, y dichos tipos de datos tienen sus propios literales. Mediante determinados modificadores (static y final) podremos crear variables constantes, que no modifican su valor durante la ejecucin de un programa. Las constantes pueden ser numricas, booleanas, caracteres (Unicode) o cadenas (String). Las cadenas, que contienen mltiples caracteres, an se consideran constantes, aunque estn implementadas en Java como objetos. Veamos un ejemplo de constante declarada por el usuario: final static int ALTURA_MAXIMA = 200; Se puede observar que utilizamos final static, para que la variable sea total y absolutamente invariable. d.) Operadores Conocidos tambin como operandos, indican una evaluacin o computacin para ser realizada en objetos o datos, y en definitiva sobre identificadores o constantes. Los operadores admitidos por Java son: + ^ <= ++ %= >>>= - ~ >= - &= . * && << == <<= [ / || >> += ^= ] % GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
! >>> = != ( & < *= ) | > ?!! /= >> As por ejemplo el siguiente fragmento de cdigo incrementa el valor de una variable en dos unidades, mediante la utilizacin del operador aritmtico + que se utiliza para la suma: int miNumero=0; miNumero = miNumero + 2; e.) Separadores Se usan para informar al compilador de Java de cmo estn agrupadas las cosas en el cdigo. Los separadores admitidos por Java son: { } , : ; f.) Comentarios y espacios en blanco El compilador de Java reconoce y elimina los espacios en blanco, tabuladores, retornos de carro y comentarios durante el anlisis del cdigo fuente. Los comentarios se pueden presentar en tres formatos distintos: Formato Uso /*comentario*/ Se ignoran todos los caracteres entre /* */. Proviene del C //comentario Se ignoran todos los caracteres detrs de // hasta el fin de lnea. Proviene del C++ /**comentario*/ Lo mismo que /* */ pero se podrn utilizar para documentacin automtica. Por ejemplo la siguiente lnea de cdigo presenta un comentario: int alturaMinima = 150; // No menos de 150 centmetros
EXPRESIONES Los operadores, variables y las llamadas a mtodos pueden ser combinadas en secuencias conocidas como expresiones. El comportamiento real de un programa Java se logra a travs de expresiones, que se agrupan para crear sentencias. GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Una expresin es una serie de variables, operadores y llamadas a mtodos (construida conforme a la sintaxis del lenguaje) que se evala a un nico valor. Entre otras cosas, las expresiones son utilizadas para realizar clculos, para asignar valores a variables, y para ayudar a controlar la ejecucin del flujo del programa. La tarea de una expresin se compone de dos partes: realiza el clculo indicado por los elementos de la expresin y devuelve el valor obtenido como resultado del clculo. Los operadores devuelven un valor, por lo que el uso de un operador es una expresin. Por ejemplo, la siguiente sentencia es una expresin: int contador=1; contador++; La expresin contador++ en este caso particular se evala al valor 1, que era el valor de la variable contador antes de que la operacin ocurra, pero la variable contador adquiere un valor de 2. El tipo de datos del valor devuelto por una expresin depende de los elementos utilizados en la expresin. La expresin contador++ devuelve un entero porque ++ devuelve un valor del mismo tipo que su operando y contador es un entero. Otras expresiones devuelven valores booleanos, cadenas... Una expresin de llamada a un mtodo se evala al valor de retorno del mtodo; as el tipo de dato de la expresin de llamada a un mtodo es el mismo que el tipo de dato del valor de retorno de ese mtodo. Otra sentencia interesante sera: in.read( ) != -1 // in es un flujo de entrada Esta sentencia se compone de dos expresiones: 1. La primera expresin es una llamada al mtodo in.read(). El mtodo in.read() ha sido declarado para devolver un entero, por lo que la expresin in.read() se evala a un entero. 2. La segunda expresin contenida en la sentencia utiliza el operador !=, que comprueba si dos operandos son distintos. En la sentencia en cuestin, los operandos son in.read() y -1. El operando in.read() es vlido para el operador != porque in.read() es una expresin que se evala a un entero, as que la expresin in.read()!=- 1 compara dos enteros. El valor devuelto por esta expresin ser verdadero o falso dependiendo del resultado de la lectura del fichero in. Como se puede observar, Java permite construir sentencias (expresiones compuestas) a partir de varias expresiones ms pequeas con tal que los tipos de datos requeridos por una parte de la expresin concuerden con los tipos de datos de la otra.
GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
BLOQUES Y MBITO En Java el cdigo fuente est dividido en partes separadas por llaves, denominas bloques. Cada bloque existe independiente de lo que est fuera de l, agrupando en su interior sentencias (expresiones) relacionadas. Desde un bloque externo parece que todo lo que est dentro de llaves se ejecuta como una sentencia. Pero, qu es un bloque externo? Esto tiene explicacin si entendemos que existe una jerarqua de bloques, y que un bloque puede contener uno o ms subbloques anidados. El concepto de mbito est estrechamente relacionado con el concepto de bloque y es muy importante cuando se trabaja con variables en Java. El mbito se refiere a cmo las secciones de un programa (bloques) afectan el tiempo de vida de las variables. Toda variable tiene un mbito, en el que es usada, que viene determinado por los bloques. Una variable definida en un bloque interno no es visible por el bloque externo. Las llaves de separacin son importantes no slo en un sentido lgico, ya que son la forma de que el compilador diferencie dnde acaba una seccin de cdigo y dnde comienza otra, sino que tienen una connotacin esttica que facilita la lectura de los programas al ser humano. As mismo, para identificar los diferentes bloques se utilizan sangras. Las sangras se utilizan para el programador, no para el compilador. La sangra (tambin denominada indentacin) ms adecuada para la esttica de un programa Java son dos espacios: { // Bloque externo int x = 1; { // Bloque interno invisible al exterior int y = 2; } x = y; // Da error: Y fuera de mbito }
GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
TIPOS DE VARIABLES Una variable es un contenedor de bits que representan a un valor. Se emplean para almacenar datos que pueden cambiar durante la ejecucin de un programa. En funcin de los datos que almacenan se clasifican en: Variables primitivas: almacenan datos numricos, valores lgicos o caracteres. Variables referenciadas: asociadas a objetos o instancias de una clase. Por ejemplo, para almacenar cadenas de caracteres se emplear una variable referenciada asociada a la clase String, para almacenar informacin sobre la fecha actual, otra asociada a la clase Date, etc. Se estudiarn ms adelante. Todos los nombres empleados para hacer referencia a variables deben cumplir lo siguiente: 9 Su primer carcter debe ser una letra, el smbolo del subrayado o el carcter dlar $. 9 No son vlidos las palabras reservadas de Java. 9 No se admiten espacios en blanco. 9 Son case-sensitive (sensibles a maysculas). Aparte de estas normas conviene que los nombres de las variables indiquen qu dato almacenan con el fin de facilitar la lectura del programa y, por otra parte, si un nombre tiene ms de dos palabras la primera letra de la primera palabra ir en minscula, la primera letra de la segunda palabra en mayscula, dem con la tercera y as sucesivamente. Ejemplo: int miVariableEntera=100; Variables primitivas De tipo entero: Son variables que almacenan nmeros enteros. Se pueden dividir en los siguientes tipos:
NOTA: el tipo de variable en que se almacena por defecto un nmero entero es int. El valor por defecto asociado a cualquier variable entera no inicializada es 0. GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
De tipo real o de coma flotante: Son variables que almacenan datos numricos con decimales. Se pueden dividir en los siguientes tipos:
NOTA: el tipo de variable en que se almacena por defecto un numero decimal es double. El valor por defecto asociado a cualquier variable real no inicializada es 0.0. De tipo lgico o booleanas: Son variables que almacenan dos posibles valores: true o false. No se corresponden con ningn valor numrico. Ejemplo: boolean tienesCalor=true; NOTA: el valor por defecto asociado a cualquier variable booleana no inicializada es false. De tipo char o de carcter: Son variables que almacenan caracteres individuales (letra, numero, signo ?, etc...). El carcter que se inicializa debe ir entre apstrofes o comillas simples 'a'. El cdigo de caracteres empleado por Java es Unicode y recoge los caracteres de prcticamente todos los idiomas importantes del mundo (son unos 65.536). Los caracteres Unicode del alfabeto occidental corresponden a los primeros 256 enteros; es decir van desde [0, 255]. A cada carcter le corresponde unvocamente un nmero entero perteneciente al intervalo [0, 65536] o a [0, 255] si se trabaja slo con el alfabeto occidental. Por ejemplo, la letra es el entero 164. Ms adelante se ver que el casting entre variables primitivas enteras y la variable char est permitido. Ejemplo: char miCaracter='n'; char miCaracter1=110; (dem antes, pero mediante el entero que le corresponde segn Unicode) char miCaracter2='\u006E'; (dem antes, pero segn notacin Unicode. La notacin Unicode, en general, es as: \uXXXX siendo X un dgito o cifra fundamental del sistema de numeracin hexadecimal (0,1,2,...,9,A,B,...,F)) Asociado a este tipo de variable se tienen las secuencias de escape. Se emplean para representar caracteres especiales (por ejemplo, unas comillas dentro de una instruccin que exige una cadena entrecomillada) y GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
caracteres no imprimibles como el tabulador, salto de lnea, etc. Van precedidos de la contrabarra. Algunos de ellos se detallan en la tabla siguiente:
OPERADORES
Operadores aritmticos Operador Uso Descripcin + op1 + op2 Suma op1 y op2 - op1 - op2 Resta op2 de op1 * op1 * op2 Multiplica op1 por op2 / op1 / op2 Divide op1 por op2 % op1 % op2 Calcula el resto de dividir op1 entre op2 El lenguaje Java sobrecarga la definicin del operador + para incluir la concatenacin de cadenas. El siguiente ejemplo utiliza + para concatenar la cadena "Contados ", con el valor de la variable contador y la cadena " caracteres.": System.out.print("Contados" + contador + "caracteres."); Esta operacin automticamente convierte el valor de contador a una cadena de caracteres. Los operadores + y - tienen versiones unarias que realizan las siguientes operaciones: Operador Uso Descripcin + +op Convierte op a entero si es un byte, short o char - -op Niega aritmticamente op
NOTA: el valor por defecto asociado a cualquier variable char no inicializada es '\u0000' GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Existen dos operadores aritmticos que funcionan como atajo de la combinacin de otros: ++ que incrementa su operando en 1, y -- que decrementa su operando en 1. Ambos operadores tienen una versin prefija, y otra posfija. La utilizacin la correcta es crtica en situaciones donde el valor de la sentencia es utilizado en mitad de un clculo ms complejo, por ejemplo para control de flujos: Operador Uso Descripcin ++ op++ Incrementa op en 1; se evala al valor anterior al incremento ++ ++op Incrementa op en 1; se evala al valor posterior al incremento -- op-- Decrementa op en 1; se evala al valor anterior al incremento -- --op Decrementa op en 1; se evala al valor posterior al incremento
Operadores de comparacin y condicionales Un operador de comparacin compara dos valores y determina la relacin existente entre ambos. Por ejemplo, el operador!= devuelve verdadero (true) si los dos operandos son distintos. La siguiente tabla resume los operadores de comparacin de Java: Operador Uso Devuelve verdadero si > op1 > op2 op1 es mayor que op2 >= op1 >= op2 op1 es mayor o igual que op2 < op1 < op2 op1 es menor que op2 <= op1 <= op2 op1 es menor o igual que op2 == op1 == op2 op1 y op2 son iguales != op1 != op2 op1 y op2 son distintos Los operadores de comparacin suelen ser usados con los operadores condicionales para construir expresiones complejas que sirvan para la toma de decisiones. Un operador de este tipo es &&, el cual realiza la operacin booleana and. Por ejemplo, se pueden utilizar dos operaciones diferentes de comparacin con && para determinar si ambas relaciones son ciertas NOTA: Si el programador quiere que se evale la parte derecha, deber utilizar el operador & en lugar de &&. De la misma manera se relacionan los operadores || y | para la exclusin lgica (OR).
GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Java soporta cinco operadores condicionales, mostrados en la siguiente tabla: Operador Uso Devuelve verdadero si... && op1 && op2 op1 y op2 son ambos verdaderos, condicionalmente evala op2 & op1 & op2 op1 y op2 son ambos verdaderos, siempre evala op1 y op2 || op1 || op2 op1 o op2 son verdaderos, condicionalmente evala op2 | op1 | op2 op1 o op2 son verdaderos, siempre evala op1 y op2 ! ! op op es falso
Operadores de bit Un operador de bit permite realizar operaciones de bit sobre los datos. Existen dos tipos: los que desplazan (mueven) bits, y operadores lgicos de bit. a.) Operadores de desplazamiento de bits Operador Uso Operacin >> op1 >> op2 Desplaza los bits de op1 a la derecha op2 veces << op1 << op2 Desplaza los bits de op1 a la izquierda op2 veces >>> op1 >>> op2 Desplaza los bits de op1 a la derecha op2 veces (sin signo) Los tres operadores de desplazamiento simplemente desplazan los bits del operando de la parte izquierda el nmero de veces indicado por el operando de la parte derecha. El desplazamiento ocurre en la direccin indicada por el operador. Por ejemplo, la siguiente sentencia, desplaza los bits del entero 13 a la derecha una posicin: 13 >> 1; La representacin en binario del nmero 13 es 1101. El resultado de la operacin de desplazamiento es 1101 desplazado una posicin a la derecha, 110 o 6 en decimal. Se debe tener en cuenta que el bit ms a la derecha se pierde en este caso. Un desplazamiento a la derecha una posicin es equivalente a dividir el operando del lado izquierdo por 2, mientras que un desplazamiento a la izquierda de una posicin equivale a multiplicar por 2, pero un desplazamiento es ms eficiente, computacionalmente hablando, que una divisin o multiplicacin. El desplazamiento sin signo >>> funciona de la siguiente manera: Si se desplaza con signo el nmero -1 (1111), seguir valiendo -1, dado que la extensin de signo sigue introduciendo unos en los bits ms significativos. GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Con el desplazamiento sin signo se consigue introducir ceros por la izquierda, obteniendo el nmero 7 (0111). Este tipo de desplazamientos es especialmente til en la utilizacin de mscaras grficas.
b.) Operadores de lgica de bits La lgica de bits (lgica de Bool) se utiliza para modelizar condiciones biestado y trabajar con ellas (cierto/falso, true/false, 1/0). En Java hay cuatro operadores de lgica de bits: Operador Uso Operacin & op1 & op2 AND | op1 | op2 OR ^ op1 ^ op2 OR Exclusivo ~ ~op2 Complemento
Operadores de asignacin El operador de asignacin bsico es el =, que se utiliza para asignar un valor a otro. Por ejemplo: int contador = 0; Inicia la variable contador con un valor 0. Java adems proporciona varios operadores de asignacin que permiten realizar un atajo en la escritura de cdigo. Permiten realizar operaciones aritmticas, lgicas, de bit y de asignacin con un nico operador. Supongamos que necesitamos sumar un nmero a una variable y almacenar el resultado en la misma variable, como a continuacin: i = i + 2; Se puede abreviar esta sentencia con el operador de atajo +=, de la siguiente manera: i += 2; La siguiente tabla muestra los operadores de atajo de asignacin y sus equivalentes largos:
GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Operador Uso Equivalente a += op1 += op2 op1 = op1 + op2 -= op1 -= op2 op1 = op1 - op2 *= op1 *= op2 op1 = op1 * op2 /= op1 /= op2 op1 = op1 / op2 %= op1 %= op2 op1 = op1 % op2 &= op1 &= op2 op1 = op1 & op2 Precedencia de operadores Cuando en una sentencia aparecen varios operadores el compilador deber de elegir en qu orden aplica los operadores. A esto se le llama precedencia. Los operadores con mayor precedencia son evaluados antes que los operadores con una precedencia relativa menor. Cuando en una sentencia aparecen operadores con la misma precedencia: Los operadores de asignacin son evaluados de derecha a izquierda. Los operadores binarios, (menos los de asignacin) son evaluados de izquierda a derecha. Se puede indicar explcitamente al compilador de Java cmo se desea que se evale la expresin con parntesis balanceados ( ). Para hacer que el cdigo sea ms fcil de leer y mantener, es preferible ser explcito e indicar con parntesis que operadores deben ser evaluados primero. La siguiente tabla muestra la precedencia asignada a los operadores de Java. Los operadores de la tabla estn listados en orden de precedencia: cuanto ms arriba aparezca un operador, mayor es su precedencia. Los operadores en la misma lnea tienen la misma precedencia: Tipo de operadores Operadores de este tipo Operadores posfijos [ ] . (parametros) expr++ expr-- Operadores unarios ++expr --expr +expr -expr ~ ! Creacin o conversin new (tipo) expr Multiplicacin * / % Suma + - Desplazamiento << Comparacin < <= = instanceof Igualdad == != AND a nivel de bit & GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
OR a nivel de bit ^ XOR a nivel de bit | AND lgico && OR lgico || Condicional ? : Asignacin = += -= *= /= %= &= ^= |= <<= = =
ENTRADA Y SALIDA DE DATOS ESTANDAR (TECLADO Y MONITOR)
En Java, la entrada desde teclado y la salida a pantalla estn reguladas a travs de la clase System. Esta clase pertenece al paquete java.lang y agrupa diversos mtodos y objetos que tienen relacin con el sistema local. Contiene, entre otros, tres objetos static que son:
9 System.in: Objeto de la clase InputStream preparado para recibir datos desde la entrada estndar del sistema (habitualmente el teclado). 9 System.out: Objeto de la clase PrintStream que imprimir los datos en la salida estndar del sistema (normalmente asociado con la pantalla). 9 System.err: Objeto de la clase PrintStream. Utilizado para mensajes de error que salen tambin por pantalla por defecto.
Estas clases permiten la comunicacin alfanumrica con el programa a travs de lo mtodos incluidos en la Tabla Son mtodos que permiten la entrada/salida a un nivel muy elemental.
Mtodos elementales de lectura y escritura.
Existen tres mtodos de System que permiten sustituir la entrada y salida estndar. Por ejemplo, se utiliza para hacer que el programa lea de un archivo y no del teclado. 9 System.setIn(InputStream is); 9 System.setOut(PrintStream ps); 9 System.setErr(PrintStream ps);
El argumento de setIn() no tiene que ser necesariamente del tipo InputStream. Es una referencia a la clase base, y por tanto puede apuntar a objetos de cualquiera de sus clases derivadas (como FileInputStream). Asimismo, el constructor de PrintStream acepta un OutputStream, luego se puede dirigir la salida estndar a cualquiera de las clases definidas para salida.
GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Si se utilizan estas sentencias con un compilador de Java 1.1 se obtiene un mensaje de mtodo obsoleto (deprecated) al crear un objeto PrintStream. Al sealar como obsoleto el constructor de esta clase se pretenda animar al uso de PrintWriter, pero existen casos en los cuales es imprescindible un elemento PrintStream. Afortunadamente, Java 1.2 ha reconsiderado esta decisin y de nuevo se puede utilizar sin problemas.
SALIDA DE TEXTO Y VARIABLES POR PANTALLA
Para imprimir en la pantalla se utilizan los mtodos System.out.print() y System.out.println(). Son los primeros mtodos que aprende cualquier programador. Sus caractersticas fundamentales son: Pueden imprimir valores escritos directamente en el cdigo o cualquier tipo de variable primitiva de Java. System.out.println("Hola, Mundo!"); System.out.println(57); double numeroPI = 3.141592654; System.out.println(numeroPI); String hola = new String("Hola"); System.out.println(hola);
Se pueden imprimir varias variables en una llamada al mtodo correspondiente utilizando el operador + de concatenacin, que equivale a convertir a String todas las variables que no lo sean y concatenar las cadenas de caracteres (el primer argumento debe ser un String). System.out.println("Hola, Mundo! " + numeroPI); Se debe recordar que los objetos System.out y System.err son de la clase PrintStream y aunque imprimen las variables de un modo legible, no permiten dar a la salida un formato a medida. El programador no puede especificar un formato distinto al disponible por defecto.
LECTURA DESDE TECLADO Para leer desde teclado se puede utilizar el mtodo System.in.read() de la clase InputStream. Este mtodo lee un carcter por cada llamada. Su valor de retorno es un int. Si se espera cualquier otro tipo hay que hacer una conversin explcita mediante un cast. char c; c=(char)System.in.read();
Este mtodo puede lanzar la excepcin java.io.IOException y siempre habr que ocuparse de ella, por ejemplo en la forma:
try { c=(char)System.in.read(); } catch(java.io.IOException ioex) { // qu hacer cuando ocurra la excepcin } Para leer datos ms largos que un simple carcter es necesario emplear un bucle while o for y unir los caracteres. Por ejemplo, para leer una lnea completa se podra utilizar un bucle while guardando los caracteres ledos en un String o en un StringBuffer (ms rpido que String): GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Una vez que se lee una lnea, sta puede contener nmeros de coma flotante, etc. Sin embargo, hay una manera ms fcil de conseguir lo mismo: utilizar adecuadamente la librera java.io.
ESTRUCTURAS DE CONTROL Durante un programa existen acciones que se han de repetir un nmero determinado de veces. Por ejemplo, leer 3 caracteres de un flujo de entrada in se codificara: in.read(); in.read(); in.read(); Este cdigo adems de poco elegante sera inviable para una repeticin de 3000 lecturas. Por eso aparecen las estructuras de control, que facilitan que determinadas acciones se realicen varias veces, mientras que una condicin se cumpla, y en definitiva, tomar decisiones de qu hacer en funcin de las condiciones que se den en el programa en un momento dado de su ejecucin. Ejemplo: int i=0; for ( i=0 ; i <= 3 ; i++ ) in.read(); Donde bastara cambiar el 3 por cualquier otro nmero para que la lectura se repitiese ese nmero de veces.
GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
El lenguaje Java soporta las estructuras de control: Sentencia Clave Toma de decisin if-else, switch-case Bucle for, while, do-while Miscelneo break, continue, label:, return, goto Aunque goto es una palabra reservada, actualmente el lenguaje Java no soporta la sentencia goto. Se puede utilizar las sentencias de bifurcacin en su lugar. LAS SENTENCIAS CONDICIONALES: IF Y SWITCH A.) LA SENTENCIA IF - ELSE La sentencia if-else de Java dota a los programas de la habilidad de ejecutar distintos conjuntos de sentencias segn algn criterio. La sintaxis de la sentencia if-else es: if ( condicin ) Bloque de cdigo a ejecutar si la condicin es cierta else Bloque de cdigo a ejecutar si la condicin es falsa
La parte del else es opcional, y un bloque de cdigo puede ser simplemente la sentencia vaca; para representar que en ese caso no se ha de ejecutar nada. Supongamos que un programa debe realizar diferentes acciones dependiendo de si el usuario oprime el botn aceptar o el botn cancelar en una ventana de dialogo. Nuestro programa puede realizar esto usando la sentencia if - else: // La respuesta es Aceptar o Cancelar if (respuesta == Aceptar) { // cdigo para realizar la accin Aceptar System.out.println( "Su peticion esta siendo atendida" ); GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
} else { // cdigo para realizar la accin Cancelar System.out.println( "Cancelando accion" ); } Se pueden anidar expresiones if-else, para poder implementar aquellos casos con mltiples acciones. Esto es lo que se suele denominar como sentencias else if. Por ejemplo, supongamos que se desea escribir un programa que clasifique segn el contenido de una variable valor, asigne una letra a una variable clasificacion: A para un valor del 100-91, B de 90-81, C para 80-71 y F si no es ninguno de los anteriores: int valor; char clasificacion; if (valor > 90) {clasificacion='A';} else if (valor > 80) {clasificacion='B';} else if (valor > 70) {clasificacion='C';} else {clasificacion='F';} Se pueden escribir los if en las mismas lneas que los else, pero desde este tutorial se insta a utilizar la forma indentada (como se ha podido ver en el ejemplo), pues es ms clara para el lector. GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Este sistema de programacin (else if) no es demasiado recomendable, y por ello el lenguaje Java incluye la sentencia switch, que veremos a continuacin, para dirigir el flujo de control de variables con mltiples valores. B.) LA SENTENCIA SWITCH Mediante la sentencia switch se puede seleccionar entre varias sentencias segn el valor de cierta expresin. La forma general de switch es la siguiente: switch ( expresionMultivalor ) { case valor1 : conjuntoDeSentencias; break; case valor2 : conjuntoDeSentencias; break; case valor3: conjuntoDeSentencias; break; default: conjuntoDeSentencias; break; } La sentencia switch evala la expresinMultivalor y ejecuta el conjuntoDeSentencias que aparece junto a la clusula case cuyo valor corresponda con el de la expresinMultivalor. Cada sentencia case debe ser nica y el valor que evala debe ser del mismo tipo que el devuelto por la expresinMultivalor de la sentencia switch. Las sentencias break que aparecen tras cada conjuntoDeSentencias provocan que el control salga del switch y contine con la siguiente instruccin al switch. Las sentencias break son necesarias porque sin ellas se ejecutaran secuencialmente las sentencias case siguientes. Existen ciertas situaciones en las que se desea ejecutar secuencialmente algunas o todas las sentencias case, para lo que habr que eliminar algunos break. Finalmente, se puede usar la sentencia default para manejar los valores que no son explcitamente contemplados por alguna de las sentencias case. Su uso es altamente recomendado. Por ejemplo, supongamos un programa con una variable entera meses cuyo valor indica el mes actual, y se desea imprimir el nombre del mes en que estemos. Se puede utilizar la sentencia switch para realizar esta operacin: int meses; switch ( meses ){ case 1: System.out.println( "Enero" ); break; GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
case 2: System.out.println( "Febrero" ); break; case 3: System.out.println( "Marzo" ); break; //Demas meses // . . . case 12: System.out.println( "Diciembre" ); break; default: System.out.println( "Mes no valido" ); break; } Por supuesto, se puede implementar esta estructura como una sentencia if else if: int meses; if ( meses == 1 ) { System.out.println( "Enero" ); } else if ( meses == 2 ) { System.out.println( "Febrero" ); } // Y as para los dems meses
El decidir si usar la sentencia if o switch depende del criterio de cada caso. Se puede decidir cul usar basndonos en la legibilidad, aunque se recomienda utilizar switch para sentencias con ms de tres o cuatro posibilidades. C. SENTENCIAS DE ITERACIN O BUCLES: FOR, DO, WHILE A.) BUCLE WHILE GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
El bucle while es el bucle bsico de iteracin. Sirve para realizar una accin sucesivamente mientras se cumpla una determinada condicin. La forma general del bucle while es la siguiente: while ( expresinBooleana ) { sentencias; }; Las sentencias se ejecutan mientras la expresinBooleana tenga un valor de verdadero. Se utiliza, por ejemplo para estar en un bucle del que no hay que salir hasta que no se cumpla una determinada condicin. Por ejemplo, multiplicar un nmero por 2 hasta que sea mayor que 100: int i = 1; while ( i <= 100 ) { i = i * 2; } Con l se podran eliminar los bucles do-while y for por ser extensiones de ste, pero que se incluyen en el lenguaje para facilitar la programacin. B.) BUCLE DO-WHILE El bucle do-while es similar al bucle while, pero en el bucle while la expresin se evala al principio del bucle y en el bucle do-while la evaluacin se realiza al final. La forma general del bucle do-while es la siguiente: do { sentencias; } while ( expresinBooleana ); La sentencia do-while es el constructor de bucles menos utilizado en la programacin, pero tiene sus usos, cuando el bucle deba ser ejecutado por lo menos una vez. Por ejemplo, cuando se lee informacin de un archivo, se sabe que siempre se debe leer por lo menos un carcter: GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
int c; do { c = System.in.read( ); // Sentencias para tratar el carcter c } while ( c != -1 ); // No se puede leer ms (Fin fichero) C.) BUCLE FOR Mediante la sentencia for se resume un bucle do-while con una iniciacin previa. Es muy comn que en los bucles while y do-while se inicien las variables de control de nmero de pasadas por el bucle, inmediatamente antes de comenzar los bucles. Por eso el bucle for est tan extendido. La forma general de la sentencia for es la siguiente: for ( iniciacin ; terminacin ; incremento ) sentencias; La iniciacin es una sentencia que se ejecuta una vez antes de entrar en el bucle. La terminacin es una expresin que determina cundo se debe terminar el bucle. Esta expresin se evala al final de cada iteracin del bucle. Cuando la expresin se evala a falso, el bucle termina. El incremento es una expresin que es invocada en cada iteracin del bucle. En realidad puede ser una accin cualquiera, aunque se suele utilizar para incrementar una variable contador: for ( i = 0 ; i < 10 ; i++ ) Algunos (o todos) estos componentes pueden omitirse, pero los puntos y coma siempre deben aparecer (aunque sea sin nada entre s). Se debe utilizar el bucle for cuando se conozcan las restricciones del bucle (su instruccin de iniciacin, criterio de terminacin e instruccin de incremento). Por ejemplo, los bucles for son utilizados comnmente para iterar sobre los elementos de una matriz, o los caracteres de una cadena: // cad es una cadena (String) for ( int i = 0; i < cad.length() ; i++){ GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
// hacer algo con el elemento i-simo de cad } D. SENTENCIAS DE SALTO: BREAK, CONTINUE Y RETURN A.) SENTENCIA BREAK La sentencia break provoca que el flujo de control salte a la sentencia inmediatamente posterior al bloque en curso. Ya se ha visto anteriormente la sentencia break dentro de la sentencia switch. El uso de la sentencia break con sentencias etiquetadas es una alternativa al uso de la sentencia goto, que no es soportada por el lenguaje Java. Se puede etiquetar una sentencia poniendo una identificador Java vlido seguido por dos puntos antes de la sentencia: nombreSentencia: sentenciaEtiquetada La sentencia break se utiliza para salir de una sentencia etiquetada, llevando el flujo del programa al final de la sentencia de programa que indique: break nombreSentencia2; Un ejemplo de esto sera el programa: void gotoBreak() { System.out.println("Ejemplo de break como 'goto' "); a: for( int i=1; i<10; i++ ){ System.out.print(" i="+i); for( int j=1; j<10; j++ ){ if ( j==5 ) break a; //Sale de los dos bucles!!! System.out.print(" j="+j); } System.out.print("No llega aqu"); } GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
} Al interpretar break a, no solo se rompe la ejecucin del bucle interior (el de j), sino que se salta al final del bucle i, obtenindose: i=1 j=1 j=2 j=3 Nota: Se desaconseja esta forma de programacin, basada en goto, y con saltos de flujo no controlados.
B.) SENTENCIA CONTINUE Del mismo modo que en un bucle se puede desear romper la iteracin, tambin se puede desear continuar con el bucle, pero dejando pasar una determinada iteracin. Se puede usar la sentencia continue dentro de los bucles para saltar a otra sentencia, aunque no puede ser llamada fuera de un bucle. Tras la invocacin a una sentencia continue se transfiere el control a la condicin de terminacin del bucle, que vuelve a ser evaluada en ese momento, y el bucle contina o no dependiendo del resultado de la evaluacin. En los bucles for adems en ese momento se ejecuta la clusula de incremento (antes de la evaluacin). Por ejemplo el siguiente fragmento de cdigo imprime los nmeros del 0 al 9 no divisibles por 3: for ( int i = 0 ; i < 10 ; i++ ) { if ( ( i % 3 ) == 0 ) continue; System.out.print( " " + i ); } Del mismo modo que break, en las sentencias continue se puede indicar una etiqueta de bloque al que hace referencia. Con ello podemos referirnos a un bloque superior, si estamos en bucles anidados. Si dicha etiqueta no es indicada, se presupone que nos referimos al bucle en el que la sentencia continue aparece. Por ejemplo, el siguiente fragmento de cdigo: void gotoContinue( ) { f: for ( int i=1; i <5; i++ ) { for ( int j=1; j<5; j++ ) { if ( j>i ) { System.out.println(" "); continue f; } System.out.print( " " + (i*j) ); } } } GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
En este cdigo la sentencia continue termina el bucle de j y continua el flujo en la siguiente iteracin de i. Ese mtodo imprimira: 1 2 4 3 6 9 4 8 12 16 Nota: Se desaconseja esta forma de programacin, basada en goto, y con saltos de flujo no controlados. C.) SENTENCIA RETURN La ltima de las sentencias de salto es la sentencia return, que puede usar para salir del mtodo en curso y retornar a la sentencia dentro de la cual se realiz la llamada. Para devolver un valor, simplemente se debe poner el valor (o una expresin que calcule el valor) a continuacin de la palabra return. El valor devuelto por return debe coincidir con el tipo declarado como valor de retorno del mtodo. Cuando un mtodo se declara como void se debe usar la forma de return sin indicarle ningn valor. Esto se hace para no ejecutar todo el cdigo del programa: int contador; boolean condicion; int devuelveContadorIncrementado(){ return ++contador; } void metodoReturn(){ //Sentencias if ( condicion == true ) return; //Ms sentencias a ejecutar si condicin no vale true } E. EXCEPCIONES Las excepciones son otra forma ms avanzada de controlar el flujo de un programa. Con ellas se podrn realizar acciones especiales si se dan determinadas condiciones, justo en el momento en que esas condiciones se den. CLASES Y OBJETOS
A partir de ahora es cuando entramos la verdadera potencia de Java como lenguaje orientado a objetos: las clases y los objetos. Durante esta sesin se va a trabajar en la construccin de una clase MiPunto, que modeliza un punto en un espacio plano: class MiPunto{ int x, y; int metodoSuma( int paramX, int paramY ) { return ( paramX + paramY ); } double distancia(int x, int y) { GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
int dx= this.x pX; int dy = this.y pY; return Math.sqrt(dx*dx + dy*dy); } void metodoVacio( ) { } void inicia( int paramX, int paramY ) { x = paramX; y = paramY; } void inicia2( int x, int y ) { x = x; // Ojo, no modificamos la variable de instancia!!! this.y = y; // Modificamos la variable de instancia!!! } MiPunto( int paramX, int paramY ) { this.x = paramX; // Este this se puede omitir y = paramY; // No hace falta this }
MiPunto() { inicia(-1,-1); //Por defecto ; this(-1,-1) hace lo mismo }
}
DEFINICIN DE UNA CLASE
El elemento bsico de la programacin orientada a objetos en Java es la clase. Una clase define la forma y comportamiento de un objeto. Para crear una clase slo se necesita un archivo fuente que contenga la palabra clave reservada class seguida de un identificador legal y un bloque delimitado por dos llaves para el cuerpo de la clase. class MiPunto { } Un archivo de Java debe tener el mismo nombre que la clase que contiene, y se les suele asignar la extensin ".java". Por ejemplo la clase MiPunto se guardara en un fichero que se llamase MiPunto.java. Hay que tener presente que en Java se diferencia entre maysculas y minsculas; el nombre de la clase y el de archivo fuente han de ser exactamente iguales. Aunque la clase MiPunto es sintcticamente correcta, es lo que se viene a llamar una clase vaca, es decir, una clase que no hace nada. Las clases tpicas de Java incluirn variables y mtodos de instancia. Los programas en Java completos constarn por lo general de varias clases de Java en distintos archivos fuente. Una clase es una plantilla para un objeto. Por lo tanto define la estructura de un objeto y su interfaz funcional, en forma de mtodos. Cuando se ejecuta un programa en Java, el sistema utiliza definiciones de clase para crear instancias de las clases, que son los objetos reales. Los trminos instancia y objeto se utilizan de manera indistinta. La forma general de una definicin de clase es: class Nombre_De_Clase { tipo_de_variable nombre_de_atributo1; tipo_de_variable nombre_de_atributo2; GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
Los tipos tipo_de_variable y tipo_devuelto, han de ser tipos simples Java o nombres de otras clases ya definidas. Tanto Nombre_De_Clase, como los nombre_de_atributo y nombre_de_mtodo, han de ser identificadores Java vlidos.
LOS ATRIBUTOS
Los datos se encapsulan dentro de una clase declarando variables dentro de las llaves de apertura y cierre de la declaracin de la clase, variables que se conocen como atributos. Se declaran igual que las variables locales de un mtodo en concreto. Por ejemplo, este es un programa que declara una clase MiPunto, con dos atributos enteros llamados x e y. class MiPunto { int x, y; }
Los atributos se pueden declarar con dos clases de tipos: un tipo simple Java (ya descritos), o el nombre de una clase (ser una referencia a objeto, vase el punto C.a de este mismo apartado). Cuando se realiza una instancia de una clase (creacin de un objeto) se reservar en la memoria un espacio para un conjunto de datos como el que definen los atributos de una clase. A este conjunto de variables se le denomina variables de instancia.
LOS MTODOS Los mtodos son subrutinas que definen la interfaz de una clase, sus capacidades y comportamiento. Un mtodo ha de tener por nombre cualquier identificador legal distinto de los ya utilizados por los nombres de la clase en que est definido. Los mtodos se declaran al mismo nivel que las variables de instancia dentro de una definicin de clase. En la declaracin de los mtodos se define el tipo de valor que devuelven y a una lista formal de parmetros de entrada, de sintaxis tipo identificador separadas por comas. La forma general de una declaracin de mtodo es: tipo_devuelto nombre_de_mtodo ( lista-formal-de-parmetros ) { cuerpo_del_mtodo; }
Por ejemplo el siguiente mtodo devuelve la suma de dos enteros: int metodoSuma( int paramX, int paramY ) { return ( paramX + paramY ); }
GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
En el caso de que no se desee devolver ningn valor se deber indicar como tipo la palabra reservada void. As mismo, si no se desean parmetros, la declaracin del mtodo debera incluir un par de parntesis vacos (sin void): void metodoVacio( ) { }; Los mtodos son llamados indicando una instancia individual de la clase, que tendr su propio conjunto nico de variables de instancia, por lo que los mtodos se pueden referir directamente a ellas. El mtodo inicia() para establecer valores a las dos variables de instancia sera el siguiente: void inicia( int paramX, int paramY ) { x = paramX; y = paramY; } REFERENCIAS A OBJETO E INSTANCIAS
Los tipos simples de Java describan el tamao y los valores de las variables. Cada vez que se crea una clase se aade otro tipo de dato que se puede utilizar igual que uno de los tipos simples. Por ello al declarar una nueva variable, se puede utilizar un nombre de clase como tipo. A estas variables se las conoce como referencias a objeto. Todas las referencias a objeto son compatibles tambin con las instancias de subclases de su tipo. Del mismo modo que es correcto asignar un byte a una variable declarada como int, se puede declarar que una variable es del tipo MiClase y guardar una referencia a una instancia de este tipo de clase: MiPunto p; Esta es una declaracin de una variable p que es una referencia a un objeto de la clase MiPunto, de momento con un valor por defecto de null. La referencia null es una referencia a un objeto de la clase Object, y se podr convertir a una referencia a cualquier otro objeto porque todos los objetos son hijos de la clase Object.
CONSTRUCTORES Las clases pueden implementar un mtodo especial llamado constructor. Un constructor es un mtodo que inicia un objeto inmediatamente despus de su creacin. De esta forma nos evitamos el tener que iniciar las variables explcitamente para su iniciacin. El constructor tiene exactamente el mismo nombre de la clase que lo implementa; no puede haber ningn otro mtodo que comparta su nombre con el de su clase. Una vez definido, se llamar automticamente al constructor al crear un objeto de esa clase (al utilizar el operador new). El constructor no devuelve ningn tipo, ni siquiera void. Su misin es iniciar todo estado interno de un objeto (sus atributos), haciendo que el objeto sea utilizable inmediatamente; reservando memoria para sus atributos, iniciando sus valores... Por ejemplo: MiPunto( ) { inicia( -1, -1 ); }
Este constructor denominado constructor por defecto, por no tener parmetros, establece el valor -1 a las variables de instancia x e y de los objetos que construya. El compilador, por defecto, llamar al constructor de la superclase Object() si no se especifican parmetros en el constructor. Este otro constructor, sin embargo, recibe dos parmetros: MiPunto( int paraX, int paraY ) { inicia( paramX, paramY ); } GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
La lista de parmetros especificada despus del nombre de una clase en una sentencia new se utiliza para pasar parmetros al constructor. Se llama al mtodo constructor justo despus de crear la instancia y antes de que new devuelva el control al punto de la llamada. As, cuando ejecutamos el siguiente programa: MiPunto p1 = new MiPunto(10, 20); System.out.println( "p1.- x = " + p1.x + " y = " + p1.y ); Se muestra en la pantalla: p1.- x = 10 y = 20
. EL OPERADOR NEW El operador new crea una instancia de una clase (objetos) y devuelve una referencia a ese objeto. Por ejemplo: MiPunto p2 = new MiPunto(2,3); Este es un ejemplo de la creacin de una instancia de MiPunto, que es controlador por la referencia a objeto p2. Hay una distincin crtica entre la forma de manipular los tipos simples y las clases en Java: Las referencias a objetos realmente no contienen a los objetos a los que referencian. De esta forma se pueden crear mltiples referencias al mismo objeto, como por ejemplo: MiPunto p3 =p2; Aunque tan slo se cre un objeto MiPunto, hay dos variables (p2 y p3) que lo referencian. Cualquier cambio realizado en el objeto referenciado por p2 afectar al objeto referenciado por p3. La asignacin de p2 a p3 no reserva memoria ni modifica el objetoobjeto creado con new Aunque se haya asignado null a p2, p3 todava apunta al objeto creado por el operador new. Cuando ya no haya ninguna variable que haga referencia a un objeto, Java reclama automticamente la memoria utilizada por ese objeto, a lo que se denomina recogida de basura. Cuando se realiza una instancia de una clase (mediante new) se reserva en la memoria un espacio para un conjunto de datos como el que definen los atributos de la clase que se indica en la instanciacin. A este conjunto de variables se le denomina variables de instancia. La potencia de las variables de instancia es que se obtiene un conjunto distinto de ellas cada vez que se crea un objeto nuevo. Es importante el comprender que cada objeto tiene su propia copia de las variables de instancia de su clase, por lo que los cambios sobre las variables de instancia de un objeto no tienen efecto sobre las variables de instancia de otro. El siguiente programa crea dos objetos MiPunto y establece los valores de x e y de cada uno de ellos de manera independiente para mostrar que estn realmente separados. MiPunto p4 = new MiPunto( 10, 20 ); MiPunto p5 = new MiPunto( 42, 99 ); System.out.println("p4.- x = " + p4.x + " y = " + p4.y); System.out.println("p5.- x = " + p5.x + " y = " + p5.y); Este es el aspecto de salida cuando lo ejecutamos. p4.- x = 10 y = 20 p5.- x = 42 y = 99
EL OPERADOR PUNTO (.) El operador punto (.) se utiliza para acceder a las variables de instancia y los mtodos contenidos en un objeto, mediante su referencia a objeto: referencia_a_objeto.nombre_de_variable_de_instancia GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
referencia_a_objeto.nombre_de_mtodo( lista-de-parmetros ); Hemos creado un ejemplo completo que combina los operadores new y punto para crear un objeto MiPunto, almacenar algunos valores en l e imprimir sus valores finales: MiPunto p6 = new MiPunto( 10, 20 ); System.out.println ("p6.- 1. X=" + p6.x + " , Y=" + p6.y); p6.inicia( 30, 40 ); System.out.println ("p6.- 2. X=" + p6.x + " , Y=" + p6.y); Cuando se ejecuta este programa, se observa la siguiente salida: p6.- 1. X=10 , Y=20 p6.- 2. X=30 , Y=40 Durante las impresiones (mtodo println()) se accede al valor de las variables mediante p6.x y p6.y, y entre una impresin y otra se llama al mtodo inicia(), cambiando los valores de las variables de instancia. Este es uno de los aspectos ms importantes de la diferencia entre la programacin orientada a objetos y la programacin estructurada. Cuando se llama al mtodo p6.inicia(), lo primero que se hace en el mtodo es sustituir los nombres de los atributos de la clase por las correspondientes variables de instancia del objeto con que se ha llamado. As por ejemplo x se convertir en p6.x. Si otros objetos llaman a inicia(), incluso si lo hacen de una manera concurrente, no se producen efectos laterales, ya que las variables de instancia sobre las que trabajan son distintas.
LA REFERENCIA THIS Java incluye un valor de referencia especial llamado this, que se utiliza dentro de cualquier mtodo para referirse al objeto actual. El valor this se refiere al objeto sobre el que ha sido llamado el mtodo actual. Se puede utilizar this siempre que se requiera una referencia a un objeto del tipo de una clase actual. Si hay dos objetos que utilicen el mismo cdigo, seleccionados a travs de otras instancias, cada uno tiene su propio valor nico de this. Un refinamiento habitual es que un constructor llame a otro para construir la instancia correctamente. El siguiente constructor llama al constructor parametrizado MiPunto(x,y) para terminar de iniciar la instancia: MiPunto() { this( -1, -1 ); // Llama al constructor parametrizado }
En Java se permite declarar variables locales, incluyendo parmetros formales de mtodos, que se solapen con los nombres de las variables de instancia. No se utilizan x e y como nombres de parmetro para el mtodo inicia, porque ocultaran las variables de instancia x e y reales del mbito del mtodo. Si lo hubisemos hecho, entonces x se hubiera referido al parmetro formal, ocultando la variable de instancia x: void inicia2( int x, int y ) { x = x; // Ojo, no modificamos la variable de instancia!!! this.y = y; // Modificamos la variable de instancia!!! }
LA HERENCIA
La verdadera potencia de la programacin orientada a objetos radica en su capacidad para reflejar la abstraccin que el cerebro humano realiza automticamente durante el proceso de aprendizaje y el proceso de anlisis de informacin. Las personas percibimos la realidad como un conjunto de objetos interrelacionados. Dichas interrelaciones, pueden verse como un conjunto de abstracciones y generalizaciones que se han ido asimilando desde la niez. As,
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulC
los defensores de la programacin orientada a objet del cerebro humano, al permitir descomponer un prob subordinados del primero. La capacidad de descomponer un problema o concepto cuyo comportamiento es fcilmente identificable, pu
JERARQUA La herencia es el mecanismo fundamental de relacin clases de manera jerrquica; una clase
Los descendientes de una clase heredan todas las va especificado como heredables, adems de crear los suyos propios. La caracterstica de herencia, nos permite definir especializan de alguna manera. As logramos definir rbol de herencia. En todo lenguaje orientado a objetos existe una jer trminos de herencia. En Java, el punto ms alto de dems clases.
HERENCIA MLTIPLE En la orientacin a objetos, se consideran dos tipos de he una clase slo puede derivar de una nica superclas superclases. En Java slo se dispone de herencia simple, para un cierta manera la inexistencia de herencia mltiple adelante.
DECLARACIN Para indicar que una clase deriva de otra, heredando sus propiedades trmino extends, como en el siguiente ejemplo: public class SubClase extends SuperClase { // Contenido de la clase }
Por ejemplo, creamos una clase MiPunto3D class MiPunto3D extends MiPunto { int z; MiPunto3D( ) { x = 0; // Heredado de MiPunto GUIA DE JAVA nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn los defensores de la programacin orientada a objetos afirman que esta tcnica se adecua mejor al func del cerebro humano, al permitir descomponer un problema de cierta magnitud en un conjunto de problemas menores La capacidad de descomponer un problema o concepto en un conjunto de objetos relacionados entre s, y cuyo comportamiento es fcilmente identificable, puede ser muy til para el desarrollo de programas informticos. La herencia es el mecanismo fundamental de relacin entre clases en la orientacin a objetos. Relacion clases de manera jerrquica; una clase padre o superclase sobre otras clases hijas o subclases. Los descendientes de una clase heredan todas las variables y mtodos que sus ascendientes hayan , adems de crear los suyos propios. La caracterstica de herencia, nos permite definir nuevas clases derivadas de otra ya existent especializan de alguna manera. As logramos definir una jerarqua de clases, que se puede mostrar medi En todo lenguaje orientado a objetos existe una jerarqua, mediante la que las clases se relacionan en trminos de herencia. En Java, el punto ms alto de la jerarqua es la clase Object de la cual derivan todas las rientacin a objetos, se consideran dos tipos de herencia, simple y mltiple. En el caso de la primera una clase slo puede derivar de una nica superclase. Para el segundo tipo, una clase puede descender En Java slo se dispone de herencia simple, para una mayor sencillez del lenguaje, si bien se compensa cierta manera la inexistencia de herencia mltiple con un concepto denominado interface, que estudiaremos ms una clase deriva de otra, heredando sus propiedades (mtodos y atributos), se usa el , como en el siguiente ejemplo: public class SubClase extends SuperClase { MiPunto3D, hija de la clase ya mostrada MiPunto: Prof. Lisbeth Guerra MAS uL LA 8CC8AMAClCn
os afirman que esta tcnica se adecua mejor al funcionamiento magnitud en un conjunto de problemas menores en un conjunto de objetos relacionados entre s, y ollo de programas informticos. entre clases en la orientacin a objetos. Relaciona las
riables y mtodos que sus ascendientes hayan nuevas clases derivadas de otra ya existente, que la una jerarqua de clases, que se puede mostrar mediante un arqua, mediante la que las clases se relacionan en de la cual derivan todas las rencia, simple y mltiple. En el caso de la primera, e. Para el segundo tipo, una clase puede descender de varias a mayor sencillez del lenguaje, si bien se compensa de , que estudiaremos ms (mtodos y atributos), se usa el GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
y = 0; // Heredado de MiPunto z = 0; // Nuevo atributo } }
La palabra clave extends se utiliza para decir que deseamos crear una subclase de la clase que es nombrada a continuacin, en nuestro caso MiPunto3D es hija de MiPunto.
LIMITACIONES EN LA HERENCIA Todos los campos y mtodos de una clase son siempre accesibles para el cdigo de la misma clase. Para controlar el acceso desde otras clases, y para controlar la herencia por las subclase, los miembros (atributos y mtodos) de las clases tienen tres modificadores posibles de control de acceso: 9 public: Los miembros declarados public son accesibles en cualquier lugar en que sea accesible la clase, y son heredados por las subclases. 9 private: Los miembros declarados private son accesibles slo en la propia clase. 9 protected: Los miembros declarados protected son accesibles slo para sus subclases
Por ejemplo: class Padre { // Hereda de Object // Atributos private int numeroFavorito, nacidoHace, dineroDisponible; // Mtodos public int getApuesta() { return numeroFavorito; } protected int getEdad() { return nacidoHace; } private int getSaldo() { return dineroDisponible; } }
class Hija extends Padre { // Definicin }
class Visita { // Definicin }
En este ejemplo, un objeto de la clase Hija, hereda los tres atributos (numeroFavorito, nacidoHace y dineroDisponible) y los tres mtodos ( getApuesta(), getEdad() y getSaldo() ) de la clase Padre, y podr invocarlos. Cuando se llame al mtodo getEdad() de un objeto de la clase Hija, se devolver el valor de la variable de instancia nacidoHace de ese objeto, y no de uno de la clase Padre. Sin embargo, un objeto de la clase Hija, no podr invocar al mtodo getSaldo() de un objeto de la clase Padre, con lo que se evita que el Hijo conozca el estado de la cuenta corriente de un Padre. GUIA DE JAVA Prof. Lisbeth Guerra
nl lnlC8M1lCA 18A?LC1C ll 18lMLS18L l A8AulCMAS uL LA 8CC8AMAClCn
La clase Visita, solo podr acceder al mtodo getApuesta(), para averiguar el nmero favorito de un Padre, pero de ninguna manera podr conocer ni su saldo, ni su edad (sera una indiscrecin, no?).
LA CLASE OBJECT La clase Object es la superclase de todas las clases da Java. Todas las clases derivan, directa o indirectamente de ella. Si al definir una nueva clase, no aparece la clusula extends, Java considera que dicha clase desciende directamente de Object. La clase Object aporta una serie de funciones bsicas comunes a todas las clases: 9 public boolean equals( Object obj ): Se utiliza para comparar, en valor, dos objetos. Devuelve true si el objeto que recibe por parmetro es igual, en valor, que el objeto desde el que se llama al mtodo. Si se desean comparar dos referencias a objeto se pueden utilizar los operadores de comparacin == y !=. 9 public int hashCode(): Devuelve un cdigo hash para ese objeto, para poder almacenarlo en una Hashtable. 9 protected Object clone() throws CloneNotSupportedException: Devuelve una copia de ese objeto. 9 public final Class getClass(): Devuelve el objeto concreto, de tipo Class, que representa la clase de ese objeto. 9 protected void finalize() throws Trowable: Realiza acciones durante la recogida de basura.