You are on page 1of 130

(3) programacin bsica en Java

Esquema de la unidad
(3) programacin bsica en Java (3.1) historia de Java
(3.1.1) los antecedentes de Java. influencia de C y C++ (3.1.2) la llegada de Java (3.1.3) Java y JavaScript (3.2.1) construccin de programas en Java. bytecodes (3.2.2) seguridad (3.2.3) tipos de aplicaciones Java (3.2.4) plataformas (3.3.1) el kit de desarrollo Java (SDK) (3.3.2) versiones de Java (3.3.3) instalacin del SDK (3.3.4) entornos de trabajo (3.4.1) codificacin del texto (3.4.2) notas previas (3.4.3) el primer programa en Java 8 10 12 12 14 15 15 16 16 19 22 24 24 25 26

5 8

(3.2) caractersticas de Java

12

(3.3) empezar a trabajar con Java

16

(3.4) escritura de programas Java

24

(3.5) ejecucin de programas Java (3.6) javadoc (3.7) import (3.8) variables

(3.5.1) proceso de compilacin desde la lnea de comandos

26

(3.8.1) introduccin (3.8.2) declaracin de variables (3.8.3) asignacin

30 31 31

27 29 30

(5)

Fundamentos de programacin
(Programacin bsica en Java

(3.9) tipos de datos primitivos


(3.9.1) enteros (3.9.2) nmeros en coma flotante (3.9.3) booleanos (3.9.4) caracteres (3.9.5) conversin entre tipos (casting) (3.9.6) mbito de las variables (3.10.1) introduccin (3.10.2) operadores aritmticos (3.10.3) operadores condicionales (3.10.4) operadores de BIT (3.10.5) operadores de asignacin (3.10.6) operador ? (3.10.7) precedencia

32
32 33 34 34 35 35 36 36 37 38 38 39 39

(3.10) operadores

36

(3.11) constantes (3.12) lectura y escritura por teclado


(3.12.1) escritura (3.12.2) lectura

40 41
41 41

(3.13) la clase Math

Apndice (II) Netbeans (II.i) introduccin (II.ii) instalacin

(3.13.2) nmeros aleatorios

(II.ii.i) comprobacin de la plataforma Java instalada

73 73 73
76 77 77 77 77

45

43

(II.iii) aspecto inicial de Netbeans

(II.iv) proyectos de Netbeans

(II.iii.i) cerrar y abrir paneles (II.iii.ii) iconizar un panel (II.iii.iii) mover paneles (II.iii.iv) mostrar y quitar barras de herramientas (II.iv.i) crear proyectos (II.iv.ii) la ventana del proyecto (II.iv.iii) crear paquetes (II.iv.iv) crear nuevas clases (II.iv.v) vistas del proyecto (II.iv.vi) propiedades del proyecto (II.iv.vii) borrar un proyecto (II.iv.viii) importar un proyecto de Eclipse (II.v.i) compilar (II.v.ii) ejecutar la clase principal del proyecto (II.v.iii) preparar la distribucin

76

78

(II.v) compilar y ejecutar programas

78 79 80 80 81 82 83 83 84 84 84 85 85 86

84

(II.vi) javadoc

(II.vi.i) aadir la documentacin Java a Netbeans (II.vi.ii) generar la documentacin Javadoc del proyecto

85

(II.vii) edicin de cdigo


(II.vii.i) aspecto de la ventana de cdigo (6)

86

CBTis No. 134. Tcnico en Programacin

(II.vii.ii) ayudas al escribir cdigo (II.vii.iii) bsqueda y reemplazo de texto en el cdigo (II.vii.iv) dar formato al cdigo (II.vii.v) modificacin de opciones del editor (II.vii.vi) reestructurar (II.vii.vii) plantillas generales (II.vii.viii) comparar archivos (II.vii.ix) exportar e importar las opciones

87 87 88 88 89 90 91 92

(7)

Fundamentos de programacin
(Programacin bsica en Java

(3.1) historia de Java


(3.1.1) los antecedentes de Java. influencia de C y C++
Java es un lenguaje de programacin que se desarroll para satisfacer las nuevas necesidades que requera la creacin de aplicaciones a finales de los 90. Desde los primeros lenguajes aparecidos en los aos cincuenta, hasta la aparicin de Java, la ciencia de la creacin de programas ha sufrido numerosas transformaciones. Todas ellas se basan en intentar que los programadores y programadoras consigan trabajar de la forma ms eficiente posible. La bsqueda del lenguaje perfecto es la bsqueda del lenguaje que sea ms fcil de aprender y que otorgue ms posibilidades a aquellos programadores y programadoras que lo utilicen. En general ambos conceptos han dado lenguajes muy diversos. Por ejemplo, el lenguaje Basic es un lenguaje muy fcil de aprender, pero en cuanto se quieren resolver problemas complicados, resulta ineficaz. Por otro lado el lenguaje C es un lenguaje muy poderoso, capaz de crear todo tipo de aplicaciones; pero es bastante ms difcil de aprender. Java intenta cumplir ambas premisas, pero de forma equilibrada: ni es un lenguaje muy fcil de aprender, ni es un lenguaje capaz de realizar todo tipo de aplicaciones. En realidad Java es uno de los muchos lenguajes influenciados por el exitoso lenguaje C. Este lenguaje ha sido el favorito de los creadores de aplicaciones (especialmente de sistemas) en los aos 60 y 70. la influencia del lenguaje C La aparicin del lenguaje Fortran, supuso la creacin del primer lenguaje de alto nivel. Por primera vez el programador poda programar un poco ms alejado de la lgica de la mquina, es decir cada vez ms lejos del lenguaje de unos y ceros que es el nico que los computadores reconocen. Poco a poco aparecieron cada vez ms lenguajes con la pretensin de mejorar la forma de programar (Lisp, Pascal, Fortran, Cobol,). Algunos de ellos siguen vigentes incluso hoy en da. La mayora se especializaron en diferentes tipos de aplicaciones (Lisp para aplicaciones de ingeniera, Pascal para aprendizaje de la ciencia de la programacin, Cobol para aplicaciones de gestin,). El caso es que para crear aplicaciones de alto rendimiento y de sistema, los programadores segua utilizando el lenguaje Ensamblador. Por ello a finales de los 60 aparece el lenguaje C.

(8 )

CBTis No. 134. Tcnico en Programacin

C aport a los lenguajes existentes las siguientes ventajas:

Un lenguaje de nivel medio (ms cercano a la forma de pensar del

ordenador) que permita tanto utilizar estructuras de los lenguajes de alto nivel (funciones, bucles avanzados,) como instrucciones de nivel bajo (punteros)

Una sintaxis que permite escribir cdigo de forma rpida Un lenguaje potente capaz de crear todo tipo de aplicaciones Un lenguaje capaz de utilizar todo tipo de estructuras estticas y
dinmicas y de manejar todos los recursos de la mquina. Sin embargo C tambin tiene sus problemas. Uno de los principales es que cuando la aplicacin crece, el cdigo es muy difcil de manejar. Las tcnicas de programacin estructurada y programacin modular, que en C pueden ser aplicadas, paliaban algo el problema. Pero fue la programacin orientada a objetos (POO u OOP) la que mejor notablemente el situacin. No obstante C sigue siendo uno de los lenguajes ms utilizados y acadmicamente sigue utilizndose por su versatilidad, que permite aprender todas las caractersticas de la programacin clsica. De hecho a un buen programador de lenguaje C no le debera ser difcil aprender a programar en otros lenguajes (una vez que conozca las bases de la programacin orientada a objetos). la influencia de la programacin orientada a objetos La POO permite fabricar programas de forma ms parecida al pensamiento humano. De hecho simplifica el problema dividindolo en objetos y permitiendo centrarse en cada objeto, para de esa forma eliminar la complejidad. Cada objeto se programa de forma autnoma y esa es la principal virtud. Al aparecer la programacin orientada a objetos (en los aos setenta), aparecieron varios lenguajes orientados a objetos y tambin se realizaron versiones orientadas a objetos (o semiorientadas a objetos) de lenguajes clsicos. Una de las ms famosas adaptaciones fue la que capacit al lenguaje C a utilizar objetos. A ese lenguaje se le llam C++ indicando con esa simbologa que era un incremento del lenguaje C (en el lenguaje C, como en Java, los smbolos ++ significan incrementar). Las ventajas que aadi C++ a C fueron:

Aadir soporte para objetos (POO) Libreras de clases de objetos (como MFC 1 Por ejemplo) que
facilitaban el uso de cdigo ya creado para las nuevas aplicaciones.

Todo lo bueno del C (incluso compatibilidad con este lenguaje)


1

Microsoft Foundation Classes, librera creada por Microsoft para facilitar la creacin de programas para el sistema Windows.

(9)

Fundamentos de programacin
(Programacin bsica en Java

C++ pas a ser el lenguaje de programacin ms popular a principios de los 90 y sigue siendo un lenguaje muy utilizado. Muchas personas le consideran el lenguaje de programacin ms potente. Otras adaptaciones famosas de lenguajes clsicos a lenguajes orientados a objetos, fueron:

El paso de Pascal a Turbo Pascal y posteriormente a Delphi. El paso de Basic a QuickBasic y despus a Visual Basic.
A pesar de las evidentes ventajas del lenguaje C++. Tiene sus serios inconvenientes.

Su complejidad El hecho de ser un lenguaje hbrido, es decir que permite programar


de forma no orientada a objetos, lo que provoca malas prcticas de programador.

Los punteros, que requieren un especial cuidado por parte de la El que sea un lenguaje apto para crear programas dainos como virus y
programas espas.

programadora o programador, ya que son los responsables de los errores ms peligrosos y difciles de detectar.

No es un lenguaje apto para transmitirse en redes de ordenadores;

especialmente en Internet (porque al ser compilado requiere cargar todo el cdigo para ser compilado).

La llegada de Internet propici la creacin de lenguajes ms aptos para su uso en esta red de redes.

(3.1.2) la llegada de Java


En 1991, la empresa Sun Microsystems crea el lenguaje Oak (de la mano del llamado proyecto Green). Mediante este lenguaje se pretenda crear un sistema de televisin interactiva. Este lenguaje slo se lleg a utilizar de forma interna. en la empresa. Su propsito era crear un lenguaje independiente de la plataforma para uso en dispositivos electrnicos. Se intentaba con este lenguaje paliar uno de los problemas fundamentales del C++; que consiste en que al compilar se produce un fichero ejecutable cuyo cdigo slo vale para la plataforma en la que se realiz la compilacin. Sun deseaba un lenguaje para programar pequeos dispositivos electrnicos. La dificultad de estos dispositivos es que cambian continuamente y para que un programa funcione en el siguiente dispositivo aparecido, hay que rescribir el cdigo. Por eso Sun quera crear un lenguaje independiente del dispositivo. En 1995 Oak pasa a llamarse Java. Java es un importante exportador de caf; por eso en EEUU se conoce como Java al caf, tomarse una taza de Java

(10 )

CBTis No. 134. Tcnico en Programacin

es tomarse una taza de caf (aunque no sea precisamente de Java). Parece que los desarrolladores de Java tomaron muchas tazas de Java. 2 Ese ao se da a conocer al pblico. y adquiere notoriedad rpidamente, casi desde su lanzamiento. Durante estos aos se ha mejorado y se le ha revisado. La versin 1.2 modific tanto Java que se la llam Java 2 y tambin a sus descendientes (Java 1.3 y Java 1.4). Actualmente el nmero 2 se ha quitado del nombre y la ltima versin se conoce como Java v6. En general la sintaxis de Java es similar a C y C++. Pero posee estas diferencias:

No hay punteros (lo que le hace ms seguro y fcil de manejar) No es hbrido, sino totalmente orientado a objetos (aunque muchos
programadores tienen reservas respecto a esta aseveracin). Los lenguajes orientados a objetos hbridos permiten crear aplicaciones no orientadas a objetos. Internet

Muy preparado para ser utilizado en redes TCP/IP y especialmente en Implementa excepciones (control de errores) de forma nativa Es un lenguaje interpretado (lo que acelera su ejecucin remota,
aunque provoca que las aplicaciones Java sean ms lentas en la ejecucin que las aplicaciones escritas en lenguajes compilados como C++). tareas en paralelo.

Permite mltiples hilos de ejecucin, es decir que se ejecuten varias Admite firmas digitales Tipos de datos y control de sintaxis ms rigurosa que los lenguajes C y
C++, lo que facilita la gestin de errores

Es independiente de la plataforma, ejecutable en cualquier sistema


con mquina virtual La ltima ventaja (quiz la ms importante) se consigue ya que el cdigo Java no se compila, sino que se precompila, de tal forma que se crea un cdigo intermedio que no es directamente ejecutable. No es cdigo mquina. Para ejecutarle hace falta pasarle por un intrprete que va interpretando cada lnea. Ese intrprete suele ser la mquina virtual de Java. Por lo que cualquier sistema que posea mquina virtual de Java, podr ejecutar cdigo precompilado en Java. Ms adelante se explica este proceso en detalle.

La simbologa del caf sigue presente en Java. El logotipo oficial de Java es una taza humeante de caf. Mucho software desarrollado para Java ha mantenido esa simbologa: Visual Caf, Kawa (caf en ruso),

(11)

Fundamentos de programacin
(Programacin bsica en Java

(3.1.3) Java y JavaScript


Una de las confusiones actuales la provoca el parecido nombre que tienen estos dos lenguajes. Sin embargo no tienen mucho que ver entre s. Sun cre Java y la empresa Netscape cre JavaScript. Java es un lenguaje completo que permite realizar todo tipo de aplicaciones. JavaScript es un lenguaje que permite incrustar cdigo dentro de las pginas web. La finalidad de JavaScript es mejorar las pginas web, hacerlas ms vistosas y dinmicas. La finalidad de Java es crear aplicaciones de todo tipo (aunque est muy preparado para crear sobre todo aplicaciones en red). Aunque la sintaxis tiene elementos en comn, desde luego no se parece tanto. De hecho Javascript es mucho ms fcil que Java.

(3.2) caractersticas de Java


(3.2.1) construccin de programas en Java. bytecodes
compilacin tradicional En el mundo de la programacin siempre se ha hablado de lenguajes compilados y de lenguajes interpretados. En el segundo caso, un programa intrprete se encarga de traducir cada lnea al cdigo mquina correspondiente. Los lenguajes interpretados a partir de los setenta se han dejado de usar porque no eran los apropiados para conseguir cdigo eficiente. Por el contrario, los lenguajes compilados producen cdigo mquina analizando todas las lneas de cdigo en conjunto. Los compiladores buscan el mejor cdigo mquina posible. El resultado del proceso de compilacin (en realidad de compilacin y enlazado) es un archivo ejecutable. Un archivo ejecutable es un programa que se puede lanzar directamente en el sistema operativo; en el caso de Windows o Linux simplemente con hacer doble clic sobre el archivo, se ejecutan sus instrucciones. La ventaja es que los programas ejecutables no necesitan compilarse de nuevo, son programas terminados. El problema es que los sistemas operativos utilizan diferentes tipos de archivos ejecutables: es decir, un archivo ejecutable en Linux no sera compatible con Windows.

(12 )

CBTis No. 134. Tcnico en Programacin

Ilustracin 3-1, Proceso de compilacin de un programa C++ en Windows y Linux

la "compilacin" en Java En Java el cdigo no se traduce a cdigo ejecutable. En Java el proceso se conoce como precompilacin y sirve para producir un archivo (de extensin class) que contiene cdigo que no es directamente ejecutable (no es cdigo Java). Es un cdigo intermedio llamado bytecode (tambin se le llama Jcode). Al no ser ejecutable, el archivo class no puede ejecutarse directamente con un doble clic en el sistema. El bytecode tiene que ser interpretado (es decir, traducido lnea a lnea) por una aplicacin conocida como la mquina virtual de Java (JVM). Hoy se conoce como JRE (Java Runtime Environment, entorno de ejecucin de Java). La gran ventaja es que el entorno de ejecucin de Java lo fabrica Sun para todas las plataformas; lo que significa que un archivo class se puede ejecutar en cualquier ordenador o mquina que incorpore el JRE. Slo hay una pega, si programamos utilizando por ejemplo la versin 1.6 de Java, el ordenador en el que queramos ejecutar el programa deber incorporar el JRE al menos de la versin 1.6. El JRE o la mquina virtual de Java son un programas muy pequeos y que se distribuyen gratuitamente para prcticamente todos los sistemas operativos. A la forma de producir cdigo final de Java se la llama JIT (Just In Time, justo en el momento) ya que el cdigo ejecutable se produce slo en el instante de ejecucin del programa. Es decir, no hay en ningn momento cdigo ejecutable.

(13)

Fundamentos de programacin
(Programacin bsica en Java

Ilustracin 3-2, Proceso de compilacin de un programa Java

(3.2.2) seguridad
Al interpretar el cdigo, el JRE puede delimitar las operaciones peligrosas, con lo cual la seguridad es fcilmente controlable. Adems, Java elimina las instrucciones dependientes de la mquina y los punteros que generaban terribles errores en C y la posibilidad de generar programas para atacar sistemas. Tampoco se permite el acceso directo a la memoria y recursos del ordenador. La primera lnea de seguridad de Java es un verificador del bytecode que permite comprobar que el comportamiento del cdigo es correcto y que sigue las reglas del lenguaje Java. Normalmente los compiladores de Java no pueden generar cdigo que se salte las reglas de seguridad de Java. Pero un programador malvolo podra generar artificialmente bytecode que se salte las reglas. El verificador intenta eliminar esta posibilidad. Hay un segundo paso que verifica la seguridad del cdigo que es el verificador de clase que es el programa que proporciona las clases necesarias al cdigo. Lo que hace es asegurarse que las clases que se cargan son realmente las del sistema original de Java y no clases creadas reemplazadas artificialmente. Finalmente hay un administrador de seguridad que es un programa configurable que permite al usuario indicar niveles de seguridad a su sistema para todos los programas de Java. Hay tambin una forma de seguridad relacionada con la confianza. Esto se basa es saber que el cdigo Java procede de un sitio de confianza y no de una fuente no identificada. Se consigue gracias a que en Java se permite aadir firmas digitales al cdigo para verificar la autora del mismo.

(14 )

CBTis No. 134. Tcnico en Programacin

(3.2.3) tipos de aplicaciones Java


applets Son programas Java pensados para ser colocados dentro de una pgina web. Pueden ser interpretados por cualquier navegador con capacidades Java. Estos programas se insertan en las pginas usando una etiqueta especial (como tambin se insertan vdeos, animaciones flash u otros objetos). Los applets son programas independientes, pero al estar incluidos dentro de una pgina web las reglas de stas le afectan. Normalmente un applet slo puede actuar sobre el navegador. Hoy da mediante applets se pueden integrar en las pginas web aplicaciones multimedia avanzadas (incluso con imgenes 3D o sonido y vdeo de alta calidad) aplicaciones de consola Son programas independientes al igual que los creados con los lenguajes tradicionales. aplicaciones grficas Aquellas que utilizan las clases con capacidades grficas (como awt ejemplo). servlets Son aplicaciones que se ejecutan en un servidor de aplicaciones web y que como resultado de su ejecucin resulta una pgina web. midlet Aplicacin creada con Java para su ejecucin en sistemas de propsito simple o dispositivos mviles. Los juegos Java creados para telfonos mviles son midlets. por

(3.2.4) plataformas
Actualmente hay tres ediciones de Java. Cada una de ellas se corresponde con una plataforma que incluye una serie de funciones, paquetes y elementos del lenguaje (es decir la API, Application Program Interface). Java SE Java Standard Edition. Antes se la conoca como J2SE (el dos se refiere a Java 2). Permite escribir cdigo Java relacionado con la creacin de aplicaciones y applets en lenguaje Java comn. Es decir, es el Java normal. La ltima versin del kit de desarrollo de aplicaciones en esta plataforma es la JSE 1.6.14.

(15)

Fundamentos de programacin
(Programacin bsica en Java

Java EE Java Enterprise Edition. Todava conocida como J2EE. Pensada para la creacin de aplicaciones Java empresariales y del lado del servidor. Su ltima versin es la 1.4 Java ME Java Mobile Edition. Tambin conocida como J2ME. Pensada para la creacin de aplicaciones Java para dispositivos mviles.

(3.3) empezar a trabajar con Java


(3.3.1) el kit de desarrollo Java (SDK)
Para escribir en Java hacen falta los programas que realizan el precompilado y la interpretacin del cdigo, Hay entornos que permiten la creacin de los bytecodes y que incluyen herramientas con capacidad de ejecutar aplicaciones de todo tipo. El ms famoso (que adems es gratuito) es el Java Developer Kit (JDK) de Sun, que se encuentra disponible en la direccin http://java.sun.com/javase/downloads. Actualmente ya no se le llama as sino que se le llama SDK y al descargarlo de Internet hay que elegir la plataforma deseada (SE, EE o ME).

(3.3.2) versiones de Java


Como se ha comentado anteriormente, para poder crear los bytecodes de un programa Java, hace falta el SDK de Sun. Sin embargo, Sun va renovando este kit actualizando el lenguaje. De ah que se hable de Java 1.1, Java 1.2, etc. Los nombres de los distintos SDK y del lenguaje correspondiente, estn reflejados en esta tabla:
Versin del SDK para la versin Nombre que se le da al kit de desarrollo estndar de Java 1.1 JDK 1.1 1.2 J2SE 1.2 1.3 J2SE 1.3 1.4 J2SE 1.4 1.5 J2SE 1.5 1.6 Java SE 6 1.7 Java SE 7

Desde la versin 1.2 se habla de Java 2. Desde la versin 1.6 se ha abandonado la terminologa Java 2 y ahora se habla de Java 6 y Java 7 para las versiones 1.6 y 1.7 del kit de desarrollo. Cada versin tiene varias revisiones, as la versin 1.6.7 del SDK indica versin 6 de Java, revisin 7.

(16 )

CBTis No. 134. Tcnico en Programacin

Java 1.0 (JDK 1.0) Fue la primera versin de Java y propuso el marco general en el que se desenvuelve Java. est oficialmente obsoleto, pero hay todava muchos clientes con esta versin. Java 1.1 (JDK 1.1) Mejor la versin anterior incorporando las siguientes mejoras:

JDBC, API de acceso a bases de datos RMI llamadas a mtodos remotos. Es una tcnica de comunicacin de
procesos en red

JavaBeans, componentes independientes reutilizables. Internacionalizacin para crear programas adaptables a todos los
idiomas

Clases internas
Java 2 (J2SE 1.2) Apareci en Diciembre de 1998 al aparecer el JDK 1.2. Incorpor notables mejoras como por ejemplo:

JFC. Java Foundation classes. El conjunto de clases de todo para


crear programas ms atractivos de todo tipo. Dentro de este conjunto estn: Se trata de todo un conjunto de clases que permiten desarrollar fcilmente entornos de ventanas. Es parte de JFC. aplicaciones distribuidas del lado del servidor

El paquete Swing. Mejorando notablemente al anterior paquete AWT.

Enterprise Java beans. Para la creacin de componentes para Java Media. Conjunto de paquetes para crear paquetes multimedia:
Java 2D. Paquete (parte de JFC) que permite crear grficos de alta calidad en los programas de Java. Java 3D. Paquete (parte de JFC) que permite crear grficos tridimensionales. Java Media Framework. multimedia Paquete marco para crear elementos

Java Speech. Para reconocimiento de voz. Java Sound. Audio de alta calidad Java TV. Televisin interactiva

JNDI. Java Naming and Directory Interface. Servicio general de

bsqueda de recursos. Integra los servicios de bsqueda ms populares (como LDAP por ejemplo). (17)

Fundamentos de programacin
(Programacin bsica en Java

Java Servlets. Herramienta para crear aplicaciones de servidor web (y


tambin otros tipos de aplicaciones).

Java Cryptography. Algoritmos para encriptar y desencriptar. Java Help. Creacin de sistemas de ayuda. Jini. Permite la programacin de electrodomsticos. Java card. Versin de Java electrnicos. dirigida a pequeos dispositivos

Java IDL. Lenguaje de definicin de interfaz. Permite crear


aplicaciones tipo CORBA (plataforma de desarrollo de sistemas distribuidos)

Clases para la creacin de colecciones


Java 1.3 (J2SE 1.3)

Se utiliza la mquina virtual de Hotspot (ms rpida y segura). Se modifica RMI para que trabaje con CORBA JPDA, Java Platform Debugger Architectura
Java 1.4 (J2SE 1.4)

Aparecen las aserciones (assert) Expresiones regulares estilo Perl. NIO. Nuevo interfaz de entrada y salida de datos.
JAXP. API de desarrollo de documentos XML. Aparecen las plantillas Metadatos Autoboxing, conversin automtica de tipos a tipos envolventes. Enumeraciones Argumentos variables (varargs) Mejora del bucle for Java 1.5 (J2SE 1.5)

Java 1.6 (Java SE 6)

Combinacin con otros lenguajes (PHP, Ruby, Perl,) ltimas especificaciones de JAX-WS 2.0, JAXB 2.0, STAX y JAXP para
crear servicios web.

(18 )

CBTis No. 134. Tcnico en Programacin

(3.3.3) instalacin del SDK


Es un requisito previo antes de programar en lenguaje Java. en Windows Desde la pgina de descarga http://java.sun.com/javase/downloads se elige la versin deseada del entorno de desarrollo. Una vez descargado el programa de instalacin del SDK, basta con ejecutarle. Hay que prestar atencin al directorio en el que se ha instalado el SDK. La razn es que debemos modificar tres variables del sistema (variables que utiliza Windows para la configuracin correcta de comandos). Son:

PATH. Variable que contiene rutas por defecto a los programas que

indiquemos. La razn es que por ejemplo el comando java debe de estar disponible estemos en la carpeta que estemos. Dicho comando (junto con el resto de comandos del SDK) est en la carpeta bin dentro de la carpeta en la que hemos instalado el SDK. Ejemplo de contenido de la variable path:

PATH=C:\WINNT\SYSTEM32;C:\WINNT;C:\WINNT\SYSTEM32\WBE M;C:\Archivos de programa\Microsoft Visual Studio\Common\Tools\WinNT;C:\Archivos de programa\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Archivos de programa\Microsoft Visual Studio\Common\Tools;C:\Archivos de programa\Microsoft Visual Studio\VC98\bin;C:\Archivos de programa\java\jsdk1.6.2\bin

JAVA_HOME. Variable utilizada por la mayora de aplicaciones basadas


en Java que contiene la ruta a la carpeta en la que se instal el SDK.

CLASSPATH. Se explicara con detalle ms adelante en este mismo

manual. Es una variable similar al PATH que sirve para indicar rutas a las carpetas en las que se almacenarn aplicaciones Java. Dicho de una manera ms tcnica: contiene las rutas de todos los filesystems de Java.

La forma de configurar estas variables en Windows (si al menos tenemos versin de Windows superior o igual al 2000): (1) Sealar al icono Mi PC (o Equipo en Windows Vista, Windows 2008 o Windows 7) y elegir Propiedades. Despus elegir Propiedades Avanzadas y finalmente pulsar en el botn Variables de entorno.

(19 )

Fundamentos de programacin
(Programacin bsica en Java

Ilustracin 3-3, El cuadro de las variables del Sistema en Windows Server 2008

(2)

Dentro de este cuadro, ya estar la variable PATH. Habr que elegirla y pulsar en modificar. Sin borrar nada de lo que contiene, debemos aadir al final del texto el smbolo ; y despus la ruta al directorio bin dentro de la carpeta del SDK (por ejemplo C:\"Program Files"\Java\jdk1.6.14\bin). Tras aceptar el cuadro anterior, podremos pulsar en Nueva para aadir la variable JAVA_HOME indicando como valor la ruta al SDK.

(3)

Ilustracin 3-4, Ejemplo de configuracin de la variable JAVA_HOME en Windows

(4)

Hacer el mismo proceso para la variable CLASSPATH

Para comprobar la versin de Java basta con ir al smbolo del sistema Windows y escribir java version

(20 )

CBTis No. 134. Tcnico en Programacin

en Linux

Ilustracin 3-5, El gestor de paquetes Synaptic en el sistema Linux Ubuntu, mostrando informacin sobre los paquetes Java

Casi todas las versiones actuales de Linux incluyen el entorno de ejecucin (JRE) de Java y la mayora el entorno de desarrollo (SDK). Esto significa que seguramente no haya que instalar nada. Para conocer la versin instalada habra que ejecutar el comando java version. Si deseamos instalar Java o actualizarlo, hay que instalar el ltimo paquete, una opcin es utilizar el gestor Synaptic para descargar la ltima versin del paquete de desarrollo en Java (ver Ilustracin 3-5). Tambin podemos instalar desde la lnea de comandos, sera algo como sudo apt-get install sun-java6-jdk Finalmente siempre podemos acudir a la pgina de descargas de Sun, http://java.sun.com/javase/downloads y descargar la versin deseada. El archivo hay que descomprimirlo (si es un paquete rpm) o ejecutarlo (si es simplemente un archivo bin). Se obtendr un directorio con todo el SDK de Java. Ahora bastar con colocarlo en el directorio adecuado. En todo caso, sea cual sea la forma de instalar el SDK, habr que modificar tres variables de entorno. Para lo cual lo normal es modificar el fichero /etc/bash.bashrc y al final aadir las siguientes entradas:

export JAVA_HOME="ruta en la que est el SDK de Java"


La ruta podra ser algo como /usr/lib/jvm/java6sun (21 )

Fundamentos de programacin
(Programacin bsica en Java

export PATH="$PATH:$JAVA_HOME/bin" export CLASSPATH="rutas a los directorios en los que se


almacenarn programas en Java" En el caso de la variable CLASSPATH, es muy conveniente que su ruta incluya el directorio actual (el smbolo .)~. Un ejemplo de uso de CLASSPATH en el archivo bashrc sera: export CLASSPATH="/usr/lib/jvm/java-6-sun:." Gracias a ello podremos colocar programas Java y ejecutarlos sin problemas en la carpeta raz del SDK y en la carpeta actual en la que nos encontremos. instalacin del cdigo fuente de las bibliotecas Como otros lenguajes, Java se compone de una serie de bibliotecas. En el caso de Java estas bibliotecas son inmensas y estn comprimidas en el archivo src.jar. Es muy habitual en Java el uso de archivos JAR. En realidad son archivos que aglutinan cdigo fuente en java, comprimindoles en formato ZIP . Para poder acceder al cdigo fuente en s debemos descomprimir dicho archivo. Lo cual se hace (en cualquier sistema): (1) (2) (3) Yendo a la carpeta o directorio en el que se encuentra el SDK (es decir yendo a JAVA_HOME). All se encuentra el archivo src.jar Descomprimirle con la orden jar xvf src.jar

Actualmente el archivo se llama src.zip, con lo que se puede descomprimir con cualquier programa capaz de manejar archivos ZIP. documentacin En http://java.sun.com/docs se encuentra la documentacin oficial de Java. La ms interesante es la documentacin del API de Java (clases estndar de Java). Aunque inicialmente es conveniente pasar por Get Started. La nica pega es que no hay documentacin en castellano. Otra posibilidad (ms recomendable incluso), es descargarse la documentacin en un archivo zip. De esta forma no dependeremos de la conexin a Internet para consultar la documentacin oficial. Esto se puede realizar de la pgina de descarga http://java.sun.com/javase/downloads/index.jsp

(3.3.4) entornos de trabajo


El cdigo en Java se puede escribir en cualquier editor de texto. Y para compilar el cdigo en bytecodes, slo hace falta descargar la versin del JDK deseada. Sin embargo, la escritura y compilacin de programas hecha de esta forma es un poco incomoda. Por ello numerosas empresas fabrican sus propios (22 )

CBTis No. 134. Tcnico en Programacin

entornos de edicin, algunos incluyen el compilador y otras utilizan el propio JDK de Sun. Algunas ventajas que ofrecen son:

Facilidades para escribir cdigo: coloreado de las palabras clave,


autocorreccin al escribir, abreviaturas,

Facilidades de depuracin, para probar el programa Facilidad de configuracin del sistema. Eleccin concreta del
directorio del SDK, manipulacin de la variable CLASSPATH, etc.

Facilidades para organizar los archivos de cdigo. Facilidad para exportar e importar proyectos
Los IDE ms utilizados en la actualidad son:

Eclipse. Es un entorno completo de cdigo abierto que posee


numerosas extensiones (incluido un mdulo para JEE y otro para programar en C++) y posibilidades. Hoy en da es el ms utilizado y recomendable. Posee una comunidad muy dinmica y desde luego es uno de los ms potentes. Disponible en www.eclipse.org. cdigo en diversos lenguajes (especialmente pensado para Java). Contiene prcticamente todo lo que se suele pedir a un IDE, editor avanzado de cdigo, depurador, diversos lenguajes, extensiones de todo tipo (CORBA, Servlets,...). Incluye adems un servidor de aplicaciones Tomcat para probar aplicaciones de servidor. Se descarga en www.netbeans.org. por su lenguaje Delphi) para la creacin de todo tipo de aplicaciones Java, incluidas aplicaciones para mviles. Es un entorno muy potente. aplicaciones Java y XML. Uno de los ms potentes y completos (ideal para programadores de Oracle). utilizar pero a la vez con caractersticas similares al resto. Es menos pesado que los anteriores y muy bueno con el cdigo. para los conocedores de los entornos de desarrollo de Microsoft (como Visual Basic por ejemplo), de hecho son lenguajes integrados en el Visual Studio y Visual Studio.Net respectivamente. Pero el Java de Microsoft no es estndar. El nico uso que tiene es para aquellos programadores de Java que necesitan programar para la plataforma .Net de Microsoft y que no desean aprender los lenguajes propios de esta plataforma como C# o Visual Basic por ejemplo. (23 )

NetBeans. Entorno gratuito de cdigo abierto para la generacin de

JBuilder. Entorno completo creado por la empresa Borland (famosa

JDeveloper. De Oracle. Entorno completo para la construccin de

IntelliJ Idea. Entorno comercial de programacin bastante fcil de Microsoft Visual J++ y Visual J#. Ofrece un compilador recomendable

Fundamentos de programacin
(Programacin bsica en Java

En este documento hay informacin sobre el manejo de Eclipse y de Netbeans para crear aplicaciones en Java (vanse los apndices 1 y 2).

(3.4) escritura de programas Java


(3.4.1) codificacin del texto
Todos el cdigo fuente Java se escriben en documentos de texto con extensin .java. Por lo tanto para escribirlo basta cualquier editor de texto como el bloc de notas de Windows o los editores vi o gedit de Linux. Al ser un lenguaje multiplataforma y especialmente pensado para su integracin en redes, la codificacin de texto utiliza el estndar Unicode; lo que implica que los programadores y programadoras hispanohablantes podemos utilizar sin problemas smbolos de nuestra lengua como la ee o las vocales con tildes o diresis a la hora de poner nombre a nuestras variables. La codificacin Unicode 4 usa normalmente 16 bits (2 bytes por carcter) e incluye la mayora de los cdigos alfabticos del mundo.

(3.4.2) notas previas


Los archivos con cdigo fuente en Java deben guardarse con la extensin .java. Como se ha comentado cualquier editor de texto basta para crearle. Algunos detalles importantes son:

En java (como en C) hay diferencia entre maysculas y minsculas. Cada lnea de cdigo debe terminar con ; Una instruccin puede abarcar ms de una lnea. Adems se pueden
dejar espacios y tabuladores a la izquierda e incluso en el interior de la instruccin para separar elementos de la misma. ms de una lnea deben comenzar con /* y terminar con */

Los comentarios; si son de una lnea debe comenzar con // y si ocupan


/* Comentario de varias lneas */ //Comentario de una lnea Tambin se pueden incluir comentarios javadoc (se explican en detalle ms adelante)

Para ms informacin acudir a http://www.unicode.org

(24 )

CBTis No. 134. Tcnico en Programacin

A veces se marcan bloques de cdigo, es decir cdigo agrupado. Cada


bloque comienza con { y termina con } { ...cdigo dentro del bloque } cdigo fuera del bloque

(3.4.3) el primer programa en Java


public class PrimerPrograma { public static void main(String[] args) { System.out.println(Mi primer programa!); } } Este cdigo sirve para escribir Mi primer programa! en la pantalla. Para empezar a entender el cdigo:

La primera lnea (public class PrimerPrograma) declara el nombre de


la clase del cdigo. Ms adelante se explicar que significa el concepto de clase; por ahora entenderemos que el nombre de la clase es el nombre del programa.

La lnea public static void main(String args[]), sirve para indicar el

inicio del mtodo main. Este mtodo contiene las instrucciones que se ejecutarn cuando el programa arranque. Es decir lo que est tras las llaves del main, es el programa en s. Como lo que escribimos es un texto, se encierra entre comillas.

La instruccin System.out.println sirve para escribir en pantalla.


Adems, el archivo tiene que llamarse obligatoriamente PrimerPrograma.java ya que el nombre del programa (en realidad el nombre de la clase) y el del archivo deben coincidir. Por ltimo, aunque no es obligatorio, es ms que aconsejable que el nombre del programa comience con una letra mayscula y le sigan letras en minsculas. Si consta de varias palabras no pueden utilizarse espacios en blanco, por lo que se suelen juntar las palabras poniendo cada inicial de la palabra en maysculas. ste tipo de reglas no obligatorias sino aconsejables (como por ejemplo el hecho de que las instrucciones interiores a un bloque dejen espacio a su izquierda) producen un cdigo ms legible y sobre todo hace que todos los programadores del planeta adoptemos la misma forma de escribir, simplificando el entendimiento del cdigo.

(25 )

Fundamentos de programacin
(Programacin bsica en Java

(3.5) ejecucin de programas Java


(3.5.1) proceso de compilacin desde la lnea de comandos
La compilacin del cdigo java se realiza mediante el programa javac incluido en el software de desarrollo de Java (el SDK). La forma de compilar es (desde la lnea de comandos): javac archivo.java El resultado de esto es un archivo con el mismo nombre que el archivo java pero con la extensin class. Esto ya es el archivo con el cdigo en forma de bytecode. Es decir con el cdigo precompilado. Si el programa es ejecutable (slo lo son si contienen el mtodo main), el cdigo se puede interpretar usando el programa java del kit de desarrollo (que se encuentra en el mismo sitio que javac). Sintaxis: java archivoClass Estos comandos hay que escribirlos desde la lnea de comandos de en la carpeta en la que se encuentre el programa. Pero antes hay que asegurarse de que los programas del kit de desarrollo son accesibles desde cualquier carpeta del sistema. Para ello hay que haber configurado adecuadamente las variables del sistema (vase apartado (3.3.3) instalacin del SDK). En el caso de Linux hay que ser especialmente cuidadoso con la variable de sistema CLASSPATH y asegurarnos de que contiene en sus rutas races de Java el smbolo "." (punto) que representa a la carpeta actual. De otro modo la ejecucin del comando java podra fallar.

Ilustracin 3-6, Ejemplo de compilacin y ejecucin en la lnea de comandos

(26 )

CBTis No. 134. Tcnico en Programacin

(3.6) javadoc
Javadoc es una herramienta muy interesante del kit de desarrollo de Java para generar automticamente documentacin Java. genera documentacin para paquetes completos o para archivos java. Su sintaxis bsica es: javadoc archivo.java o paquete El funcionamiento es el siguiente. Los comentarios que comienzan con los cdigos /** se llaman comentarios de documento y sern utilizados por los programas de generacin de documentacin javadoc. Los comentarios javadoc comienzan con el smbolo /** y terminan con */ Cada lnea javadoc se suele iniciar con el smbolo de asterisco para mejorar su legibilidad. Dentro se puede incluir cualquier texto; incluso se pueden utilizar cdigos HTML para que al generar la documentacin se tenga en cuenta el cdigo HTML indicado. En el cdigo javadoc se pueden usar etiquetas especiales, las cuales comienzan con el smbolo @. Pueden ser:

@author. Tras esa palabra se indica el autor del documento. @version. Tras lo cual sigue el nmero de versin de la aplicacin @see. Tras esta palabra se indica una referencia a otro cdigo Java
relacionado con ste.

@since. Indica desde cundo esta disponible este cdigo @deprecated. Palabra a la que no sigue ningn otro texto en la lnea y
que indica que esta clase o mtodo esta obsoleta u obsoleto.

@throws. Indica las excepciones que pueden lanzarse en ese cdigo. @param. Palabra a la que le sigue texto qu describe a los parmetros

que requiere el cdigo para su utilizacin (el cdigo en este caso es un mtodo de clase). Cada parmetro se coloca en una etiqueta @param distinta, por lo que puede haber varios @param para el mismo mtodo. cdigo (el cdigo en este caso es un mtodo de clase)

@return. Tras esta palabra se describe los valores que devuelve el


El cdigo javadoc hay que colocarle en tres sitios distintos dentro del cdigo java de la aplicacin:

Al principio del cdigo de la clase (antes de cualquier cdigo Java).


En esta zona se colocan comentarios generales sobre la clase o interfaz que se crea mediante el cdigo Java. Dentro de estos comentarios se pueden utilizar las etiquetas: @author, @version, @see, @since y @deprecated

(27 )

Fundamentos de programacin
(Programacin bsica en Java

Delante de cada mtodo. Los mtodos describen las cosas que puede

realizar una clase. Delante de cada mtodo los comentarios javadoc se usan para describir al mtodo en concreto. Adems de los comentarios, en esta zona se pueden incluir las etiquetas: @see, @param, @exception, @return, @since y @deprecated cada clase. Puede poseer las etiquetas: @since y @deprecated

Delante de cada atributo. Se describe para qu sirve cada atributo en


Ejemplo: /** Esto es un comentario para probar el javadoc * este texto aparecer en el archivo HTML generado. * <strong>Realizado en agosto 2003</strong> * * @author Jorge Snchez * @version 1.0 */ public class prueba1 { //Este comentario no aparecer en el javadoc /** Este mtodo contiene el cdigo ejecutable de la clase * * @param args Lista de argumentos de la lnea de comandos * @return void */ public static void main(String args[]){ System.out.println("Mi segundo programa! "); } } Tras ejecutar la aplicacin javadoc, aparece como resultado la pgina web de la pgina siguiente.

(28 )

CBTis No. 134. Tcnico en Programacin

Ilustracin 3-7, Pgina de documentacin de un programa Java

(3.7) import
En cualquier lenguaje de programacin existen libreras que contienen cdigo ya escrito que nos facilita la creacin de programas. En el caso de Java no se llaman libreras, sino paquetes. Los paquetes son una especie de carpetas que contienen clases ya preparadas y ms paquetes. Cuando se instala el kit de desarrollo de Java, adems de los programas necesarios para compilar y ejecutar cdigo Java, se incluyen miles de clases dentro de cientos de paquetes ya listos que facilitan la generacin de programas. Algunos paquetes sirven para utilizar funciones matemticas, (29 )

Fundamentos de programacin
(Programacin bsica en Java

funciones de lectura y escritura, comunicacin en red, programacin de grficos,... Por ejemplo la clase System est dentro del paquete java.lang (paquete bsico) y posee el mtodo out.println que necesitamos para escribir fcilmente por pantalla. Si quisiramos utilizar la clase Date que sirve para manipular fechas, necesitaramos incluir una instruccin que permita incorporar el cdigo de Date cuando compilemos nuestro trabajo. Para eso sirve la instruccin import . La sintaxis de esta instruccin es: import paquete.subpaquete.subsubapquete....clase Esta instruccin se coloca arriba del todo en el cdigo. Para la clase Date sera: import java.util.Date; Lo que significa, importar en el cdigo la clase Date que se encuentra dentro del paquete util que, a su vez, est dentro del gran paquete llamado java. Tambin se puede utilizar el asterisco en esta forma: import java.util.*; Esto significa que se va a incluir en el cdigo todas las clases que estn dentro del paquete util de java. En realidad no es obligatorio incluir la palabra import para utilizar una clase dentro de un paquete, pero sin ella deberemos escribir el nombre completo de la clase. Es decir no podramos utilizar el nombre Date, sino java.util.Date.

(3.8) variables
(3.8.1) introduccin
Las variables son contenedores que sirven para almacenar los datos que utiliza un programa. Dicho ms sencillamente, son nombres que asociamos a determinados datos. La realidad es que cada variable ocupa un espacio en la memoria RAM del ordenador para almacenar el dato al que se refiere. Es decir cuando utilizamos el nombre de la variable realmente estamos haciendo referencia a un dato que est en memoria. Las variables tienen un nombre (un identificador) que slo puede contener letras, nmeros (pero no puede empezar el nombre con un nmero) y el carcter de subrayado. El nombre puede contener cualquier carcter Unicode

(30 )

CBTis No. 134. Tcnico en Programacin

que simbolice letras (valen smbolos como la , , no permitidos en la mayora de lenguajes por no ser parte del ASCII estndar)

(3.8.2) declaracin de variables


Antes de poder utilizar una variable, sta se debe declarar. Lo cual se debe hacer de esta forma: tipo nombrevariable; Donde tipo es el tipo de datos que almacenar la variable (texto, nmeros enteros,...) y nombrevariable es el nombre con el que se conocer la variable. Ejemplos: int das; // das es un nmero entero, sin decimales boolean decisin; //decisin slo puede ser verdadera o falsa Tambin se puede hacer que la variable tome un valor inicial al declarar: int das=365; Y se puede declarar ms de una variable a la vez del mismo tipo en la misma lnea si las separamos con comas int das=365, ao=23, semanas; Al declarar una variable se puede incluso utilizar una expresin: int a=13, b=18; int c=a+b; //es vlido, c vale 31 Java es un lenguaje muy estricto al utilizar tipos de datos. Variables de datos distintos son incompatibles. Algunos autores hablan de lenguaje fuertemente tipado o incluso lenguaje muy tipificado. Se debe a una traduccin muy directa del ingls strongly typed referida a los lenguajes que, como Java, son muy rgidos en el uso de tipos. El caso contrario sera el lenguaje C en el que jams se comprueban de manera estricta los tipos de datos. Parte de le seguridad y robustez de las que hace gala Java se deben a esta caracterstica.

(3.8.3) asignacin
En Java para asignar valores a una variable, basta con utilizar el signo =. Ya se ha visto en el apartado anterior que al declarar se puede asignar un valor: int x=7;

(31)

Fundamentos de programacin
(Programacin bsica en Java

Pero la asignacin se puede utilizar en cualquier momento (tras haber declarado la variable): int x; x=7; x=x*2; Como se ve en la ltima lnea anterior, la expresin para dar el valor a la variable puede ser tan compleja como queramos. A diferencia de lenguajes como C, en Java siempre se asigna una valor inicial a las variables en cuanto se declaran. En el caso de los nmeros es el cero. int x; //x ya vale cero

(3.9) tipos de datos primitivos


Tipo de variable boolean byte short int long double float char Bytes que ocupa 2 1 2 4 8 8 4 2 Rango de valores true, false -128 a 127 -32.768 a 32.767 -2.147.483.648 a 2.147.483.649 -9 1018 a 9 1018 -1,79 10308 a 1,79 10308 -3,4 1038 a 3,4 1038 Caracteres (en Unicode)

(3.9.1) enteros
Los tipos byte, short, int y long sirven para almacenar datos enteros. Los enteros son nmeros sin decimales. Se pueden asignar enteros normales o enteros octales y hexadecimales. Los octales se indican anteponiendo un cero al nmero, los hexadecimales anteponiendo 0x. int numero=16; //16 decimal numero=020; //20 octal=16 decimal numero=0x14; //10 hexadecimal=16 decimal Normalmente un nmero literal se entiende que es de tipo int salvo si al final se le coloca la letra L; se entender entonces que es de tipo long. No se acepta en general asignar variables de distinto tipo. S se pueden asignar valores de variables enteras a variables enteras de un tipo superior (por ejemplo asignar un valor int a una variable long). Pero al revs no se puede: int i=12; (32 )

CBTis No. 134. Tcnico en Programacin

byte b=i;//error de compilacin, posible prdida de precisin La solucin es hacer un cast. Esta operacin permite convertir valores de un tipo a otro. Se usa as: int i=12; byte b=(byte) i; //El (cast) evita el error

Hay que tener en cuenta en estos castings que si el valor asignado sobrepasa el rango del elemento, el valor convertido no tendr ningn sentido ya que no puede almacenar todos los bits necesarios para representar ese nmero: int i=1200; byte b=(byte) i; //El valor de b no tiene sentido

(3.9.2) nmeros en coma flotante


Los decimales se almacenan en los tipos float y double. Se les llama de coma flotante por como son almacenados por el ordenador. Los decimales no son almacenados de forma exacta por eso siempre hay un posible error. En los decimales de coma flotante se habla, por tanto de precisin. Es mucho ms preciso el tipo double que el tipo float. Para asignar valores literales a una variable de coma flotante, hay que tener en cuenta que el separador decimal es el punto y no la coma. Es decir para asignar el valor 2,75 a la variable x se hara: x=2.75; A un valor literal (como 1.5 por ejemplo), se le puede indicar con una f al final del nmero que es float (1.5f por ejemplo) o una d para indicar que es double. Si no se indica nada, un nmero literal siempre se entiende que es double, por lo que al usar tipos float hay que convertir los literales. Los valores decimales se pueden representar en notacin decimal: 1.345E+3 significara 1,345103 o lo que es lo mismo 1345. Lgicamente no podemos asignar valores decimales a tipos de datos enteros: int x=9.5; //error S podremos mediante un cast: int x=(int) 9.5; pero perderemos los decimales (en el ejemplo, x vale 9). El caso contrario sin embargo s se puede hacer: int x=9; double y=x; //correcto (33 )

Fundamentos de programacin
(Programacin bsica en Java

la razn es que los tipos de coma flotante son ms grandes que los enteros, por lo que no hay problema de prdida de valores. Al declarar nmeros del tipo que sean, si no se indican valores iniciales, Java asigna el valor cero.

(3.9.3) booleanos
Los valores booleanos (o lgicos) sirven para indicar si algo es verdadero (true) o falso (false). boolean b=true; Si al declarar un valor booleano no se le da un valor inicial, se toma como valor inicial el valor false. Por otro lado, a diferencia del lenguaje C, no se pueden en Java asignar nmeros a una variable booleana (en C, el valor false se asocia al nmero 0, y cualquier valor distinto de cero se asocia a true). Tampoco tiene sentido intentar asignar valores de otros tipos de datos a variables booleanas mediante casting: boolean b=(boolean) 9; //no tiene sentido

(3.9.4) caracteres
Los valores de tipo carcter sirven para almacenar smbolos de escritura (en Java se puede almacenar cualquier cdigo Unicode). Los valores Unicode son los que Java utiliza para los caracteres. Ejemplo: char letra; letra=C; //Los caracteres van entre comillas letra=67; //El cdigo Unicode de la C es el 67. Esta lnea //hace lo mismo que la anterior Tambin hay una serie de caracteres especiales que van precedidos por el smbolo \, son estos:
carcter \b \t \n \f \r \ \ \\ \udddd significado Retroceso Tabulador Nueva lnea Alimentacin de pgina Retorno de carro Dobles comillas Comillas simples Barra inclinada (backslash) Las cuatro letras d, son en realidad nmeros en hexadecimal. Representa el carcter Unicode cuyo cdigo es representado por las dddd

(34 )

CBTis No. 134. Tcnico en Programacin

(3.9.5) conversin entre tipos ( casting)


Ya se ha comentado anteriormente la necesidad de uso del operador de casting para poder realizar asignaciones entre tipos distintos. Como resumen general del uso de casting vanse estos ejemplos: int a;byte b=12; a=b; El cdigo anterior es correcto porque un dato byte es ms pequeo que uno int y Java le convertir de forma implcita. Lo mismo pasa de int a double por ejemplo. Sin embargo en: int a=1; byte b; b=a; El compilador devolver error aunque el nmero 1 sea vlido para un dato byte. Para ello hay que hacer un casting. Eso significa poner el tipo deseado entre parntesis delante de la expresin. int a=1; byte b; b= (byte) a; //correcto En el siguiente ejemplo: byte n1=100, n2=100, n3; n3= n1 * n2 /100; Aunque el resultado es 100, y ese resultado es vlido para un tipo byte; lo que ocurrir en realidad es un error. Eso es debido a que la multiplicacin 100 * 100 da como resultado 10000, es decir un nmero de tipo int. Aunque luego se divide entre 100, no se vuelve a convertir a byte; ya que ante cualquier operacin el tipo resultante siempre se corresponde con el tipo ms grande que intervenga en la operacin. Lo correcto sera: n3 = (byte) (n1 * n2 / 100);

(3.9.6) mbito de las variables


Toda variable tiene un mbito. Esto es la parte del cdigo en la que una variable se puede utilizar. De hecho las variables tienen un ciclo de vida: (1) (2) (3) En la declaracin se reserva el espacio necesario para que se puedan comenzar a utilizar (digamos que se avisa de su futura existencia) Se la asigna su primer valor (la variable nace ) Se la utiliza en diversas sentencias (35 )

Fundamentos de programacin
(Programacin bsica en Java

(4)

Cuando finaliza el bloque en el que fue declarada, la variable muere. Es decir, se libera el espacio que ocupa esa variable en memoria. No se la podr volver a utilizar.

Una vez que la variable ha sido eliminada, no se puede utilizar. Dicho de otro modo, no se puede utilizar una variable ms all del bloque en el que ha sido definida. Ejemplo: { int x=9; } int y=x; //error, ya no existe x

(3.10) operadores
(3.10.1) introduccin
Los datos se manipulan muchas veces utilizando operaciones con ellos. Los datos se suman, se restan, ... y a veces se realizan operaciones ms complejas.

(3.10.2) operadores aritmticos


Son:
+ * / % operador Suma Resta Producto Divisin Mdulo (resto) significado

Hay que tener en cuenta que el resultado de estos operadores vara notablemente si usamos enteros o si usamos nmeros de coma flotante. Por ejemplo: double resultado1, d1=14, d2=5; int resultado2, i1=14, i2=5; resultado1= d1 / d2; resultado2= i1 / i2; resultado1 valdr 2.8 mientras que resultado2 valdr 2.

(36 )

CBTis No. 134. Tcnico en Programacin

Es ms incluso: double resultado; int i1=7,i2=2; resultado=i1/i2; //Resultado valdr 3 resultado=(double)i1/i2; //Resultado valdr 3.5 El operador del mdulo (%) sirve para calcular el resto de una divisin entera. Ejemplo: int resultado, i1=14, i2=5; resultado = i1 % i2; //El resultado ser 4 El mdulo slo se puede utilizar con tipos enteros

(3.10.3) operadores condicionales


Sirven para comparar valores. Siempre devuelven valores booleanos. Son:
operador < > >= <= == != ! && || Menor Mayor Mayor o igual Menor o igual Igual Distinto No lgico (NOT) Y lgico (AND) O lgico (OR) significado

Los operadores lgicos (AND, OR y NOT), sirven para evaluar condiciones complejas. NOT sirve para negar una condicin. Ejemplo: boolean mayorDeEdad, menorDeEdad; int edad = 21; mayorDeEdad = edad >= 18; //mayorDeEdad ser true menorDeEdad = !mayorDeEdad; //menorDeEdad ser false El operador && (AND) sirve para evaluar dos expresiones de modo que si ambas son ciertas, el resultado ser true sino el resultado ser false. Ejemplo: boolean carnetConducir=true; int edad=20; boolean puedeConducir= (edad>=18) && carnetConducir; //Si la edad es de al menos 18 aos y carnetConducir es //true, puedeConducir es true (37 )

Fundamentos de programacin
(Programacin bsica en Java

El operador || (OR) sirve tambin para evaluar dos expresiones. El resultado ser true si al menos uno de las expresiones es true. Ejemplo: boolean nieva =true, llueve=false, graniza=false; boolean malTiempo= nieva || llueve || graniza;

(3.10.4) operadores de BIT


Manipulan los bits de los nmeros. Son:
operador & | ~ ^ >> << >>> <<< significado AND OR NOT XOR Desplazamiento Desplazamiento Desplazamiento Desplazamiento

a la derecha a la izquierda derecha con relleno de ceros izquierda con relleno de ceros

(3.10.5) operadores de asignacin


Permiten asignar valores a una variable. El fundamental es =. Pero sin embargo se pueden usar expresiones ms complejas como: x += 3; En el ejemplo anterior lo que se hace es sumar 3 a la x (es lo mismo x+=3, que x=x+3). Eso se puede hacer tambin con todos estos operadores: += &= >>= -= |= <<= *= ^= /= %=

Tambin se pueden concatenar asignaciones (aunque no es muy recomendable): x1 = x2 = x3 = 5; //todas valen 5 Otros operadores de asignacin son ++ (incremento) y -- (decremento). Ejemplo: x++; //esto es x=x+1; x--; //esto es x=x-1; Pero hay dos formas de utilizar el incremento y el decremento. Se puede usar por ejemplo x++ o ++x La diferencia estriba en el modo en el que se comporta la asignacin.

(38 )

CBTis No. 134. Tcnico en Programacin

Ejemplo: int x=5, y=5, z; z=x++; //z vale 5, x vale 6 z=++y; //z vale 6, y vale 6

(3.10.6) operador ?
Este operador (conocido como if de una lnea) permite ejecutar una instruccin u otra segn el valor de la expresin. Sintaxis: expresionlogica?valorSiVerdadero:valorSiFalso; Ejemplo: paga=(edad>18)?6000:3000; En este caso si la variable edad es mayor de 18, la paga ser de 6000, sino ser de 3000. Se evala una condicin y segn es cierta o no se devuelve un valor u otro. Ntese que esta funcin ha de devolver un valor y no una expresin correcta. Es decir, no funcionara: (edad>18)? paga=6000: paga=3000; //ERROR!!!!

(3.10.7) precedencia
A veces hay expresiones con operadores que resultan confusas. Por ejemplo en: resultado = 8 + 4 / 2; Es difcil saber el resultado. Cul es? seis o diez? La respuesta es 10 y la razn es que el operador de divisin siempre precede en el orden de ejecucin al de la suma. Es decir, siempre se ejecuta antes la divisin que la suma. Siempre se pueden usar parntesis para forzar el orden deseado: resultado = (8 + 4) / 2; Ahora no hay duda, el resultado es seis. No obstante el orden de precedencia de los operadores Java es:
nivel 1 2 3 4 5 6 () ++ * + >> > operador [] -/ >>> >= . ~ % << <

<<< <=

(39 )

Fundamentos de programacin
(Programacin bsica en Java

nivel 7 8 9 10 11 12 13 14

== & ^ | && || ?: =

operador !=

+=, -=, *=,...

En la tabla anterior los operadores con mayor precedencia est en la parte superior, los de menor precedencia en la parte inferior. De izquierda a derecha la precedencia es la misma. Es decir, tiene la misma precedencia el operador de suma que el de resta. Esto ltimo provoca conflictos, por ejemplo en: resultado = 9 / 3 * 3; El resultado podra ser uno nueve. En este caso el resultado es nueve, porque la divisin y el producto tienen la misma precedencia; por ello el compilador de Java realiza primero la operacin que este ms a la izquierda, que en este caso es la divisin. Una vez ms los parntesis podran evitar estos conflictos.

(3.11) constantes
Una constante es una variable de slo lectura. Dicho de otro modo ms correcto, es un valor que no puede variar (por lo tanto no es una variable). La forma de declarar constantes es la misma que la de crear variables, slo que hay que anteponer la palabra final que es la que indica que estamos declarando una constante y por tanto no podremos variar su valor inicial: final double PI=3.141591; PI=4; //Error, no podemos cambiar el valor de PI Como medida aconsejable (aunque no es obligatoria, s altamente recomendable), los nombres de las constantes deberan ir en maysculas.

(40 )

CBTis No. 134. Tcnico en Programacin

(3.12) lectura y escritura por teclado


(3.12.1) escritura
Ya hemos visto que hay una funcin para escribir que es System.out.println. Dicha funcin puede recibir como parmetro cualquier tipo bsico de datos: es decir puede recibir un texto literal (siempre entre comillas), pero tambin puede escribir expresiones enteras, booleanas, decimales y caracteres simples. Ejemplo: int a=5, b=9; double c=5.5; System.out.println("Este es un texto literal"); System.out.println(a+b); //Escribe 14 System.out.println(c*c); //Escribe 30.25 System.out.println(a<c);//Escribe true Esta funcin tras escribir aade un salto de lnea, de modo que lo siguiente que se escriba saldr en otra lnea. Existe una variante de esta funcin que no inserta el salto de lnea es System.out.print : System.out.print("todo en la "); System.out.print("misma lnea "); Si deseamos que el mismo println o print escriba varios valores en la misma instruccin, podemos usar el operador de encadenar textos, ejemplo: int a=5, b=9; System.out.println("La suma es "+(a+b)); Es necesario usar parntesis ya que se utiliza en la expresin el operador + con dos significados. Este operador concatena cuando al menos hay un texto a la izquierda o derecha del operador; y suma cuando tenemos dos nmeros (del tipo que sea).

(3.12.2) lectura
La lectura en Java es mucho ms complicada. Leer de la consola de salida requiere manejar muchos conocimientos que pertenecen a temas ms avanzados que el actual. Una forma no tan complicada (aunque desde luego no es tan sencilla como la escritura) es utilizar la clase JOptionPane. Dicha clase pertenece al paquete javax.swing, por lo que para utilizarla sin tener que escribir el nombre completo conviene usar la instruccin: import javax.swing.JOptionPane; (41 )

Fundamentos de programacin
(Programacin bsica en Java

Esta es una clase pensada para manejar cuadros de dilogo de tipo Swing (vase tema Error! No se encuentra el origen de la referencia. Error! No se encuentra el origen de la referencia.). Uno de estos cuadros permite introducir datos y que una variable les almacene. El problema es que todos los datos les devuelve en forma de String (texto), lo que implica almacenarles en una variable de ese tipo y luego convertirlos al tipo apropiado (int, double, char,). Ejemplo:
String texto=JOptionPane.showInputDialog("Escriba un nmero entero");

int n=Integer.parseInt(texto);

Evidentemente este cdigo no es fcil. Para explicar vamos lnea a lnea:

En la primera lnea, la variable texto almacena lo que el usuario

escriba en el cuadro de mensaje. JOptionPane.showInputDialog es la funcin que permite sacar el cuadro de mensaje. "Escriba un nmero entero" es el texto que presenta el mensaje. Es decir el resultado de esta instruccin es:

En cuanto el usuario o usuaria escriba el nmero y lo acepten (botn


Aceptar), lo escrito se almacena en la variable texto

En la segunda lnea, la funcin Integer.parseInt sirve para convertir el


nmero escrito a forma de entero int. Sin esta conversin no podemos manipular lo escrito como nmero, ya que se considera un texto (un String).

Si el usuario cancela el cuadro o bien no escribe un nmero entero,


ocurre un error que provocar que el programa finalice la ejecucin. Arreglar estos errores ser algo que veremos ms adelante

Aunque el cdigo es un tanto crptico a estas alturas, merece la pena aprenderle ya que permite ms posibilidades de hacer programas para practicar. De otro modo no tendremos manera de leer datos por teclado y eso supone una tara importante para nuestros programas. Hay que sealar que hay ms funciones de conversin, se pueden apreciar en esta tabla:
Funcin Integer.parseInt Short.parseShort Byte.parseByte Long.parseLong Convierte a int short byte long

(42 )

CBTis No. 134. Tcnico en Programacin

Float.parseFloat Double.parseDouble Boolean.parseBoolean

float double boolean

Hay que tener cuidado con las maysculas, son obligatorias donde aparezcan.

(3.13) la clase Math


Se echan de menos operadores matemticos ms potentes en Java. Por ello se ha incluido una clase especial llamada Math dentro del paquete java.lang. Para poder utilizar esta clase, se debe incluir esta instruccin (aunque normalmente no es necesario porque todo el paquete java.lang ya estar incluido en nuestro cdigo): import java.lang.Math; Esta clase posee mtodos muy interesantes para realizar clculos matemticos complejos. Por ejemplo: double x= Math.pow(3,3); //x es 33, es decir 27 Math posee dos constantes, que son:
double E double PI constante significado El nmero e (2, 7182818245...) El nmero (3,14159265...)

Por otro lado posee numerosos mtodos que son:


operador double ceil(double x) significado Redondea x al entero mayor siguiente:

double floor(double x)

Math.ceil(-2.8) vale -2 Redondea x al entero menor siguiente:

Math.ceil(2.8) vale 3 Math.ceil(2.4) vale 3

Math.floor(2.8) vale 2 Math. floor (2.4) vale 2

int round(double x)

Math. floor (-2.8) vale -3 Redondea x de forma clsica: Math.round(2.8) vale 3 Math. round (2.4) vale 2 Math. round (-2.8) vale -3

(43 )

Fundamentos de programacin
(Programacin bsica en Java

operador double rint(double x)

double random() tiponmero abs( tiponmero x) tiponmero min( tiponmero x, tiponmero y) tiponmero max( tiponmero x, tiponmero y) double sqrt(double x) double pow(double x, double y) double exp(double x) double log(double x) double acos(double x) double asin(double x) double atan(double x) double sin(double x) double cos(double x) double tan(double x) double toDegrees( double anguloEnRadianes) double toRadians( double anguloEnGrados) double signum(double n)

significado Idntico al anterior, slo que ste mtodo da como resultado un nmero double mientras que round da como resultado un entero tipo int Nmero aleatorio decimal situado entre el 0 y el 1 Devuelve el valor absoluto de x. Devuelve el menor valor de x o y Devuelve el mayor valor de x o y Calcula la raz cuadrada de x Calcula xy Calcula ex Calcula el logaritmo neperiano de x Calcula el arco coseno de x Calcula el arco seno de x Calcula el arco tangente de x Calcula el seno de x Calcula el coseno de x Calcula la tangente de x Convierte de radianes a grados Convierte de grados a radianes Devuelve el valor del signo del nmero n. Si n vale cero, la funcin devuelve cero; si es positivo devulve 1.0 y si es negativo -1.0 Esta funcin aparecin en la versin 1.5 de Java. Suponiendo que x e y son los dos catetos de un tringulo rectngulo, la funcin devuelve la hipotenusa correspondiente segn el teorema de Pitgoras. Disponible desde la versin 1.5 Devuelve el siguiente nmero representable desde el valor indicado hacia la direccin que indique el valor del parmetro dir . Por ejemplo Math.nextAfter(34.7, 90) devolvera 34.7000000001 Funcin aadida en la versin Java 1.6

double hypot( double x, double y) double nextAfter( double valor, double dir)

(44 )

CBTis No. 134. Tcnico en Programacin

(3.13.2) nmeros aleatorios


Una de las aplicaciones ms interesantes de Math es la posibilidad de crear nmeros aleatorios. Para ello se utiliza el mtodo random que devuelve un nmero double entre cero y uno. Para conseguir un nmero decimal por ejemplo entre cero y diez bastara utilizar la expresin: Math.random()*10 Si el nmero queremos que se encuentre entre uno y diez, sera: Math.random()*9+1 Y si queremos que sea un nmero entero entre 1 y 10, la expresin correcta es: (int) Math.floor(Math.random()*10+1) Entre 10 y 30 sera: (int) Math.floor(Math.random()*21+10)

(45 )

Apndice (II) Netbeans


(II.i) introduccin
Inicialmente fue un proyecto realizado por estudiantes de la Repblica Checa. Se convirti en el primer IDE creado en lenguaje Java. Ms tarde se form una compaa que en el ao 1999 fue comprada por Sun Microsystems (la propia creadora del lenguaje Java). Ese mismo ao Sun compr la empresa Forte que tambin creaba software IDE; por ello el producto se llam Forte for Java. Sin embargo este nombre dur poco, Sun decidi que el producto sera libre y de cdigo abierto y naci Netbeans como IDE de cdigo abierto para crear aplicaciones Java. Aunque Sun mantuvo otros IDE por pago; Netbeans alcanz popularidad. Lleva ya varios pugnando con Eclipse por convertirse en la plataforma ms importante para crear aplicaciones en Java. Actualmente es un producto en el que participan decenas de empresas capitaneadas por Sun, sigue siendo software libre y abierto y es capaz de:

Escribir cdigo en C, C++, Ruby, Groovy, Javascript, CSS y PHP adems


de Java

Permitir crear aplicaciones J2EE gracias a que incorpora servidores de


aplicaciones Java (actualmente Glashfish y Tomcat) de Microsoft.

Crear aplicaciones Swing de forma sencilla, al estilo del Visual Studio Crear aplicaciones JME para dispositivos mviles.
La ltima versin hasta ahora es la 6.7.

(II.ii) instalacin
Primero tenemos que descargar la versin deseada de Netbeans de la pgina www.netbeans.org. La versin total contiene todas las posibilidades de Netbeans. Adems disponemos de versiones para Windows, Linux y MacOS; tambin podemos elegir idioma espaol.

(73 )

Fundamentos de programacin
Programacin bsica en Java

Tanto en Windows como en Linux se descarga un archivo ejecutable que se encarga de la instalacin:

Ilustracin 3-22, Pantalla inicial de instalacin de Netbeans

Seleccionamos los componentes a instalar (para Java, al menos hay que instalar el IDE Base y Java SE).

Ilustracin 3-23, Seleccin de los componentes Netbeans a instalar

(74 )

CBTis No. 134. Tcnico en Programacin

Finalmente seleccionamos el directorio en el que se instalar Netbeans y el directorio que contiene el SDK que se utilizar por defecto:

Ilustracin 3-24, Seleccin de directorios durante la instalacin de Netbeans

La instalacin finaliza y disponemos de Netbeans. Una vez lanzado podremos iniciar un tutorial, obtener ayuda,. o directamente empezar a trabajar.

Ilustracin 3-25, Pantalla inicial de Netbeans

(75 )

Fundamentos de programacin
Programacin bsica en Java

(II.ii.i) comprobacin de la plataforma Java instalada


En nuestro ordenador podemos tener varias instalaciones del SDK de Java. Para saber cules ha detectado y con cules trabaja Netbeans, podemos elegir Herramientas-Plataformas Java. Desde este cuadro podremos configurar la plataforma que se utilice con Netbeans.

(II.iii) aspecto inicial de Netbeans

Ilustracin 3-26, Aspecto habitual de Netbeans

Una vez cerrada la ventana de bienvenida de Netbeans, el aspecto de la misma es similar al de Eclipse. Los elementos fundamentales son:

Men principal. Se trata del men superior de la aplicacin al estilo


de cualquier aplicacin grfica

Barras de herramientas. Situadas debajo del men principal, en ella


se colocan los botones ms tiles. (76 )

CBTis No. 134. Tcnico en Programacin

Paneles. Divididos en cuatro zonas.


En el extremo superior izquierdo se encuentra la ventana de Proyectos (junto con el de Archivos y Prestaciones) que sirve para gestionar los elementos del proyecto en el que estamos En la zona inferior izquierda est el Navegador con el que podemos recorrer y examinar los elementos del archivo (o clase) en el que estamos trabajado. En la zona superior derecha, el panel ms grande dedicado a mostrar y editar el cdigo del archivo actual En la parte inferior derecha el panel de salida que muestra los resultados de la compilacin y ejecucin del proyecto actual y otras informaciones interesantes.

(II.iii.i) cerrar y abrir paneles


Si deseamos quitar un determinado panel basta con pulsar en el botn con una X situado en la pestaa superior del panel. Para mostrar un panel que no est a la vista, basta con ir al men Ventana y elegirle.

(II.iii.ii) iconizar un panel


Esta operacin permite esconder un panel y dejarle en forma de icono. Para ello basta pulsar en el botn que tienen los paneles en forma de tringulo, al lado del botn de cerrar. Para mostrar de nuevo el panel, bastar con hacer clic en su icono y si deseamos recuperar la forma de trabajar anterior (sin iconizar) habr que pulsar el botn con un cuadrado (que habr sustituido al tringulo).

(II.iii.iii) mover paneles


Simplemente arrastrndoles de la pestaa podemos cambiarles de sitio.

(II.iii.iv) mostrar y quitar barras de herramientas


Las barras de herramientas se pueden quitar y poner desde el men VistaBarras de herramientas. Desde ese mismo men, la opcin personalizar permite incluso modificar los botones de las barras para que se muestren los botones que nos interesan ms.

(77 )

Fundamentos de programacin
Programacin bsica en Java

(II.iv) proyectos de Netbeans


(II.iv.i) crear proyectos
Una vez aceptada la pantalla de bienvenida de Netbeans, podremos crear proyectos desde Archivo-Proyecto nuevo o desde el botn herramientas. en la barra de

Ilustracin 3-27, Seleccin del tipo de proyecto en Netbeans

En la ventana Proyecto Nuevo hay que seleccin aplicacin Java. Despus podremos elegir el nombre y las opciones del proyecto:

Ilustracin 3-28, Seleccin de las opciones del proyecto

Dentro de las opciones podemos elegir crear la clase principal. La clase principal del proyecto es la que posee el mtodo main, por lo tanto ser la (78 )

CBTis No. 134. Tcnico en Programacin

que se lanza cuando se pida compilar y ejecutar el proyecto. En un proyecto slo debe haber una clase con el mtodo main, si la elegimos al crear el proyecto, se crea directamente (es lo recomendable). Tambin por defecto, Netbeans crea un paquete con el mismo nombre que el del proyecto. Aunque no es mala poltica, podemos desear estructu

(II.iv.ii) la ventana del proyecto


El aspecto de Netbeans tras crear un proyecto es este:

Ilustracin 3-29, Aspecto de Netbeans con un proyecto vaco

En el lado izquierdo se seleccionan las carpetas fundamentales de los proyectos de Netbeans. Los paquetes de fuentes contienen el cdigo de las clases del proyecto. Ah se crea el cdigo del proyecto, disponemos de paquetes de pruebas para nuestras pruebas y podemos instalar tambin bibliotecas de pruebas. Las bibliotecas son clases directamente invocables desde nuestro proyecto.

(79 )

Fundamentos de programacin
Programacin bsica en Java

(II.iv.iii) crear paquetes

Ilustracin 3-30, Cuadro de creacin de nuevos paquetes

Las clases se organizan en paquetes. Es recomendable que cada proyecto tenga al menos un paquete, de otro modo las clases se crearan en el paquete por defecto y eso no es aconsejable. Pulsando el botn derecho en la zona del proyecto donde queremos crear el paquete (normalmente dentro de paquetes de fuentes) podremos elegir Nuevo-Paquete. Tras rellenar el cuadro siguiente (donde simplemente se elige el nombre para el paquete, siempre en minsculas) tendremos un nuevo paquete. Ms adelante en este manual se explicara con detalle la utilidad de los paquetes

(II.iv.iv) crear nuevas clases


Simplemente se crean pulsando el botn derecho en el paquete en el que deseamos almacenar la clase y eligiendo Nuevo-Clase. Al principio lo normal es que nuestros proyectos slo contengan la clase principal. A medida que profundicemos en el aprendizaje de Java, necesitaremos ms clases (y ms paquetes) en cada proyecto.

(80 )

CBTis No. 134. Tcnico en Programacin

Ilustracin 3-31, Cuadro de creacin de nuevas clases

(II.iv.v) vistas del proyecto


En Netbeans sobre todo hay dos formas de examinar el proyecto. La primera es a travs de la pestaa Proyectos. En ella aparece la organizacin lgica del proyecto.

Ilustracin 3-32, Ventana de proyectos

Sin embargo la vista Archivos nos ensea la realidad de los archivos del proyecto. Nos ensea la organizacin de los archivos del proyecto desde el punto de vista del sistema:

(81 )

Fundamentos de programacin
Programacin bsica en Java

Ilustracin 3-33, Ventana de archivos del proyecto

La carpeta build contiene los archivos compilados (los class). La carpeta src el cdigo fuente. El resto son archivos por Netbeans para comprobar la configuracin del proyecto o los archivos necesarios para la correcta interpretacin del cdigo en otros sistemas (en cualquier caso no hay que borrarlos).

(II.iv.vi) propiedades del proyecto


Pulsando el botn derecho sobre un proyecto, podemos elegir Propiedades. El panel de propiedades nos permite modificar la configuracin del proyecto. Por ejemplo podremos indicar una nueva clase principal en el proyecto, si fuera necesario o bien indicar los argumentos o parmetros que enviaremos al programa

Ilustracin 3-34, Cuadro de propiedades abierto por las opciones de ejecucin

(82 )

CBTis No. 134. Tcnico en Programacin

(II.iv.vii) borrar un proyecto


Si deseamos quitar un proyecto podemos: pulsar el botn secundario del ratn sobre el icono de proyectos (en la ventana de Proyectos) y elegir Suprimir; o podemos seleccionar el proyecto y pulsar la tecla Suprimir. En cualquier caso Netbeans nos pregunta si deseamos realmente borrar el proyecto. La casilla Eliminar tambin fuentes bajo en el caso de marcarse, eliminara no solo el proyecto de Netbeans, sino tambin todos los archivos del proyecto quedara eliminados del disco.

Ilustracin 3-35, cuadro de confirmacin de borrado de un proyecto

(II.iv.viii) importar un proyecto de Eclipse


Para poder ver y trabajar un proyecto de Eclipse en Netbeans basta con: (2) (3) (4) Elegir Archivo-Importar Proyecto-Proyecto Eclipse Seleccionar un directorio del que cuelguen proyectos de Eclipse que nos interese utilizar desde Netbeans En el paso siguiente hay que elegir los proyectos concretos que vamos a importar.

Si modificamos proyectos desde Netbeans y luego queremos utilizarlos en Eclipse, podramos tener problemas. Por ello es mejor hacer copia primero de los archivo que utilizaremos. Si no disponemos de la opcin de importar proyectos de Eclipse habr que instalar el mdulo que hace esto posible (normalmente est instalado); para ello bastar con ir a Herramientas-Complementos y en la pestaa Complementos disponibles, marcar Eclipse Project Importer.

(83 )

Fundamentos de programacin
Programacin bsica en Java

(II.v) compilar y ejecutar programas


(II.v.i) compilar
A diferencia de Eclipse, en Netbeans es necesario compilar cada clase para producir el archivo class precompilado correspondiente. Para compilar basta con pulsar F9 sobre el archivo a compilar, o bien pulsar el botn secundario del ratn y elegir Compilar.

(II.v.ii) ejecutar la clase principal del proyecto


Para probar el proyecto, debemos ejecutarle. El proyecto principal (ser aquel sobre el que marquemos la casilla al crearle) se puede compilar y ejecutar de golpe botn derecho sobre la imagen del proyecto y eligiendo Ejecutar, o simplemente pulsando la tecla F6. Tambin podemos hacer lo mismo desde el men Ejecutar. Los otros proyectos no se pueden ejecutar con la tecla F6 pero s se pueden probar con Alt+F6 o podemos pulsar el botn derecho sobre el proyecto y elegir Ejecutar. Un proyecto puede tener varias clases ejecutables (varias clases con main) en ese caso para compilar un archivo concreto, basta con seleccionarle en la ventana de proyectos, pulsar el botn derecho y elegir ejecutar archivo; tambin podemos hacer lo mismo si estamos en el cdigo que deseamos ejecutar y pulsamos Maysculas+F6. El panel de Salida mostrar el resultado de la compilacin.

(II.v.iii) preparar la distribucin


Desde Netbeans podemos preparar el programa para su distribucin e implantacin en otras computadoras. Es una de las opciones ms interesantes del entorno ya que nos facilita enormemente este cometido. Para hacerlo basta seleccionar el proyecto que deseamos preparar y despus elegir Ejecutar-Limpiar y generar Main Project. Con esta instruccin Netbeans realiza las siguientes tareas: (5) (6) Crear una carpeta llamada dist en el directorio en el que se almacena el proyecto (esta carpeta es visible desde el panel Archivos) Comprime todos los archivos compilados en un archivo de tipo jar dentro de la propia carpeta dist. Los archivos jar son archivos de tipo zip que contienen clases java y otros archivos necesarios para la correcta ejecucin de una aplicacin java. Crea un archivo llamado readme.txt con informacin sobre como ejecutar el proyecto (normalmente ser java jar nombraArchivoJar)

(7)

(84 )

CBTis No. 134. Tcnico en Programacin

(II.vi) javadoc
Netbeans tiene tambin capacidad para generar toda la documentacin javadoc de un proyecto.

(II.vi.i) aadir la documentacin Java a Netbeans


Para que Netbeans pueda mostrarnos ayuda de tipo javadoc en cada clase estndar que utilicemos en nuestros proyectos, debemos aadir la documentacin del SDK con el que estemos compilando nuestros proyectos. Para hacerlo: (1) (2) (3) (4) (5) Descargamos la documentacin de Java pgina http://java.sun.com/javase/downloads/index.jsp Ir al men Herramientas-Plataformas Java Ir a la pestaa Javadoc y pulsar en aadir archivo ZIP/carpeta Elegir el archivo zip en el que se encuentra la documentacin La documentacin estar instalada en cuanto aceptemos el cuadro desde la

Ilustracin 3-36, Seleccionando la documentacin de Java

(II.vi.ii) generar la documentacin Javadoc del proyecto


Para que Netbeans cree la documentacin Javadoc de nuestro proyecto basta con: (6) (7) Seleccionar el proyecto Pulsar el botn secundario sobre el proyecto y elegir Generar javadoc o elegir la misma opcin en el men Ejecutar.

(85 )

Fundamentos de programacin
Programacin bsica en Java

(8)

Inmediatamente se abrir la documentacin en nuestro navegador predeterminado

La documentacin javadoc se guarda en el directorio javadoc dentro del directorio dist que es el mismo que sirve para almacenar el archivo jar que contiene el proyecto listo para su distribucin. De esa forma la documentacin tambin queda preparada para su distribucin.

(II.vii) edicin de cdigo


(II.vii.i) aspecto de la ventana de cdigo
Cuando se abre (con doble clic) un archivo que contiene cdigo fuente, o bien cuando se crea, el contenido aparece en la zona dedicada al cdigo. Si queremos maximizar la zona en la que se muestra el cdigo, simplemente basta con hacer doble clic en la pestaa con el nombre del archivo abierto. Un nuevo doble clic en la misma zona devuelve al estado normal el tamao. Es posible incluso ver dos archivos a la vez si abrimos ambos y despus arrastramos la pestaa de uno de ellos a un lateral.

Ilustracin 3-37, La ventana de cdigo mostrando dos archivos a la vez

Esta ltima accin puede ser muy interesante si la hacemos con el propio archivo; es decir consiguiendo ver el mismo archivo en dos pestaas diferentes, a fin de examinar a la vez dos partes distintas del mismo. Para ello primero hay que duplicar el archivo basta con pulsar el botn derecho sobre la pestaa del archivo abierto y elegir Clonar documento. Despus podremos arrastrar la nueva pestaa a la posicin que queramos.

(86 )

CBTis No. 134. Tcnico en Programacin

(II.vii.ii) ayudas al escribir cdigo


Como la mayora de IDEs actuales, Netbeans posee numerosas mejoras para escribir el cdigo. Entre ellas:

Autocompletado del cdigo. Funciona igual que en Eclipse, pulsando

Ctrl+Barra espaciadora, se nos mostrar ayuda en un cuadro para ayudarnos a completar la expresin Java que estamos escribiendo. Es la opcin de ayuda de cdigo ms interesante. cdigo habitual, ganando mucha rapidez. Para ello se escribe la abreviatura y despus se pulsa el tabulador. Es posible aadir y modificar las plantillas desde Herramientas-Opciones-EditorPlantillas de cdigo. cdigo con errores en cuanto escribimos e incluso se corrigen automticamente algunos errores. La tecla Alt+Intro permite examinar las reparaciones efectuadas. actual y eligiendo Insercin de cdigo, se nos facilitara la construccin de algunos elementos del cdigo como constructores, mtodos get y set, Cuanto ms conozcamos de Java, ms interesante ser esta opcin. claramente a Eclipse, se trata de un complemento que permite disear programas Java que utilicen elementos grficos, de forma muy sencilla. la apariencia ms legible.

Plantillas de cdigo. Abreviaturas que nos permiten escribir de golpe

Marcado de errores y autocorreccin. Se subraya de color rojo el

Insercin de cdigo. Pulsando el botn secundario sobre el cdigo

Diseador GUI. Sin duda una de las opciones donde Netbeans aventaja

Refactorizar. Permite dar de nuevo formato al cdigo para que tenga


Accesos rpidos por teclado. Cerrado automtico de llaves, parntesis, comillas, Macros Administracin de clusulas import. Mediante las teclas Ctrl+Mayus+I Netbeans genera el cdigo de tipo import necesario para que no haya errores en nuestro programa.

(II.vii.iii) bsqueda y reemplazo de texto en el cdigo


buscar texto Se realiza mediante la tecla Ctrl+F o bien desde Edicin-Buscar. En ese momento en la parte inferior de la ventana de cdigo disponemos de un cuadro gris en el que podemos escribir el texto a buscar y tambin seleccionar las opciones que estimemos convenientes para buscar. (87 )

Fundamentos de programacin
Programacin bsica en Java

En cuanto escribamos el texto, Netbeans colorea todas las apariciones de ese texto en el archivo actual. Los botones anterior y siguiente tanto en la barra de bsqueda como en la barra superior del cdigo nos permiten movernos por cada aparicin del texto buscado en el cdigo. reemplazar texto Si deseamos reemplazar texto, basta con pulsar Ctrl+H o bien EdicinReemplazar. En este caso aparece un cuadro en el que hay que escribir lo que queremos buscar y el texto que le reemplaza. Podemos ir sustituyendo cada aparicin del texto buscado uno a uno (botn Encontrar y botn Sustituir), o bien pulsar en Sustituir todo (estando muy seguros de lo que hacemos) para que se reemplacen de golpe todas las apariciones.

(II.vii.iv) dar formato al cdigo


Desde el men Fuente o desde el botn secundario del ratn, la opcin Formato reformatea el cdigo de modo que las tabulaciones, aperturas y cierres de llaves, etc. sean las habituales haciendo el cdigo legible. La forma de dar formato al cdigo se configura en Herramientas-Opciones eligiendo Editor y luego la pestaa de Formato.

(II.vii.v) modificacin de opciones del editor


Desde el cuadro Herramientas-Opciones eligiendo el botn Editor se puede configurar la forma de trabajar del editor de cdigo de Netbeans. Entre ellas:

Ilustracin 3-38, El cuadro de opciones del editor en el apartado de formato del cdigo

(88 )

CBTis No. 134. Tcnico en Programacin

En el apartado Formato se especifica el formato del cdigo. Las

opciones generales permiten modificar el tamao del tabulador, as como la lnea del margen derecho (que sirve como referencia para indicar el tamao mximo recomendado en el que debe finalizar cada lnea del cdigo) en el apartado. Si elegimos Java en el apartado lenguaje podremos seleccionarla forma en la que queremos que se d formato al cdigo Java. En este apartado hay muchas posibilidades: donde queremos que se cierren las llaves, qu instrucciones tienen que ir al principio de la lnea, dnde se dejan lneas y espacios en blanco, etc. Todas estas opciones se ejecutan tanto cuando Netbeans autocompleta el cdigo, como cuando elegimos Fuente-Formato para reformatear nuestro cdigo. Por ello es muy importante ajustarlas correctamente, en este sentido el cdigo ejemplo que coloca el programa sirve muy bien de gua. completado de texto que deseamos nos realice Netbeans. En general la configuracin inicial es la deseable.

En el apartado Finalizador de cdigo se eligen las ayudas de El apartado Plantillas de cdigo nos permite crear y modificar las

abreviaturas de plantillas de cdigo. Se puede incluso modificar la tecla que produce el reemplazo de la abreviatura por el contenido de la plantilla. Si escribimos la palabra fori y despus pulsamos el tabulador, aparecern varias lneas correspondientes al bucle for con un contador. De esa misma manera podremos crear ms abreviaturas e incluso hacer que no sea el tabulador la tecla que desencadena el reemplazado.

Los colores y tipos de letra con los que se mostrar el cdigo estn en el apartado Fuentes y colores del mismo cuadro de Opciones. Cabe sealar que en este sentido Eclipse posee ms opciones de ayuda y formato de cdigo. Pero normalmente tendremos ms opciones que las necesitadas con Netbeans.

(II.vii.vi) reestructurar
Son opciones que permiten una modificacin del cdigo de modo que sea ms legible, que sean ms improbables las apariciones de errores y que se realiza de una forma ms automtica tareas que resultan pesadas. Las posibilidades son:

Cambiar de nombre. Cuando queremos cambiar de nombre a una


clase, variable, mtodo, tenemos que encontrar en el cdigo todas las referencias al nombre antiguo. Para evitar eso, podemos: a> Seleccionar el elemento al que queremos cambiar de nombre b> Pulsar el botn secundario en la seleccin y elegir Reestructurarcambiar nombre (89 )

Fundamentos de programacin
Programacin bsica en Java

c> Escribir el nuevo nombre y pulsar Intro.

Modificar los parmetros de un mtodo. Mover clases. Simplemente al arrastrar una clase de un paquete a otro

en la ventana de proyectos ya nos preguntar sobre el cambio (que implicar muchas modificaciones en el cdigo que Netbeans realizar automticamente). Tambin podemos elegir Reestructurar-Mover encima del elemento que deseamos mover. Esta operacin hay que hacerla con cautela, ya que podemos tener problemas al realizarla por la cantidad de elementos involucrados en la posicin antigua (no todo puede arreglarlo Netbeans) nuevo nombre y posicin de la clase. que la haca referencia.

Copiar clases. Desde Reestructurar-Copiar. Simplemente pedir el Eliminacin segura. Para que al borrar una clase se busque el cdigo Otras opciones de creacin de cdigo automtico estn en el men Deshacer. La opcin situada en el men Reestructurar permite
deshacer el ltimo cambio de reestructuracin realizado. Reestructurar, su uso ser ms evidente conforme conozcamos mejor el lenguaje Java.

(II.vii.vii) plantillas generales

Ilustracin 3-39, El cuadro de administracin de plantillas

(90 )

CBTis No. 134. Tcnico en Programacin

Cuando se crea una nueva clase, aparece cdigo ya creado: cdigo Javadoc, instruccin package, Es posible modificar ese cdigo haciendo lo siguiente: (2) (3) (4) (5) Yendo a Herramientas-Plantillas Abriendo la carpeta Java Eligiendo la plantilla a modificar y pulsando Abrir en el editor Despus basta con realizar los cambios deseados y guardar el documento

Los cambios realizados se aplicarn a todos los documentos basados en la plantilla modificada. Por ejemplo si modificamos la plantilla clase Main de Java, cualquier clase de Java con mtodo main que hagamos a partir de ahora contendr el cdigo modificado. Las plantillas contienen cdigo especiales (comienzan con el smbolo $). Estos cdigos facilitan el funcionamiento de la plantilla. Por ejemplo el cdigo ${name} coloca el nombre de la clase en esa posicin.

(II.vii.viii) comparar archivos


En el men Herramientas eligiendo la opcin Diff, podemos comparar el archivo actual con otro. Simplemente se nos pide elegir el segundo archivo y la herramienta marcar las diferencias.

Ilustracin 3-40, La herramienta diff comparando archivos

(91 )

Fundamentos de programacin
Programacin bsica en Java

(II.vii.ix) exportar e importar las opciones


Si utilizamos Netbeans en ms de una computadora, es interesante exportar nuestras opciones de configuracin con los cambios realizados en el cuadro Herramientas-Opciones y luego importarlas en la otra mquina. Para exportar: (6) (7) (8) (9) Ir a Herramientas-Opciones Pulsar Exportar y elegir el nombre y ubicacin del archivo ZIP en el que se guardarn las opciones. Seleccionar tambin la parte del cuadro que queremos exportar Aceptar todos los cuadros

Ilustracin 3-41, Cuadro de exportacin de opciones de Netbeans

Para importar, hay que disponer del archivo ZIP creado durante la exportacin y despus volviendo a Herramientas-Opciones, elegir Importar y seleccionar el archivo. Se nos avisar de que se sobrescribirn las opciones que tenamos hasta ahora. Una vez aceptado el mensaje, Netbeans se reinicia con las nuevas opciones aplicadas.

(92 )

CBTis No. 134. Tcnico en Programacin

ndice de ilustraciones
Ilustracin 3-1, Proceso de compilacin de un programa C++ en Windows y Linux................... 13 Ilustracin 3-2, Proceso de compilacin de un programa Java ...................................................... 14 Ilustracin 3-3, El cuadro de las variables del Sistema en Windows Server 2008 .....................20 Ilustracin 3-4, Ejemplo de configuracin de la variable JAVA_HOME en Windows ..............20 Ilustracin 3-5, El gestor de paquetes Synaptic en el sistema Linux Ubuntu,.............................. 21 Ilustracin 3-6, Ejemplo de compilacin y ejecucin en la lnea de comandos.......................... 26 Ilustracin 3-7, Pgina de documentacin de un programa Java ............................................... 29 Ilustracin 3-8, Pantalla de la pgina de descargas de Eclipse .................................................... 47 Ilustracin 3-9, Aspecto del primer arranque de Eclipse ................................................................. 48 Ilustracin 3-10, Aspecto de la bienvenida de Eclipse ...................................................................... 49 Ilustracin 3-11, Aspecto del rea de trabajo de Eclipse al iniciar por primera vez ..................50 Ilustracin 3-12, Cuadro de creacin de proyectos nuevos en Eclipse........................................... 52 Ilustracin 3-13, Cuadro de nueva clase Java en Eclipse.................................................................. 53 Ilustracin 3-14, Cuadro de preferencias de Eclipse referente al Editor de Java....................... 60 Ilustracin 3-15, Cuadro de preferencias en el apartado de plantillas......................................... 62 Ilustracin 3-16, Cuadro de plantillas en Eclipse ................................................................................ 64 Ilustracin 3-17, El cuadro de preferencias en el apartado Estilo de cdigo ............................... 65 Ilustracin 3-18, Creacin de un nuevo perfil de formato de cdigo ............................................ 66 Ilustracin 3-19, Cuadro de preferencias en el apartado Plantillas de cdigo ........................... 68 Ilustracin 3-20, Cuadro de exportacin de preferencias de Eclipse ............................................ 69 Ilustracin 3-21, cuadro de generacin de Javadoc en Eclipse .......................................................70 Ilustracin 3-22, Pantalla inicial de instalacin de Netbeans......................................................... 74 Ilustracin 3-23, Seleccin de los componentes Netbeans a instalar ............................................ 74 Ilustracin 3-24, Seleccin de directorios durante la instalacin de Netbeans........................... 75 Ilustracin 3-25, Pantalla inicial de Netbeans.................................................................................... 75 Ilustracin 3-26, Aspecto habitual de Netbeans................................................................................ 76 Ilustracin 3-27, Seleccin del tipo de proyecto en Netbeans ........................................................ 78 Ilustracin 3-28, Seleccin de las opciones del proyecto................................................................... 78 Ilustracin 3-29, Aspecto de Netbeans con un proyecto vaco ...................................................... 79 Ilustracin 3-30, Cuadro de creacin de nuevos paquetes .............................................................80 Ilustracin 3-31, Cuadro de creacin de nuevas clases ...................................................................... 81 Ilustracin 3-32, Ventana de proyectos................................................................................................. 81 Ilustracin 3-33, Ventana de archivos del proyecto.......................................................................... 82 Ilustracin 3-34, Cuadro de propiedades abierto por las opciones de ejecucin....................... 82 Ilustracin 3-35, cuadro de confirmacin de borrado de un proyecto......................................... 83 Ilustracin 3-36, Seleccionando la documentacin de Java ........................................................... 85 Ilustracin 3-37, La ventana de cdigo mostrando dos archivos a la vez................................... 86 Ilustracin 3-38, El cuadro de opciones del editor en el apartado de formato del cdigo ..... 88 Ilustracin 3-39, El cuadro de administracin de plantillas ........................................................... 90 Ilustracin 3-40, La herramienta diff comparando archivos .......................................................... 91 Ilustracin 3-41, Cuadro de exportacin de opciones de Netbeans .............................................. 92

(5)

Fundamentos de programacin
Programacin bsica en Java

(4) programacin estructurada en Java


Esquema de la unidad
(4.1) introduccin. expresiones lgicas (4.2) if
(4.2.1) sentencia condicional simple (4.2.2) sentencia condicional compuesta (4.2.3) anidacin

6 6

6 7 8

(4.3) switch (4.4) while (4.5) do while (4.6) for (4.7) sentencias de ruptura de flujo
(4.7.1) sentencia break (4.7.2) sentencia continue

9 11 14 15 16

16 17

(6)

CBTis No. 134. Tcnico en Programacin

(4.1) introduccin. expresiones lgicas


Hasta ahora las instrucciones que hemos visto, son instrucciones que se ejecutan secuencialmente; es decir, podemos saber lo que hace el programa leyendo las lneas de izquierda a derecha y de arriba abajo. Las instrucciones de control de flujo permiten alterar esta forma de ejecucin. A partir de ahora habr lneas en el cdigo que se ejecutarn o no dependiendo de una condicin. Esa condicin se construye utilizando lo que se conoce como expresin lgica. Una expresin lgica es cualquier tipo de expresin Java que d un resultado booleano (verdadero o falso). Las expresiones lgicas se construyen por medio de variables booleanas o bien a travs de los operadores relacionales (==, >, <,) y lgicos (&&,||, !).

(4.2) if
(4.2.1) sentencia condicional simple
Se trata de una sentencia que, tras evaluar una expresin lgica, ejecuta una serie de instrucciones en caso de que la expresin lgica sea verdadera. Si la expresin tiene un resultado falso, no se ejecutar ninguna expresin. Su sintaxis es: if(expresin lgica) { instrucciones } Las llaves se requieren slo si va a haber varias instrucciones. En otro caso se puede crear el if sin llaves: if(expresin lgica) sentencia;

Ejemplo: if(nota>=5){ System.out.println("Aprobado"); aprobados++; } La idea grfica del funcionamiento del cdigo anterior sera:

(7)

fundamentos de programacin

(unidad 4) programacin estructurada en Java

[nota>=5]

escribe "Aprobado"

[nota<5] incrementa n aprobados

Ilustracin 3-1, Diagrama de actividad de la instruccin if simple

(4.2.2) sentencia condicional compuesta


Es igual que la anterior, slo que se aade un apartado else que contiene instrucciones que se ejecutarn si la expresin evaluada por el if es falsa. Sintaxis: if(expresin lgica){ instrucciones . } else { instrucciones } Como en el caso anterior, las llaves son necesarias slo si se ejecuta ms de una sentencia. Ejemplo de sentencia if-else: if(nota>=5){ System.out.println("Aprobado"); aprobados++; } else { System.out.println("Suspenso"); suspensos++; }

(6)

fundamentos de programacin

(unidad 4) programacin estructurada en Java

escribe "Suspenso" [nota<5] decrementa n aprobados


Ilustracin 3-2, Diagrama de actividad de una instruccin if doble

escribe "Aprobado" [nota>=5] incrementa n aprobados

(4.2.3) anidacin
Dentro de una sentencia if se puede colocar otra sentencia if. A esto se le llama anidacin y permite crear programas donde se valoren expresiones complejas. La nueva sentencia puede ir tanto en la parte if como en la parte else. Las anidaciones se utilizan muchsimo al programar. Slo hay que tener en cuenta que siempre se debe cerrar primero el ltimo if que se abri. Es muy importante tambin tabular el cdigo correctamente para que las anidaciones sean legibles. El cdigo podra ser: if (x==1) { instrucciones } else { if(x==2) { instrucciones } else { if(x==3) { instrucciones } } }

(8 )

CBTis No. 134. Tcnico en Programacin

Una forma ms legible de escribir ese mismo cdigo sera: if (x==1) { instrucciones } else if (x==2) { instrucciones } else if (x==3) { instrucciones } dando lugar a la llamada instruccin if-else-if.

(4.3) switch
Se la llama estructura condicional compleja porque permite evaluar varios valores a la vez. En realidad sirve como sustituta de algunas expresiones de tipo if-else-if. Sintaxis: switch (expresinEntera) { case valor1: instrucciones del valor 1 [break] [case valor2: instrucciones del valor 1 [break]] [ . . .] [default: instrucciones que se ejecutan si la expresin no toma ninguno de los valores anteriores ..] } Esta instruccin evala una expresin (que debe ser short, int, byte o char), y segn el valor de la misma ejecuta instrucciones. Cada case contiene un valor de la expresin; si efectivamente la expresin equivale a ese valor, se ejecutan las instrucciones de ese case y de los siguientes.

(9)

fundamentos de programacin

(unidad 4) programacin estructurada en Java

La instruccin break se utiliza para salir del switch. De tal modo que si queremos que para un determinado valor se ejecuten las instrucciones de un apartado case y slo las de ese apartado, entonces habr que finalizar ese case con un break. El bloque default sirve para ejecutar instrucciones para los casos en los que la expresin no se ajuste a ningn case. Ejemplo 1: switch (diasemana) { case 1: dia=Lunes; break; case 2: dia=Martes; break; case 3: dia=Mircoles; break; case 4: dia=Jueves; break; case 5: dia=Viernes; break; case 6: dia=Sbado; break; case 7: dia=Domingo; break; default: dia=?; } Ejemplo 2: switch (diasemana) { case 1: case 2: case 3: case 4: case 5: laborable=true; break; case 6: case 7: laborable=false; } (10 )

CBTis No. 134. Tcnico en Programacin

(4.4) while
La instruccin while permite crear bucles. Un bucle es un conjunto de sentencias que se repiten mientras se cumpla una determinada condicin. Los bucles while agrupan instrucciones las cuales se ejecutan continuamente hasta que una condicin que se evala sea falsa. La condicin se mira antes de entrar dentro del while y cada vez que se termina de ejecutar las instrucciones del while Sintaxis: while (expresin lgica) { sentencias que se ejecutan si la condicin es true } El programa se ejecuta siguiendo estos pasos: (1) (2) (3) Se evala la expresin lgica Si la expresin es verdadera ejecuta las sentencias, sino el programa abandona la sentencia while Tras ejecutar las sentencias, volvemos al paso 1

Ejemplo (escribir nmeros del 1 al 100): int i=1; while (i<=100){ System.out.println(i); i++; }

[ i<=100 ] [i>100]

escribe i

Ilustracin 3-3, Diagrama UML de actividad del bucle while

(11)

fundamentos de programacin

(unidad 4) programacin estructurada en Java

bucles con contador Se llaman as a los bucles que se repiten una serie determinada de veces. Dichos bucles estn controlados por un contador (o incluso ms de uno). El contador es una variable que va variando su valor (de uno en uno, de dos en dos, o como queramos) en cada vuelta del bucle. Cuando el contador alcanza un lmite determinado, entonces el bucle termina. En todos los bucles de contador necesitamos saber: (1) (2) (3) (4) Lo que vale la variable contadora al principio. Antes de entrar en el bucle Lo que vara (lo que se incrementa o decrementa) el contador en cada vuelta del bucle. Las acciones a realizar en cada vuelta del bucle El valor final del contador. En cuanto se rebase el bucle termina. Dicho valor se pone como condicin del bucle, pero a la inversa; es decir, la condicin mide el valor que tiene que tener el contador para que el bucle se repita y no para que termine.

Ejemplo: i=10; /*Valor inicial del contador, empieza valiendo 10


(por supuesto i debera estar declarada como entera, int) */

while (i<=200){ /* condicin del bucle, mientras i sea menor de


200, el bucle se repetir, cuando i rebase este valor, el bucle termina */

printf(%d\n,i); /*acciones que ocurren en cada vuelta del bucle


en este caso simplemente escribe el valor del contador */

i+=10; /* Variacin del contador, en este caso cuenta de 10 en 10*/ }


/* Al final el bucle escribe: 10 20 30 y as hasta 200 */

(12 )

CBTis No. 134. Tcnico en Programacin

Bucles de centinela Es el segundo tipo de bucle bsico. Una condicin lgica llamada centinela, que puede ser desde una simple variable booleana hasta una expresin lgica ms compleja, sirve para decidir si el bucle se repite o no. De modo que cuando la condicin lgica se incumpla, el bucle termina. Esa expresin lgica a cumplir es lo que se conoce como centinela y normalmente la suele realizar una variable booleana. Ejemplo: boolean salir=false; /* En este caso el centinela es una variable
booleana que inicialmente vale falso */

int n; while(salir==false){ /* Condicin de repeticin: que salir siga siendo while(!salir) */ n=(int)Math.floor(Math.random()*500+1; // Lo que se repite en el System.out.println(i); // bucle: calcular un nmero
aletorio de 1 a 500 y escribirlo */ falso. Ese es el centinela. Tambin se poda haber escrito simplemente:

salir=(i%7==0); /* El centinela vale verdadero si el nmero es }


mltiplo de 7 */

Comparando los bucles de centinela con los de contador, podemos sealar estos puntos:

Los bucles de contador se repiten un nmero concreto de veces, los


bucles de centinela no

Un bucle de contador podemos considerar que es seguro que finalice, Un bucle de contador est relacionado con la programacin de
algoritmos basados en series.

el de centinela puede no finalizar si el centinela jams vara su valor (aunque, si est bien programado, alguna vez lo alcanzar)

Un bucle podra ser incluso mixto: de centinela y de contador. Por ejemplo imaginar un programa que escriba nmeros de uno a 500 y se repita hasta que llegue un mltiplo de 7, pero que como mucho se repite cinco veces.

(13)

fundamentos de programacin

(unidad 4) programacin estructurada en Java

Sera: boolean salir = false; //centinela int n; int i=1; //contador while (salir == false && i<=5) { n = (int) Math.floor(Math.random() * 500 + 1); System.out.println(n); i++; salir = (i % 7 == 0); }

(4.5) do while
La nica diferencia respecto a la anterior est en que la expresin lgica se evala despus de haber ejecutado las sentencias. Es decir el bucle al menos se ejecuta una vez. Es decir los pasos son: (1) (2) (3) Ejecutar sentencias Evaluar expresin lgica Si la expresin es verdadera volver al paso 1, sino continuar fuera del while

Sintaxis: do { instrucciones } while (expresin lgica) Ejemplo (contar de uno a 1000): int i=0; do { i++; System.out.println(i); } while (i<1000);

(14 )

CBTis No. 134. Tcnico en Programacin

Ilustracin 3-4, Diagrama de actividad del bucle do..while

Se utiliza cuando sabemos al menos que las sentencias del bucle se van a repetir una vez (en un bucle while puede que incluso no se ejecuten las sentencias que hay dentro del bucle si la condicin fuera falsa, ya desde un inicio). De hecho cualquier sentencia do..while se puede convertir en while. El ejemplo anterior se puede escribir usando la instruccin while, as: int i=0; i++; System.out.println(i); while (i<1000) { i++; System.out.println(i); }

(4.6) for
Es un bucle ms complejo especialmente pensado para rellenar arrays o para ejecutar instrucciones controladas por un contador. Una vez ms se ejecutan una serie de instrucciones en el caso de que se cumpla una determinada condicin. Sintaxis: for(inicializacin;condicin;incremento){ sentencias } Las sentencias se ejecutan mientras la condicin sea verdadera. Adems antes de entrar en el bucle se ejecuta la instruccin de inicializacin y en cada vuelta se ejecuta el incremento. Es decir el funcionamiento es: (1) Se ejecuta la instruccin de inicializacin

(15)

fundamentos de programacin

(unidad 4) programacin estructurada en Java

(2) (3) (4)

Se comprueba la condicin Si la condicin es cierta, entonces se ejecutan las sentencias. Si la condicin es falsa, abandonamos el bloque for Tras ejecutar las sentencias, se ejecuta la instruccin de incremento y se vuelve al paso 2

Ejemplo (contar nmeros del 1 al 1000): for(int i=1;i<=1000;i++){ System.out.println(i); } La ventaja que tiene es que el cdigo se reduce. La desventaja es que el cdigo es menos comprensible. El bucle anterior es equivalente al siguiente bucle while: int i=1; /*sentencia de inicializacin*/ while(i<=1000) { /*condicin*/ System.out.println(i); i++; /*incremento*/ } Como se ha podido observar, es posible declarar la variable contadora dentro del propio bucle for. De hecho es la forma habitual de declarar un contador. De esta manera se crea una variable que muere en cuanto el bucle acaba.

(4.7) sentencias de ruptura de flujo


No es aconsejable su uso ya que son instrucciones que rompen el paradigma de la programacin estructurada. Cualquier programa que las use ya no es estructurado. Se comentan aqu porque puede ser til conocerlas, especialmente para interpretar cdigo de terceros.

(4.7.1) sentencia break


Se trata de una sentencia que hace que el flujo del programa abandone el bloque en el que se encuentra. for(int i=1;i<=1000;i++){ System.out.println(i); if(i==300) break; } En el listado anterior el contador no llega a 1000, en cuanto llega a 300 sale del for

(16 )

CBTis No. 134. Tcnico en Programacin

(4.7.2) sentencia continue


Es parecida a la anterior, slo que en este caso en lugar de abandonar el bucle, lo que ocurre es que no se ejecutan el resto de sentencias del bucle y se vuelve a la condicin del mismo: for(int i=1;i<=1000;i++){ if(i%3==0) continue; System.out.println(i); } En ese listado aparecen los nmeros del 1 al 1000, menos los mltiplos de 3 (en los mltiplos de 3 se ejecuta la instruccin continue que salta el resto de instrucciones del bucle y vuelve a la siguiente iteracin. El uso de esta sentencia genera malos hbitos, siempre es mejor resolver los problemas sin usar continue. El ejemplo anterior sin usar esta instruccin quedara: for(int i=1;i<=1000;i++){ if(i%3!=0) System.out.println(i); } La programacin estructurada prohbe utilizar las sentencias break

(5)

fundamentos de programacin

(unidad 4) programacin estructurada en Java

(5) estructuras bsicas de datos en Java


esquema de la unidad
(5.1) arrays
(5.1.1) introduccin..............................................................................................................................5 (5.1.2) unidimensionales ...................................................................................................................6 (5.1.3) arrays multidimensionales ................................................................................................. 11 (5.1.4) longitud de un array .......................................................................................................... 12 (5.1.5) la clase Arrays ....................................................................................................................... 12 (5.1.6) el mtodo System.arraysCopy ........................................................................................ 14 (5.2.1) introduccin. declarar e iniciar textos ........................................................................... 14 (5.2.2) comparacin entre objetos String ................................................................................. 15 (5.2.3) String.valueOf...................................................................................................................... 16 (5.2.4) mtodos de los objetos String ......................................................................................... 16

(5.2) clase String

14

(5.3) arrays de Strings (5.4) parmetros de la lnea de comandos

22 22

(5.1) arrays
(5.1.1) introduccin
Los tipos de datos que conocemos hasta ahora no permiten solucionar problemas que requieren gestionar muchos datos a la vez. Por ejemplo, imaginemos que deseamos leer las notas de una clase de 25 alumnos. Desearemos por tanto almacenarlas y para ello, con lo que conocemos hasta ahora, no habr ms remedio que declarar 25 variables. Eso es tremendamente pesado de programar. Manejar esos datos significara estar continuamente manejando 25 variables. Por ello en casi todos los lenguajes se pueden agrupar una serie de variables del mismo tipo en

(6)

CBTis No. 134. Tcnico en Programacin

una misma estructura que comnmente se conoce como array 1. Esa estructura permite referirnos a todos los elementos, pero tambin nos permite acceder individualmente a cada elemento. Los arrays son una coleccin de datos del mismo tipo al que se le pone un nombre (por ejemplo nota). Para acceder a un dato individual de la coleccin hay que utilizar su posicin. La posicin es un nmero entero, normalmente se le llama ndice (por ejemplo nota[4] es el nombre que recibe el cuarto elemento de la sucesin de notas). Hay que tener en cuenta que en los arrays el primer elemento tiene como ndice el nmero cero. El segundo el uno y as sucesivamente; es decir nota[4] en realidad es el quinto elemento del array. Esto (con algunos matices funciona igual en casi cualquier lenguaje). Sin embargo en Java los arrays (como casi todo) son objetos, y aunque la programacin orientada a objetos de Java ser abordada ms adelante, ya ahora conviene tenerlo en cuenta. Por otro lado mientras en lenguajes como C los arrays son estructuras estticas (significa que su tamao queda definido en cuanto se declara el array), en Java son estructuras dinmicas (s que es posible modificar su tamao en tiempo de ejecucin).

Ilustracin 4-1, Ejemplo de array de notas

(5.1.2) unidimensionales
Los arrays habituales son los llamados unidimensionales. Coinciden con la idea comentada en el apartado anterior. Aglutinan datos del mismo tipo y un
1

Otros nombres habituales adems de arrays son: listas, matrices, arreglos, Estimo que array es el ms aceptado en la actualidad, los otros trminos son ms ambiguos.

(7)

Fundamentos de programacin

Estructuras bsicas de datos en Java

ndice encerrado entre corchetes nos permite acceder a cada elemento individual. La declaracin de un array unidimensional se hace con esta sintaxis. tipo nombre[]; Ejemplo: double cuentas[]; //Declara un array que almacenar valores // doubles Declara un array de tipo double. Esta declaracin indica para qu servir el array, pero no reserva espacio en la RAM al no saberse todava el tamao del mismo. En este sentido hay una gran diferencia entre Java y la mayora de lenguajes clsicos. No es necesario conocer el tamao del array en el momento de la declaracin. Simplemente se avisa de que aparecer un futuro array. Tras la declaracin del array, se tiene que iniciar. Eso lo realiza el operador new, que es el que realmente crea el array indicando un tamao. Cuando se usa new es cuando se reserva el espacio necesario en memoria. Un array no inicializado no se puede utilizar en el cdigo. Ejemplo de iniciacin de un array: int notas[]; //sera vlido tambin int[] notas; notas = new int[3]; //indica que el array constar de tres //valores de tipo int Tambin se puede hacer ambas operaciones en la misma instruccin: int notas[]=new int[3]; En el ejemplo anterior se crea un array de tres enteros (con los tipos bsicos se crea en memoria el array y se inicializan los valores, los nmeros se inician a 0). Los valores del array se asignan utilizando el ndice del mismo entre corchetes: notas[2]=8; Tambin se pueden asignar valores al array en la propia declaracin: int notas[] = {8, 7, 9}; int notas2[]= new int[] {8,7,9};//Equivalente a la anterior Esto declara e inicializa un array de tres elementos. En el ejemplo lo que significa es que notas[0] vale 8, notas[1] vale 7 y notas[2] vale 9. (6)

Fundamentos de programacin

Estructuras bsicas de datos en Java

En Java (como en otros lenguajes) el primer elemento de un array es el cero. El primer elemento del array notas, es notas[0]. Se pueden declarar arrays a cualquier tipo de datos (enteros, booleanos, doubles, ... e incluso objetos como se ver ms adelante). La ventaja de usar arrays (volviendo al caso de las notas) es que gracias a un simple bucle for se puede recorrer fcilmente todos los elementos de un array: //Calcular la media 18 notas suma=0; for (int i=0;i<=17;i++){ suma+=nota[i]; } media=suma/18; A un array se le puede inicializar las veces que haga falta: int notas[]=new notas[16]; ... notas=new notas[25]; Pero hay que tener en cuenta que el segundo new hace que se pierda el contenido anterior. De hecho elimina ese contenido. En la perspectiva de Java, un array es una referencia a una serie de valores que se almacenan en la memoria. El operador new en realidad lo que hace es devolver una referencia a los valores a los que ha asignado el hueco en memoria. Es decir el array es la manera de poder leer y escribir en esos valores. Veamos paso a paso estas instrucciones y su efecto en la memoria:

(8 )

CBTis No. 134. Tcnico en Programacin

instruccin
int notas[]; notas=new[ 5];

efecto
se crea la referencia notas se crea un array de cinco nmeros enteros y nota hace referencia a ellos:

instruccin
notas=new[ 8 ];

efecto
se crea un nuevo array de ocho enteros notas le hace referencia, el anterior se queda sin referencia

0 0
notas

0 1 4
basura digital

0 0 0

9 16 0

for(int i=0;i<5;i++){ nota[i]=i*i; }

se asignan valores en el array

0 0 0 0 0 0 0

0 1
notas

notas

4 9 16

Ilustracin 4-2, efecto del uso del operador new en los arrays

La imagen anterior trata de explicar el funcionamiento del operador new (no slo para los arrays). Utilizar dos veces el operador new con la misma referencia de array, provoca que haya valores que se quedan sin referencia. A eso se le suele llamar basura digital, es espacio que se consume en la memoria y que no se puede utilizar. En Java un recolector de basura se encarga cada cierto tiempo de eliminar la basura (a diferencia de lo que ocurre en lenguajes menos seguros como C). Desde el cdigo podemos forzar la recoleccin de basura mediante: System.gc(); Aunque dicha instruccin no garantiza la recoleccin de basuras. Slo se suele utilizar cuando nuestro cdigo genera basura ms rpidamente de lo que el recolector puede eliminar.

(9)

Fundamentos de programacin

Estructuras bsicas de datos en Java

Un array se puede asignar a otro array (si son del mismo tipo): int a[]; int b[]=new int[]{3,4,5,6,7,8}; a=b; A diferencia de lo que podramos intuir, lo que ocurre en el cdigo anterior es que tanto a como b hacen referencia al mismo array. Es decir el resultado sera:

3 4
a

5 6 7 8

Esta asignacin provoca que cualquier cambio en a tambin cambie el array b (ya que, de hecho, es el mismo array). Ejemplo: int a[]={3,3,3}; int b[]; b= a; b[0]=8; System.out.println(a[0]);//Escribir el nmero 8 Finalmente, como detalle final a este tema, el operador de igualdad (==) se puede utilizar con arrays, pero nuevamente no compara el contenido sino si las referencias sealan al mismo array. Es decir: int a[]={3,3,3}; int b[]={3,3,3}; System.out.println(a==b); int c[]=b; System.out.println(b==c);

//escribe false, aunque ambos arrays //tienen el mismo contenido //escribe true

(10 )

CBTis No. 134. Tcnico en Programacin

(5.1.3) arrays multidimensionales


Los arrays adems pueden tener varias dimensiones. Entonces se habla de arrays de arrays (arrays que contienen arrays). Un uso podra ser representar datos identificables por ms de un ndice. Por ejemplo: int nota[][]; nota es un array que contiene arrays de enteros. La primera dimensin podra significar el nmero de un aula y el segundo el nmero del alumno. De modo que, por ejemplo, nota[2][7] significara la nota del alumno nmero ocho del tercer aula. Como ocurre con los arrays unidimensionales, hasta que no se define el array con el operador new, no se puede utilizar el array en el cdigo. notas = new int[3][12]; notas[0][0]=9; //notas est compuesto por 3 arrays //de 12 enteros cada uno //el primer valor es un 9

Los arrays multidimensionales se pueden inicializar de forma ms creativa incluso. Ejemplo: int notas[][]=new int[5][]; //Hay 5 arrays de enteros (an por definir) notas[0]=new int[100]; //El primer array es de 100 enteros notas[1]=new int[230]; //El segundo de 230 notas[2]=new int[400]; //... notas[3]=new int[100]; notas[4]=new int[200]; Hay que tener en cuenta que en el ejemplo anterior, notas[0] es un array de 100 enteros. Mientras que notas, es un array de 5 arrays de enteros. Esta forma irregular de arrays da muchas posibilidades y permite optimizar el gasto de espacio de almacenamiento; la idea es recordar que los arrays multidimensionales en Java son manejados como arrays de arrays. Se pueden utilizar ms de dos dimensiones si es necesario. Por ejemplo: int nota[][][]=new int[5][7][90]; Esta instruccin crea cinco arrays de siete arrays de noventa nmeros enteros. Es un array de arrays de arrays (un tanto complicado de describir) o tambin un array tridimensional. Es raro necesitar ms de tres dimensiones, pero sera posible hacerlo.

(11)

Fundamentos de programacin

Estructuras bsicas de datos en Java

(5.1.4) longitud de un array


Los arrays poseen un mtodo que permite determinar cunto mide un array; es decir, de cuntos elementos consta. Se trata de length. Ejemplo: int a[]=new int [17]; int b[][]=new int [30][7]; System.out.println(a.length); //Escribe: 17 System.out.println(b.length); // Escribe: 30 System.out.println(b[7].length); // Escribe: 7 Gracias a este mtodo el bucle de recorrido de un array (para cualquier tipo de array) es (ejemplo para escribir cada elemento del array x por pantalla): for (int i = 0; i < x.length; i++) { System.out.print(x[i]+" "); } System.out.println();

(5.1.5) la clase Arrays


En el paquete java.utils se encuentra una clase esttica llamada Arrays. Una clase esttica permite ser utilizada como si fuera un objeto (como ocurre con Math), es decir que para utilizar sus mtodos hay que utilizar simplemente esta sintaxis: Arrays.mtodo(argumentos); fill Permite rellenar todo un array unidimensional con un determinado valor. Sus argumentos son el array a rellenar y el valor deseado: int a[]=new int[23]; Arrays.fill(valores,-1);//Todo el array vale -1 Tambin permite decidir desde que ndice hasta qu ndice rellenamos: Arrays.fill(valores,5,8,-1);//Del elemento 5 al 7 valdrn -1

(12 )

CBTis No. 134. Tcnico en Programacin

equals Compara dos arrays y devuelve true si son iguales. Se consideran iguales si son del mismo tipo, tamao y contienen los mismos valores. A diferencia del operador de igualdad (==), este operador s compara el contenido. Ejemplo (comparacin entre el operador de igualdad y el mtodo equals): int a[]= {2,3,4,5,6}; int b[]= {2,3,4,5,6}; int c[]=a; System.out.println(a==b); //false System.out.println(Arrays.equals(a,b)); //true System.out.println(a==c); //true System.out.println(Arrays.equals(a,c)); //true sort Permite ordenar un array en orden ascendente. Se pueden ordenar todo el array o bien desde un elemento a otro: int x[]={4,5,2,3,7,8,2,3,9,5}; Arrays.sort(x,2,5); //El array queda {4 5 2 3 7 8 2 3 9 5} Arrays.sort(x); //Estar completamente ordenado binarySearch Permite buscar un elemento de forma ultrarrpida en un array ordenado (en un array desordenado sus resultados son impredecibles). Devuelve el ndice en el que est colocado el elemento. Ejemplo: int x[]={1,2,3,4,5,6,7,8,9,10,11,12}; Arrays.sort(x); System.out.println(Arrays.binarySearch(x,8)); copyOf Disponible desde la versin 1.6 del SDK, obtiene una copia de un array. Recibe dos parmetros: el primero es el array a copiar y el segundo el tamao que tendr el array resultante. De modo que si el tamao es menor que el del array original, slo obtiene copia de los primeros elementos (tantos como indique el tamao); si el tamao es mayor que el original, devuelve un array en el que los elementos que superan al original se rellenan con ceros o con datos de tipo null (dependiendo del tipo de datos del array. int a[] = {1,2,3,4,5,6,7,8,9}; int b[]=Arrays.copyOf(a, a.length);//b es {1,2,3,4,5,6,7,8,9} int c[]=Arrays.copyOf(a, 12); //c es {1,2,3,4,5,6,7,8,9,0,0,0} int d[]=Arrays.copyOf(a, 3); (13) //d es {1,2,3}

//Escribe: 7

Fundamentos de programacin

Estructuras bsicas de datos en Java

copyOfRange Funciona como la anterior (tambin est disponible desde la versin 1.6), slo que indica con dos nmeros de qu elemento a qu elemento se hace la copia: int a[] = {1,2,3,4,5,6,7,8,9}; int b[]=Arrays.copyOfRange(a, 3,6); //b vale {4,5,6}

(5.1.6) el mtodo System.arraysCopy


La clase System tambin posee un mtodo relacionado con los arrays, dicho mtodo permite copiar un array en otro. Recibe cinco argumentos: el array que se copia, el ndice desde que se empieza a copia en el origen, el array destino de la copia, el ndice desde el que se copia en el destino, y el tamao de la copia (nmero de elementos de la copia). int uno[]={1,1,2}; int dos[]={3,3,3,3,3,3,3,3,3}; System.arraycopy(uno, 0, dos, 0, uno.length); for (int i=0;i<=8;i++){ System.out.print(dos[i]+" "); } //Sale 1 1 2 3 3 3 3 3 3 La ventaja sobre el mtodo copyOf de la clase Arrays est en que est mtodo funciona en cualquier versin de Java-

(5.2) clase String


(5.2.1) introduccin. declarar e iniciar textos
Una de las carencias ms grandes que tenamos hasta ahora al programar en Java, era la imposibilidad de almacenar textos en variables. El texto es uno de los tipos de datos ms importantes y por ello Java le trata de manera especial. Para Java las cadenas de texto son objetos especiales. Los textos deben manejarse creando objetos de tipo String (String se suele traducir como cadena; cadena de texto). Declarar e iniciar un texto se suele hacer de esta forma: String texto1 = Prueba de texto!; Las cadenas pueden ocupar varias lneas utilizando el concatenacin +. String texto2 =Este es un texto que ocupa + varias lneas, no obstante se puede + perfectamente encadenar; operador de

(14 )

CBTis No. 134. Tcnico en Programacin

Otras formas de Tambin se pueden crear objetos String sin utilizar constantes entrecomilladas, usando otros constructores. Por ejemplo podemos utilizar un array de caracteres, como por ejemplo: char[] palabra = {P,a,l,'a',b,r,a};//palabra es un array de
caracteres String //no es lo mismo que un

a partir de ese array de caracteres podemos crear un String: String cadena = new String(palabra); //mediante el operador new
caracteres en //podemos convertir el array de //un String

De forma similar hay posibilidad de convertir un array de bytes en un String. En este caso se tomar el array de bytes como si contuviera cdigos de caracteres, que sern traducidos por su carcter correspondiente al ser convertido a String. Hay que indicar la tabla de cdigos que se utilizar (si no se indica se entiende que utilizamos el cdigo ASCII: byte[] datos = {97,98,99}; String codificada = new String (datos, 8859_1); En el ltimo ejemplo la cadena codificada se crea desde un array de tipo byte que contiene nmeros que sern interpretados como cdigos Unicode. Al asignar, el valor 8859_1 indica la tabla de cdigos a utilizar.

(5.2.2) comparacin entre objetos String


Los objetos String (como ya ocurra con los arrays) no pueden compararse directamente con los operadores de comparacin. En su lugar se deben utilizar estas expresiones:

cadena1.equals(cadena2). El resultado es true si la cadena1 es igual a


la cadena2. Ambas cadenas son variables de tipo String.

cadena1.equalsIgnoreCase(cadena2). Como la anterior, pero en este

caso no se tienen en cuenta maysculas y minsculas. Por cierto en cuestiones de maysculas y minsculas, los hispanohablantes (y el resto de personas del planeta que utilice otro idioma distinto al ingls) podemos utilizar esta funcin sin temer que no sea capaz de manipular correctamente caracteres como la ee, las tildes, Funciona correctamente con cualquier smbolo alfabtico de cualquier lengua presente en el cdigo Unicode. alfabtico. Si la primera cadena es mayor en orden alfabtico que la segunda devuelve 1, si son iguales devuelve 0 y si es la segunda la (15)

s1.compareTo(s2). Compara ambas cadenas, considerando el orden

Fundamentos de programacin

Estructuras bsicas de datos en Java

mayor devuelve -1. Hay que tener en cuenta que el orden no es el del alfabeto espaol, sino que usa la tabla ASCII, en esa tabla la letra es mucho mayor que la o.

s1.compareToIgnoreCase(s2). Igual que la anterior, slo que adems


ignora las maysculas (disponible desde Java 1.2)

(5.2.3) String.valueOf
Este mtodo pertenece no slo a la clase String, sino a otras y siempre es un mtodo que convierte valores de una clase a otra. En el caso de los objetos String, permite convertir valores que no son de cadena a forma de cadena. Ejemplos: String numero = String.valueOf(1234); String fecha = String.valueOf(new Date()); No vale para cualquier tipo de datos, pero s para casi todos los vistos hasta ahora. No valdra por ejemplo para los arrays.

(5.2.4) mtodos de los objetos String


Cada nuevo String que creemos posee, por el simple hecho de ser un String, una serie de mtodos que podemos utilizar para facilitar nuestra manipulacin de los textos. Para utilizarlos basta con poner el nombre del objeto (de la variable) String, un punto y seguido el nombre del mtodo que deseamos utilizar junto con los parmetros que necesita. mtodo y sus parmetros despus del nombre de la variable String. Es decir: variableString.mtodo(argumentos) length Permite devolver la longitud de una cadena (el nmero de caracteres de la cadena): String texto1=Prueba; System.out.println(texto1.length());//Escribe 6 concatenar cadenas Se puede hacer de dos formas, utilizando el mtodo concat o con el operador suma (+). Desde luego es ms sencillo y cmodo utilizar el operador suma. Ejemplo: String s1=Buenos , s2= das, s3, s4; s3 = s1 + s2; //s3 vale "Buenos das" s4 = s1.concat(s2); //s4 vale "Buenos das"

(16 )

CBTis No. 134. Tcnico en Programacin

charAt Devuelve un carcter de la cadena. El carcter a devolver se indica por su posicin (el primer carcter es la posicin 0) Si la posicin es negativa o sobrepasa el tamao de la cadena, ocurre un error de ejecucin (se parara el programa), una excepcin tipo IndexOutOfBoundsException. Ejemplo: String s1=Prueba; char c1=s1.charAt(2); //c1 valdr u substring Da como resultado una porcin del texto de la cadena. La porcin se toma desde una posicin inicial hasta una posicin final (sin incluir esa posicin final). Si las posiciones indicadas no son vlidas ocurre una excepcin de tipo IndexOutOfBoundsException. Se empieza a contar desde la posicin 0. Ejemplo: String s1=Buenos das; String s2=s1.substring(7,10); //s2 = "da" indexOf Devuelve la primera posicin en la que aparece un determinado texto en la cadena. En el caso de que la cadena buscada no se encuentre, devuelve -1. El texto a buscar puede ser char o String. Ejemplo: String s1=Quera decirte que quiero que te vayas; System.out.println(s1.indexOf(que)); //Escribe: 15 Se puede buscar desde una determinada posicin. En el ejemplo anterior: System.out.println(s1.indexOf(que,16)); //Ahora escribe: 26 lastIndexOf Devuelve la ltima posicin en la que aparece un determinado texto en la cadena. Es casi idntica a la anterior, slo que busca desde el final. Ejemplo: String s1=Quera decirte que quiero que te vayas; System.out.println(s1.lastIndexOf(que); //Escribe: 26 Tambin permite comenzar a buscar desde una determinada posicin. endsWith Devuelve true si la cadena termina con un determinado texto. Ejemplo: String s1=Quera decirte que quiero que te vayas; System.out.println(s1.endsWith(vayas); //Escribe true (17)

Fundamentos de programacin

Estructuras bsicas de datos en Java

startsWith Devuelve true si la cadena empieza con un determinado texto. replace Cambia todas las apariciones de un carcter por otro en el texto que se indique y lo almacena como resultado. El texto original no se cambia, por lo que hay que asignar el resultado de replace en otro String para no perder el texto cambiado: String s1=Mariposa; System.out.println(s1.replace(a,e)); System.out.println(s1); replaceAll Modifica en un texto cada entrada de una cadena por otra y devuelve el resultado. El primer parmetro es el texto que se busca (que puede ser una expresin regular), el segundo parmetro es el texto con el que se reemplaza el buscado. La cadena original no se modifica. String s1=Cazar armadillos; System.out.println(s1.replaceAll(ar,er));//Escribe: Cazer ermedillos System.out.println(s1); //Sigue valiendo Cazar armadilos toUpperCase Obtiene la versin en maysculas de la cadena. Es capaz de transformar todos los caracteres nacionales: String s1 = "Batalln de cigeas"; System.out.println(s1.toUpperCase());//Escribe: BATALLN DE CIGEAS System.out.println(s1); //Escribe: Batalln de cigeas toLowerCase Obtiene la versin en minsculas de la cadena. toCharArray Consigue un array de caracteres a partir de una cadena. De esa forma podemos utilizar las caractersticas de los arrays para manipular el texto, lo cual puede ser interesante para manipulaciones complicadas. String s="texto de prueba"; char c[]=s.toCharArray(); //Da Meripose //Sigue valiendo Mariposa

(18 )

CBTis No. 134. Tcnico en Programacin

matches Es una funcin muy interesante disponible desde la versin 1.4. Examina la expresin regular que recibe como parmetro (en forma de String) y devuelve verdadero si el texto que examina cumple la expresin regular. Una expresin regular es una expresin textual que utiliza smbolos especiales para hacer bsquedas avanzadas. Las expresiones regulares pueden contener:

Caracteres. Como a, s, , y les interpreta tal cual. Si una expresin


regular contuviera slo un carcter, matches devolvera verdadero si el texto contiene slo ese carcter. Si se ponen varios, obliga a que el texto tenga exactamente esos caracteres.

Caracteres de control (\n,\\,.) Opciones de caracteres. Se ponen entre corchetes. Por ejemplo
[abc] significa a, b c.

Negacin de caracteres. Funciona al revs impide que aparezcan los

caracteres indicados. Se pone con corchetes dentro de los cuales se pone el carcter circunflejo (^). [^abc] significa ni a ni b ni c. carcter de la a a la z.

Rangos. Se ponen con guiones. Por ejemplo [a-z] significa: cualquier Interseccin. Usa &&. Por ejemplo [a-x&&r-z] significa de la r a la x
(interseccin de ambas expresiones.

Substraccin. Ejemplo [a-x&&[^cde]] significa de la a a la x excepto


la c, d e.

Cualquier carcter. Se hace con el smbolo punto (.) Opcional. El smbolo ? sirve para indicar que la expresin que le Repeticin. Se usa con el asterisco (*). Indica que la expresin puede
repetirse varias veces o incluso no aparecer. ms veces (pero al menos una).

antecede puede aparecer una o ninguna veces. Por ejemplo a? indica que puede aparecer la letra a o no.

Repeticin obligada. Lo hace el signo +. La expresin se repite una o Repeticin un nmero exacto de veces. Un nmero entre llaves
indica las veces que se repite la expresin. Por ejemplo \d{7} significa que el texto tiene que llevar siete nmeros (siete cifras del 0 al 9). Con una coma significa al menos, es decir \d{7,} significa al menos siete veces (podra repetirse ms veces). Si aparece un segundo nmero indica un mximo nmero de veces \d{7,10} significa de siete a diez veces.

(19 )

Fundamentos de programacin

Estructuras bsicas de datos en Java

Ejemplo, se trata de comprobar si el texto que se lee mediante la clase JOptionPane empieza con dos guiones, le siguen tres nmeros y luego una o ms letras maysculas. De no ser as, el programa vuelve a pedir escribir el texto: import javax.swing.JOptionPane; public class ExpresionRegular1 { public static void main(String[] args) { String respuesta; do { respuesta=JOptionPane.showInputDialog("Escribe un texto"); if(respuesta.matches("--[0-9]{3}[A-Z]+")==false) { JOptionPane.showMessageDialog(null, "La expresin no encaja con el patrn"); } }while(respuesta.matches("--[0-9]{3}[A-Z]+")==false); JOptionPane.showMessageDialog(null,"Expresin correcta!" } } lista completa de mtodos
mtodo char charAt(int index) int compareTo(String s) descripcin Proporciona el carcter que est en la posicin dada por el entero index. Compara las dos cadenas. Devuelve un valor menor que cero si la cadena s es mayor que la original, devuelve 0 si son iguales y devuelve un valor mayor que cero si s es menor que la original. Compara dos cadenas, pero no tiene e cuenta si el texto es maysculas o no. Aade la cadena s a la cadena original. Produce un objeto String que es igual al array de caracteres data. Devuelve true si la cadena termina con el texto s Compara ambas cadenas, devuelve true si son iguales Compara ambas cadenas sin tener en cuenta las maysculas y las minsculas. Devuelve un array de bytes que contiene los cdigos de cada carcter del String

int compareToIgnoreCase(String s) String concat(String s) String copyValueOf(char[] data) boolean endsWith(String s) boolean equals(String s) boolean equalsIgnoreCase(String s) byte[] getBytes()

(20 )

CBTis No. 134. Tcnico en Programacin

mtodo void getBytes(int srcBegin, int srcEnd, char[] dest, int dstBegin);

int indexOf(String s) int indexOf(String s, int primeraPos) int lastIndexOf(String s) int lastIndexOf(String s, int primeraPos) int length() boolean matches(String expReg) String replace(char carAnterior, char ncarNuevo) String replaceFirst(String str1, String str2) String replaceFirst(String str1, String str2) String replaceAll(String str1, String str2) String startsWith(String s) String substring(int primeraPos, int segundaPos) char[] toCharArray() String toLowerCase() String toLowerCase(Locale local) String toUpperCase() String toUpperCase(Locale local) String trim() static String valueOf(tipo elemento)

descripcin Almacena el contenido de la cadena en el array de caracteres dest. Toma los caracteres desde la posicin srcBegin hasta la posicin srcEnd y les copia en el array desde la posicin dstBegin Devuelve la posicin en la cadena del texto s Devuelve la posicin en la cadena del texto s, empezando a buscar desde la posicin PrimeraPos Devuelve la ltima posicin en la cadena del texto s Devuelve la ltima posicin en la cadena del texto s, empezando a buscar desde la posicin PrimeraPos Devuelve la longitud de la cadena Devuelve verdadero si el String cumple la expresin regular Devuelve una cadena idntica al original pero que ha cambiando los caracteres iguales a carAnterior por carNuevo Cambia la primera aparicin de la cadena str1 por la cadena str2 Cambia la primera aparicin de la cadena uno por la cadena dos Cambia la todas las apariciones de la cadena uno por la cadena dos Devuelve true si la cadena comienza con el texto s. Devuelve el texto que va desde primeraPos a segunaPos. Devuelve un array de caracteres a partir de la cadena dada Convierte la cadena a minsculas Lo mismo pero siguiendo las instrucciones del argumento local Convierte la cadena a maysculas Lo mismo pero siguiendo las instrucciones del argumento local Elimina los blancos que tenga la cadena tanto por delante como por detrs Devuelve la cadena que representa el valor elemento. Si elemento es booleano, por ejemplo devolvera una cadena con el valor true o false

(21 )

Fundamentos de programacin

Estructuras bsicas de datos en Java

(5.3) arrays de Strings


Los arrays se aplican a cualquier tipo de datos y eso incluye a los Strings. Es decir, se pueden crear arrays de textos. El funcionamiento es el mismo, slo que en su manejo hay que tener en cuenta el carcter especial de los Strings. Ejemplo: String[] texto=new String[4]; texto[0]="Hola"; texto[1]=new String(); texto[2]="Adis"; texto[3]=texto[0]; for (int i = 0; i < texto.length; i++) { System.out.println(texto[i]); } /*se escribir: Hola Adis Hola */

(5.4) parmetros de la lnea de comandos


Uno de los problemas de trabajar con entornos de desarrollo es que nos abstrae quiz en exceso de la realidad. En esa realidad un programa java se ejecuta gracias a la orden java programa; orden que hay que ejecutar en la lnea de comandos del sistema. En cualquier momento podemos hacerlo. Pero es ms, podemos aadir parmetros al programa. Por ejemplo supongamos que hemos creado un programa capaz de escribir un texto un nmero determinado de veces. Pero en lugar de leer el texto y el nmero por teclado, queremos que lo pasen como parmetro desde el sistema. Eso significa aadir esa informacin en el sistema operativo, por ejemplo con: java Veces Hola 10 Eso podra significar que invocamos al programa llamado Veces y le pasamos dos parmetros: el primero es el texto a escribir () y el segundo el nmero de veces. El mtodo main es el encargado de recoger los parmetros a travs de la variable args. Esta variable es un array de Strings que recoge cada uno de los parmetros. De tal modo que args[0] es un String que recoger el primer parmetro, args[1] el segundo, etc. SI no hay parmetros, args.length devuelve cero.

(22 )

CBTis No. 134. Tcnico en Programacin

As el programa Veces comentado antes quedara: public class Veces { public static void main(String[] args) { if(args.length>=2) { int tam=Integer.parseInt(args[1]); for (int i = 1; i <=tam; i++) { System.out.println(args[0]); } } else { System.out.println("Faltan parmetros"); } } }

(23 )

CBTis No. 134. Tcnico en Programacin

En casi todos los IDE se pueden configurar los parmetros sin necesidad de tener que ejecutar el programa desde la lnea de comandos. Por ejemplo en Eclipse se realiza desde el men Ejecutar-Configuracin de ejecucin:

(5)

Fundamentos de programacin

Estructuras bsicas de datos en Java

(6) Programacin orientada a objetos


Esquema de la unidad
(6.1) introduccin a la programacin orientada a objetos
(6.1.1) qu es la programacin orientada a objetos 6 (6.1.2) UML 7 (6.1.3) propiedades de la POO 7

(6.2) introduccin al concepto de objeto (6.3) clases (6.4) objetos


(6.4.1) creacin de objetos 11 (6.4.2) acceso a las propiedades del objeto 12 (6.4.3) mtodos 12 (6.4.4) herencia 12 (6.4.5) representacin de objetos 12

8 8 11

(6.5) modificadores de acceso (6.6) creacin de clases


(6.6.1) definir propiedades 15 (6.6.2) mtodos 16 (6.6.3) sobrecarga de mtodos (6.6.4) mtodos recursivos 21 21

14 15

(6.7) la referencia this (6.8) constructores

(6.9) mtodos y propiedades genricos (static) (6.10) el mtodo main (6.11) destruccin de objetos
(6.11.1) el mtodo finalize
34

(6.8.1) comentarios Javadoc 28

24 26 29 32 32

(6)

CBTis No. 134. Tcnico en Programacin

(6.1) introduccin a la programacin orientada a objetos


(6.1.1) qu es la programacin orientada a objetos
A Java se le considera un lenguaje totalmente orientado a objetos. Aunque este totalmente es a veces criticado por que hay elementos de Java que no cumplen estrictamente las normas orientadas a objetos (como los tipos bsicos o la clase String por ejemplo), desde luego es un lenguaje en el que desde el primer momento se manejan clases y objetos. De hecho siempre que se crea un programa en Java, por simple que sea, se necesita declarar una clase (con el public class correspondiente). El concepto de clase pertenece a la programacin orientada a objetos. Es decir; en Java no se pueden crear aplicaciones que no sean orientadas a objetos. La Programacin Orientada a Objetos (POO) es una tcnica de programar aplicaciones ideada en los aos setenta y que ha triunfado desde los ochenta, de modo que actualmente es el mtodo habitual de creacin de aplicaciones. La programacin estructurada impone una forma de escribir cdigo que potencia la legibilidad del mismo. Cuando un problema era muy grande, an que el cdigo es legible, ocupa tantas lneas que al final le hacen inmanejable. La programacin modular supuso un importante cambio, ya que el problema se descompone en mdulos (en muchos lenguajes llamados funciones) de forma que cada uno se ocupa de una parte del problema. Cuanto ms independiente sea cada mdulo, mejor permitir el mantenimiento de la aplicacin y el trabajo en equipo. Ya que cada persona puede programar cada mdulo sin tener en cuenta cmo se han programado los otros. Pero nuevamente esta tcnica se queda corta. Al final realmente los mdulos necesitan datos globales conocidos por todos, lo que resta independencia a los mismos. Adems los datos y las funciones se manejan de forma distinta e independiente, lo que provoca problemas. Con la POO se intenta solucionar esta limitacin ya que el problema se dividen en objetos, de forma que cada objeto funciona de forma totalmente independiente. Un objeto es un elemento del programa que integra sus propios datos y su propio funcionamiento. Es decir un objeto est formado por datos (propiedades) y por las funciones que es capaz de realizar el objeto (mtodos). Esta forma de programar se asemeja ms al pensamiento humano. La cuestin es detectar adecuadamente los objetos necesarios para una aplicacin. De hecho hay que detectar las distintas clases de objetos. Una clase es lo que define a un tipo de objeto. Al definir una clase lo que se hace es indicar como funciona un determinado tipo de objetos. Luego, a partir de la clase, podremos crear objetos de esa clase. Realmente la programacin orientada a objetos es una programacin orientada a clases. Es decir lo que necesitamos programar es como funcionan (7)

Fundamentos de programacin
Programacin orientada a objetos

las clases de objetos. Una clase podra ser la clase coche, que representa un automvil. Cuando se defina esta clases indicaremos las propiedades (como el color, modelo, marca, velocidad mxima,...) y los mtodos (arrancar, parar, repostar,...). Todos los coches (es decir todos los objetos de clase coche) tendrn esas propiedades y esos mtodos. Usando el mismo ejemplo del coche anterior para explicar la diferencia entre clase y objeto; la clase coche representa a todos los coches. Sin embargo cuando me fijo en un coche concreto, entonces me estoy fijando en un objeto de clase coche (es decir, un ejemplar de una clase es un objeto). Por ejemplo, si quisiramos crear el juego del parchs en Java, una clase sera la casilla, otra las fichas, otra el dado, etc., etc. En el caso de la casilla, se definira la clase para indicar su funcionamiento y sus propiedades, y luego se creara tantos objetos casilla como casillas tenga el juego. Lo mismo ocurrira con las fichas, la clase ficha definira las propiedades de la ficha (color y posicin por ejemplo) y su funcionamiento mediante sus mtodos (por ejemplo un mtodo sera mover, otro llegar a la meta, etc., etc., ), luego se crearan tantos objetos ficha, como fichas tenga el juego.

(6.1.2) UML
Como ya se coment en temas anteriores UML es una notacin estndar que define diagramas para utilizar en las fases de anlisis y diseo de aplicaciones. La cuestin es que UML siempre ha tenido una buena relacin con Java. Por ello ha tenido mucho xito entre los analistas de aplicaciones en Java. Por supuesto UML es una notacin orientada a objetos. Debido a su clara aceptacin como estndar en el mundo de la Ingeniera del Software, en estos apuntes se utilizan sus diagramas para modelar clases, objetos y aspectos de la aplicacin. En especial Java y UML siempre han tenido una excelente relacin. Actualmente la ltima versin de UML es la 2.2 (ISO acept como estndar la especificacin UML 1.4.2).

(6.1.3) propiedades de la POO


Encapsulamiento. Indica el hecho de que los objetos encapsulan datos
y mtodos. Una clase se compone tanto de variables (propiedades) como de funciones y procedimientos (mtodos). De hecho no se pueden definir variables (ni funciones) fuera de una clase (es decir, en los programas orientados a objetos no hay variables globales). y propiedades que se crean de forma privada. Es decir, hay mtodos y propiedades que slo son visibles desde la propia clase, pero que no son accesibles desde otras clases. Cuando la clase est ya creada y compilada, esta zona privada permanece oculta al resto de clases. De esta forma se garantiza la independencia entre clases. definiciones distintas. En el caso del parchs: partida.empezar(4) (6)

Ocultacin. Durante la creacin de las clases de objetos, hay mtodos

Polimorfismo. Cada mtodo de una clase puede tener varias

Fundamentos de programacin
Programacin orientada a objetos

empieza una partida para cuatro jugadores, partida.empezar(rojo, azul) empieza una partida de dos jugadores para los colores rojo y azul; estas son dos formas distintas de emplear el mtodo empezar, por lo tanto este mtodo es polimrfico. Esto simplifica la programacin y reutilizacin de clases.

Herencia. Mediante la POO podemos definir clases que utilicen

mtodos y propiedades de otras (que hereden dichos mtodos y propiedades). De esta forma podemos establecer organizaciones jerrquicas de objetos. la herencia se trata en la unidad siguiente.

(6.2) introduccin al concepto de objeto


Un objeto es cualquier entidad representable en un programa informtico, bien sea real (ordenador) o bien sea un concepto (transferencia). Un objeto en un sistema posee: una identidad, un estado y un comportamiento. El estado marca las condiciones de existencia del objeto dentro del programa. Lgicamente este estado puede cambiar. Un coche puede estar parado, en marcha, estropeado, funcionando, sin gasolina, etc. El estado lo marca el valor que tengan las propiedades del objeto. El comportamiento determina como responde el objeto ante peticiones de otros objetos. Por ejemplo un objeto conductor puede lanzar el mensaje arrancar a un coche. El comportamiento determina qu es lo que har el objeto (es decir, qu ocurre cuando se arranca el coche). La identidad es la propiedad que determina que cada objeto es nico aunque tenga el mismo estado. No existen dos objetos iguales. Lo que s existen son dos referencias al mismo objeto Los objetos se manejan mediante referencias. Cuando se crea un objeto necesitamos una referencia al mismo, de modo que esa referencia permitir cambiar los atributos del objeto o invocar a los mtodos de dicho objeto. Puede haber varias referencias al mismo objeto, de modo que si una referencia cambia el estado del objeto, el resto (lgicamente) mostrarn esos cambios.

(6.3) clases
Las clases son las plantillas para hacer objetos. Una clase sirve para definir una serie de objetos con propiedades (atributos), comportamientos (operaciones o mtodos), y semntica comunes. Hay que pensar en una clase como un molde. A travs de las clases se obtienen los objetos en s. Es decir antes de poder utilizar un objeto se debe definir la clase a la que pertenece, esa definicin incluye:

El nombre o identificador de clase. Debe empezar con letra

mayscula y seguirle letras minsculas (si el nombre se compone de varias palabras, la inicial de cada palabra se deja en mayscula). El (8 )

CBTis No. 134. Tcnico en Programacin

nombre slo puede tener caracteres alfabticos o nmeros, pero siempre empezar con letra mayscula. Como consejos al elegir nombre (deberan ser normas obligatorias a seguir): Evitar abreviaturas. A favor de la legibilidad del cdigo. Es muy importante que el nombre de las clases sea claro y simbolice perfectamente al tipo de objetos que simboliza. Evitar nombres excesivamente largos. Aunque parece que se contradice con la norma anterior, se trata de que los nombres sean concisos. No es conveniente que sean descripciones de clase, para eso ya estn los comentarios javadoc. Utilizar nombres ya reconocidos. Hay abreviaturas reconocidas como por ejemplo TCP, por eso el nombre de clase ManejadorTCP es mejor que ManejadorProtocoloTransporte

Sus atributos. Es decir, los datos miembros de esa clase. Los datos
pueden ser pblicos (accesibles desde otra clase) o privados (slo accesibles por cdigo de su propia clase. A los atributos tambin se les llama propiedades y campos. Los atributos son valores que poseer cada objeto de la clase y por lo tanto marcarn el estado de los mismos. operaciones) que puede realizar la clase. Sin duda es lo ms complicado de programar y delimitar. Las clases se comunican entre s invocando a mtodos (a esto se le llama enviar mensajes).

Sus mtodos. Las funciones miembro de la clase. Son las acciones (u

Cdigo de inicializacin. Para crear una clase normalmente hace falta Otras clases. Dentro de una clase se pueden definir otras clases
(clases internas, son consideradas como asociaciones dentro de UML).

realizar operaciones previas (es lo que se conoce como el constructor de la clase).

Nombre Propiedades Mtodos


Ilustracin 6-1, Clase en notacin UML de diagrama de clases

(9)

Fundamentos de programacin
Programacin orientada a objetos

El formato general para crear una clase en Java es: [acceso] class nombreDeClase { [acceso] [static] tipo atributo1; [acceso] [static] tipo atributo2; [acceso] [static] tipo atributo3; ... [access] [static] tipo nombreMtodo1([listaDeArgumentos]) { ...cdigo del mtodo... } [access] [static] tipo nombreMtodo2([listaDeArgumentos]) { ...cdigo del mtodo... } ... } Recordar que en cuando ese escriben sintaxis el color resaltado en azul se usa en palabras reservadas (las palabras que obligatoriamente hay que escribir exactamente as), lo que est en color normal es el tipo de elemento que hay que escribir, el texto entre corchetes significa que no es obligatorio, que se pone o no dependiendo de las circunstancias o necesidades. Los puntos suspensivos indican que ese cdigo se puede repetir ms veces (en el anterior por ejemplo que se pueden declarar ms atributos y ms mtodos). La palabra opcional static sirve para hacer que el mtodo o la propiedad a la que precede se pueda utilizar de manera genrica, los mtodos o propiedades as definidos se llaman atributos de clase y mtodos de clase respectivamente. Su uso se ver ms adelante. Ejemplo: class Noria { double radio; void girar(int velocidad){ ...//definicin del mtodo } void parar(){... }

Noria radio:double girar(velocidad:int) parar()


Ilustracin 6-2, La clase Noria en notacin UML de diagrama de clases

(10 )

CBTis No. 134. Tcnico en Programacin

En Java cada clase debe ocupar un archivo, que adems debe de tener el mismo nombre. Hasta ahora identificbamos archivo con programa; bien, en realidad no es as. En un archivo se declara y define una clase, que tiene que tener exactamente el mismo nombre que el archivo. El mtodo main, no se declara en cada archivo. La mayora de clases no tienen mtodos main, slo disponen de l las clases que se pueden ejecutar (normalmente en cada proyecto real slo hay una).

(6.4) objetos
Se les llama tambin en muchos manuales instancias de clase. Este trmino procede del ingls instance que realmente significa ejemplar. As un objeto sera un ejemplar de una clase. Sin embargo el xito de la mala traduccin de la palabra instance ha conseguido que de manera ms habitual los programadores usen trminos como instancia o instanciar (como se ver ms adelante), el problema es que en espaol no hay un trmino que realmente represente su significado en . Los objetos son entidades en s de la clase (en el ejemplo del parchs, una ficha en concreto). Un objeto se crea utilizando el llamado constructor de la clase. El constructor es el mtodo que permite iniciar el objeto. Como se coment antes, el objeto realmente es la informacin que se guarda en memoria, acceder a esa informacin es posible realmente gracias a una referencia al objeto.

(6.4.1) creacin de objetos


Previamente se tiene que haber definido la clase a la que pertenece el objeto. Para ello primero necesitamos declarar una referencia al objeto lo cual se hace igual que al declarar una variable, es decir se indica la clase de objeto que es y se indica su nombre, es decir la sintaxis es: Clase objeto; Ejemplo: Noria miNoria; Esa instruccin declara que miNoria, ser una referencia a un objeto de tipo Noria. La creacin del objeto se hace con el operador new: objeto=new Clase(); Ejemplo: miNoria=new Noria();

(11)

Fundamentos de programacin
Programacin orientada a objetos

Ms adelante se explica en detalle el uso de new.

(6.4.2) acceso a las propiedades del objeto


Para poder acceder a los atributos de un objeto, se utiliza esta sintaxis: objeto.atributo Por ejemplo: miNoria.radio Para asignar valores a una propiedad, podemos hacerlo as: miNoria.radio=9;

(6.4.3) mtodos
Los mtodos se utilizan de la misma forma que los atributos, excepto porque los mtodos poseen siempre parntesis, dentro de los cuales pueden ir valores necesarios para la ejecucin del mtodo (parmetros): objeto.mtodo(argumentosDelMtodo) Los mtodos siempre tienen parntesis (es la diferencia con las propiedades) y dentro de los parntesis se colocan los argumentos del mtodo. Que son los datos que necesita el mtodo para funcionar. Por ejemplo: miNoria.gira(5); Lo cual podra hacer que la Noria avance a 5 Km/h.

(6.4.4) herencia
En la POO tiene mucha importancia este concepto, la herencia es el mecanismo que permite crear clases basadas en otras existentes. Se dice que esas clases descienden de las primeras. As por ejemplo, se podra crear una clase llamada vehculo cuyos mtodos seran mover, parar, acelerar y frenar. Y despus se podra crear una clase coche basada en la anterior que tendra esos mismos mtodos (les heredara) y adems aadira algunos propios, por ejemplo abrirCap o cambiarRueda. La herencia se trata en profundidad en el tema siguiente.

(6.4.5) representacin de objetos


Cuando se crea un objeto se dice que se est instanciando una clase (del ingls instantiate). Por eso se dice que entre las clases y los objetos hay una relacin de tipo instantiate. (12 )

CBTis No. 134. Tcnico en Programacin

En UML la forma habitual de representar objetos es la siguiente:

objeto:Clase
propiedad1:tipo =valor propiedad2:tipo =valor ...
Ilustracin 6-3, Sintaxis de un diagrama de objetos UML

Por ejemplo:

miNoria:Noria
radio:int=4
Ilustracin 6-4, Diagrama que representa al objeto miNoria de clase Noria

A veces se representan de forma abreviada:

miNoria:Noria
E incluso sin indicar el nombre del objeto:

Este ltimo dibujo representa a un objeto cualquiera de clase Noria.

(6.4.6) asignacin de referencias


El operador de asignacin cuando se usa con referencias a objetos, no tiene el mismo significado que cuando se asignan variables simples o Strings. Ejemplo: Noria n1=new Noria(); Noria n2; n1.radio=9; n2=n1; n2.radio=7; System.out.println(n1.radio); //sale 7

(13)

Fundamentos de programacin
Programacin orientada a objetos

Puede parecer sorprendente que el radio de la noria n1 sea siete en la ltima lnea, ya que el radio que se ha cambiado es de n2. la cuestin es que n1 y n2 son referencias a la misma noria. Cuando se realiza la instruccin n2=n1 lo que ocurre no es que n2 sea una copia de n1, sino que n2 ser una referencia a n1. Es decir cuando se cambia n2, se cambia n1 y viceversa. Evidentemente entre objetos, slo se puede utilizar la asignacin entre objetos de la misma clase.

(6.5) modificadores de acceso


Se trata de una palabra que antecede a la declaracin de una clase, mtodo o propiedad de clase. Hay tres posibilidades: public, protected y private. Una cuarta posibilidad es no utilizar ninguna de estas tres palabras; entonces se dice que se ha utilizado el modificador por defecto (friendly). Los especificadores determinan el alcance de la visibilidad del elemento al que se refieren. Referidos por ejemplo a un mtodo, pueden hacer que el mtodo sea visible slo para la clase que lo utiliza (private), para stas y las heredadas (protected), para todas las clases del mismo paquete (friendly) o para cualquier clase del tipo que sea (public). En la siguiente tabla se puede observar la visibilidad de cada especificador:
zona private (privado) sin modificador (friendly) protected (protegido) public (pblico)

Misma clase Subclase en el mismo paquete Clase (no subclase) en el mismo paquete Subclase en otro paquete No subclase en otro paquete

X X X

X X

X X X

X X

El modificador debe de indicarse antes de indicar el tipo de datos de la propiedad o el mtodo. Por ejemplo: public class Noria { private double radio; public void girar(int velocidad){ ...//definicin del mtodo } public void parar(){... } El modificador friendly en realidad es la visibilidad que se utiliza cuando no se indica ningn modificador de acceso. modificador protected (que se explica (14 )

CBTis No. 134. Tcnico en Programacin

en detalle en el tema siguiente) con el signo #. Para friendly no se usa ningn signo. Es decir para el cdigo anterior, el diagrama de la clase sera: En UML se simboliza el modificador public con el signo +, el prvate con el signo y el

Noria
-radio:int +girar(radio:int) +parar()
Ilustracin 6-5, Diagrama UML de la clase Noria con modificadores de acceso

(6.6) creacin de clases


(6.6.1) definir propiedades
Cuando se definen los datos de una determinada clase, se debe indicar el tipo de propiedad que es (String, int, double, int[][],...) y el especificador de acceso (public, private,...). Ejemplo: public class Persona { public String nombre;//Se puede acceder desde cualquier clase private int contrasea;//Slo se puede acceder desde la //clase Persona protected String direccin;//Acceden a esta propiedad //esta clase y sus descendientes Por lo general las propiedades de una clase suelen ser privadas o protegidas, a no ser que se trate de un valor constante, en cuyo caso se declararn como pblicos. Las variables locales de una clase pueden ser inicializadas. public class auto{ public nRuedas=4; propiedades finales Los atributos de una clase pueden utilizar el modificador final, para que se conviertan en valores no modificables en el objeto. De ser as, se debe iniciar el valor del atributo en la construccin del objeto (ms adelante se explica el uso de constructores).

(15)

Fundamentos de programacin
Programacin orientada a objetos

(6.6.2) mtodos
Un mtodo es una llamada a una operacin de un determinado objeto. Al realizar esta llamada (tambin se le llama enviar un mensaje), el control del programa pasa a ese mtodo y lo mantendr hasta que el mtodo finalice. La mayora de mtodos devuelven un resultado (gracias a la palabra return), por ello cuando se define el mtodo hay que indicar el tipo de datos al que pertenece el resultado del mismo. Si el mtodo no devuelve ningn resultado se indica como tipo de datos a devolver el tipo void (void significa vaco). Los mtodos son los equivalentes de las funciones de la programacin modular clsica. De hecho un mtodo es una funcin, slo que esa funcin est asociada a una clase, por lo que se convierte en una operacin que esa clase es capaz de realizar. Pero las personas que saben programar funciones, no tendrn mucho problema en entender cmo se programan los mtodos (salvo la dificultad que encontrarn en adaptarse a la programacin orientada a objetos) Cuando una clase ya tiene definido sus mtodos, es posible invocarles utilizando los objetos definidos de esa clase. En esa invocacin, se deben indicar los parmetros (o argumentos) que cada mtodo requiere para poder realizar su labor. Ejemplos de uso de mtodos: baln.botar(); //sin argumentos miCoche.acelerar(10); ficha.comer(posicin15);//posicin 15 es una variable que se //pasa como argumento partida.empezarPartida(18:15,colores); definir mtodos Es importante entender perfectamente la funcin de un mtodo. Un mtodo no es ms que un cdigo que realiza una determinada operacin en un objeto. Para ello necesitamos definir: (1) Sus especificadores de alcance o visibilidad. Si el alcance es privado, el mtodo slo se podr utilizar dentro de otro mtodo en la misma clase; si el pblico podr ser invocado desde cualquier clase; si es protegido desde la propia clase y sus descendientes y si es amigable, desde clases que estn en el mismo paquete. El tipo de datos o de objeto que devuelve. Si el resultado del mtodo es un nmero entero, o un booleano, o un String o un objeto de una clase determinada, etc. SI el mtodo no devuelve valor alguno se debe indicar como tipo el valor void. El identificador del mtodo. Cumple las mismas reglas que los identificadores de variable y tambin deben empezar una letra en minscula (16 )

(2)

(3)

CBTis No. 134. Tcnico en Programacin

(4)

Los parmetros. Los mtodos pueden necesitar datos para realizar su tarea. Dichos parmetros en realidad son una lista de variables u objetos y los tipos o clases de los mismos. La existencia de esas variable su objetos est ligada a la del propio mtodo; es decir, cuando el mtodo finaliza, los parmetros se eliminan. El cuerpo del mtodo. Es decir el cdigo que permite al mtodo realizar su tarea. Es lo ms complicado. Dentro de ese cdigo se pueden declarar variables, objetos y utilizar cualquier conjunto de instrucciones de Java, as como invocar a mtodos de otras clases y objetos (si disponemos de visibilidad para ello). El valor resultado del mtodo se realiza mediante la instruccin return.

(5)

Ejemplo: public class Vehiculo { public int ruedas; private double velocidad=0; String nombre; public void acelerar(double cantidad) { velocidad += cantidad; } public void frenar(double cantidad) { velocidad -= cantidad; } public double obtenerVelocidad(){ return velocidad; } public static void main(String args[]){ Vehiculo miCoche = new Vehiculo(); miCoche.acelerar(12); miCoche.frenar(5); System.out.println(miCoche.obtenerVelocidad()); } // Da 7.0 } En la clase anterior, los mtodos acelerar y frenar son de tipo void por eso no tienen sentencia return. Sin embargo el mtodo obtenerVelocidad es de tipo double por lo que su resultado debe de ser devuelto mediante sentencia return.

(17)

Fundamentos de programacin
Programacin orientada a objetos

argumentos por valor y por referencia En todos los lenguajes ste es un tema muy importante. Los argumentos son los datos que recibe un mtodo y que necesita para funcionar. Ejemplo: public class Matemticas { public double factorial(int n){ double resultado; for (resultado=n;n>1;n--) resultado*=n; return resultado; } ... public static void main(String args[]){ Matemticas m1=new Matemticas(); double x=m1.factorial(25);//Llamada al mtodo } En el ejemplo anterior, el valor 25 es un argumento requerido por el mtodo factorial para que ste devuelva el resultado (que ser el factorial de 25). En el cdigo del mtodo factorial, este valor 25 es copiado a la variable n, que es la encargada de almacenar y utilizar este valor. Se dice que los argumentos son por valor, si la funcin recibe una copia de esos datos, es decir la variable que se pasa como argumento no estar afectada por el cdigo. Ejemplo: class Prueba { public void metodo1(int entero){ entero=18; ... } ... public static void main(String args[]){ int x=24; Prueba miPrueba = new Prueba(); miPrueba.metodo1(x); System.out.println(x); //Escribe 24, no 18 } Este es un ejemplo de paso de parmetros por valor. La variable x se enva como argumento o parmetro para el mtodo metodo1, all la variable entero recibe una copia del valor de x en la variable entero, y a esa copia se le asigna el valor 18. Cuando el cdigo del mtodo1 finaliza, la variable entero desaparece, en todo este proceso la variable x no ha sido afectada, seguir valiendo 24.

(18 )

CBTis No. 134. Tcnico en Programacin

Sin embargo en este otro caso: class Prueba { public void metodo1(int[] entero){ entero[0]=18; ... } ... public static void main(String args[]){ int x[]={24,24}; Prueba miPrueba = new prueba(); miPrueba.metodo1(x); System.out.println(x[0]); //Escribe 18, no 24 } Aqu la variable x es un array. En este caso el parmetro entero, recibe una referencia a x, no una copia. Por lo que los cambios que se hacen sobre la variable entero, en realidad se estn haciendo sobre x (la forma ms propia de indicar esto, es que la accin se hace sobre el array al que x y entero hacen referencia, que es el mismo). Por eso cuando se ejecuta la asignacin entero[0]=18 el array ha sido modificado y aunque al finalizar la funcin, entero desaparecer de memoria, el array ha sido modificado y por eso x[0] vale 24. La cuestin es qu se pasa por referencia y qu por valor. La regla es simple:

Los tipos bsicos (int, double, char, boolean, float, short y byte) se
pasan por valor.

Tambin se pasan por valor las variables de tipo String. Los objetos y arrays se pasan por referencia.
El problema es que en Java no podemos pasar variables simples por referencia y esto genera algunos problemas (especialmente para los programadores que proceden de lenguajes como C C++ donde s es posible hacerlo).

(19 )

Fundamentos de programacin
Programacin orientada a objetos

devolucin de valores complejos Como se ha visto anteriormente, los mtodos pueden devolver valores bsicos (int, short, double, etc.), Strings, arrays e incluso objetos. En todos los casos es el comando return el que realiza esta labor. En el caso de arrays y objetos, devuelve una referencia a ese array u objeto. Ejemplo: public class FabricaArrays { public int[] obtenArray(){ int array[]= {1,2,3,4,5}; return array; } } public class ReturnArray { public static void main(String[] args) { FabricaArrays fab=new FabricaArrays(); int nuevoArray[]=fab.obtenArray(); //se obtiene la referencia //al array } } mtodos set y get En Java cada vez es ms habitual la prctica de ocultar las propiedades y trabajar exclusivamente con los mtodos. La razn es que no es recomendable que las propiedades sean visibles desde fuera de la clase, por ello se declaran con una visibilidad private (o protected). Siendo as cmo pueden las otras clases modificar el valor de una propiedad? Mediante mtodos que permitan la lectura y escritura de esas propiedades, son los mtodos get (obtener) y set (ajustar). Los get sirven para leer el valor de un atributo, nunca llevan parmetros y el nombre del mtodo es la palabra get seguida del nombre de la propiedad (por ejemplo getEdad). Los set permiten variar el valor de una propiedad. Por lo que como parmetro reciben el nuevo valor y son mtodos siempre de tipo void. Ejemplo: public class Persona { private String nombre; private int edad; public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre=nombre; } (20 )

CBTis No. 134. Tcnico en Programacin

public int getEdad() { return edad; } public void setEdad(int edad) { this.edad=edad; } }

(6.6.3) sobrecarga de mtodos


Una propiedad de la POO es el polimorfismo. Java posee esa propiedad ya que admite sobrecargar los mtodos. Esto significa crear distintas variantes del mismo mtodo. Ejemplo: public class Matemticas{ public double suma(double x, double y) { return x+y; } public double suma(double x, double y, double z){ return x+y+z; } public double suma(double[] array){ double total =0; for(int i=0; i<array.length;i++){ total+=array[i]; } return total; } La clase Matemticas posee tres versiones del mtodo suma: una versin que suma dos nmeros double, otra que suma tres y la ltima que suma todos los miembros de un array de nmeros decimales. Desde el cdigo se puede utilizar cualquiera de las tres versiones segn convenga. En definitiva, el mtodo suma es polimrfico.

(6.6.4) mtodos recursivos


qu es la recursividad? La recursividad es una tcnica de escritura de mtodos o funciones, pensada para problemas complejos. La idea parte de que un mtodo puede invocarse a s mismo. Esta tcnica es peligrosa ya que se pueden generar fcilmente llamadas infinitas (la funcin se llama a s misma, tras la llamada se vuelve a llamar a s misma, y as sucesivamente sin freno ni control). Hay que ser muy cauteloso con ella (incluso evitarla si no es necesario su uso); pero permite soluciones muy originales y abre la posibilidad de solucionar problemas muy complejos. De hecho ciertos problemas (como el de las torres de Hanoi, por ejemplo) seran casi imposibles de resolver sin esta tcnica. (21 )

Fundamentos de programacin
Programacin orientada a objetos

Es fundamental tener en cuenta cundo la funcin debe dejar de llamarse a s misma en algn momento, es decir es importante decidir cundo acabar. De otra forma se corre el riesgo de generar infinitas llamadas, lo que bloqueara de forma grave el PC en el que trabajamos (aunque con Java este dao es muy limitado). Un ejemplo de recursividad es este: Como ejemplo vamos a ver la versin recursiva del factorial. public class Matematicas{ public double factorial(int n){ if(n<=1) return 1; else return n*factorial(n-1); } } La ltima instruccin (return n*factorial(n-1)) es la que realmente aplica la recursividad. La idea (por otro lado ms humana) es considerar que el factorial de nueve es nueve multiplicado por el factorial de ocho; a su vez el de ocho es ocho por el factorial de siete y as sucesivamente hasta llegar al uno, que devuelve uno (es la instruccin que para la recursividad). Con una llamada a ese mtodo con factorial(4); usando el ejemplo anterior, la ejecucin del programa generara los siguientes pasos: (1) (2) (3) Se llama a la funcin factorial usando como parmetro el nmero 4 que ser copiado en la variable-parmetro n Como n>1, entonces se devuelve 4 multiplicado por el resultado de la llamada factorial(3) La llamada anterior hace que el nuevo n (variable distinta de la anterior) valga 3, por lo que esta llamada devolver 3 multiplicado por el resultado de la llamada factorial(2) La llamada anterior devuelve 2 multiplicado por el resultado de la llamada factorial(1) Esa llamada devuelve 1 Eso hace que la llamada factorial(2) devuelva 2*1, es decir 2 Eso hace que la llamada factorial(3) devuelva 3*2, es decir 6 Por lo que la llamada factorial(4) devuelve 4*6, es decir 24 Y ese es ya el resultado final

(4) (5) (6) (7) (8)

(22 )

CBTis No. 134. Tcnico en Programacin

4 * factorial(3)

4*3*2*1

3 * factorial(2) 2 * factorial(1) 1 Ciclo de llamadas


recursividad o iteracin?

3*2*1 2*1 1

recursivo del clculo del factorial

Devolucin de Ilustracin 6, Pasos en la ejecucin del l mtodo

Hay otra versin del factorial resuelto mediante un bucle for (solucin iterativa) en lugar de utilizar la recursividad. La cuestin es cul es mejor? Ambas implican sentencias repetitivas hasta llegar a una determinada condicin. Por lo que ambas pueden generar programas que no finalizan si la condicin nunca se cumple. En el caso de la iteracin es un contador o un centinela el que permite determinar el final, la recursividad lo que hace es ir simplificando el problema hasta generar una llamada al mtodo que devuelva un nico valor. Para un ordenador es ms costosa la recursividad ya que implica realizar muchas llamadas a funciones en cada cual se genera una copia del cdigo de la misma, lo que sobrecarga la memoria del ordenador. Es decir, es ms rpida y menos voluminosa la solucin iterativa de un problema recursivo. Por qu elegir recursividad? De hecho si poseemos la solucin iterativa, no deberamos utilizar la recursividad. La recursividad se utiliza slo si:

No encontramos la solucin iterativa a un problema El cdigo es mucho ms claro en su versin recursiva

(23 )

Fundamentos de programacin
Programacin orientada a objetos

recursividad cruzada Hay que tener en cuenta la facilidad con la que la recursividad genera bucles infinitos. Por ello una funcin nunca ha de llamarse a s misma si no estamos empleando la recursividad. Pero a veces estos problemas de recursividad no son tan obvios. Este cdigo puede provocar una ejecucin inacabable: int a(){ int x=1; x*=b(); return x; } int b(){ int y=19; y-=a(); return y; } Cualquier llamada a la funcin a o a la funcin b generara cdigo infinito ya que ambas se llaman entre s sin parar jams. A eso tambin se le llama recursividad, pero recursividad cruzada.

(6.7) la referencia this


Los objetos pueden hacer referencia a s mismos, para ello disponen de la palabra this. Se utiliza dentro del cdigo de las clases para obtener una referencia al objeto actual y permitir evitar ambigedad y realizar llamadas a mtodos que de otra forma seran complicadas. Ejemplo: public class Punto { int posX; int posY; void modificarCoords(int posX, int posY){ /* Hay ambigedad ya que posX es el nombre de uno de * los parmetros, y adems el nombre de una de las * propiedades de la clase Punto */ this.posX=posX; //this permite evitar la ambigedad this.posY=posY; } }

(24 )

CBTis No. 134. Tcnico en Programacin

En el ejemplo hace falta la referencia this para clarificar cuando se usan las propiedades posX y posY, y cuando los argumentos con el mismo nombre. Otro ejemplo: public class Punto { int posX; int posY; ... /**Suma las coordenadas de otro punto*/ public void suma(Punto punto2){ posX = punto2.posX; posY = punto2.posY; } /** Dobla el valor de las coordenadas del punto*/ public void dobla(){ suma(this); } En el ejemplo anterior, la funcin dobla, hace que cada coordenada del punto valga el doble. Como ya tenemos una funcin que suma coordenadas, es posible invocar a esta parta que calcule el doble sumando las coordenadas del punto consigo mismas, para ello invoca a la funcin suma enviando el propio punto mediante la palabra this. En definitiva, los posibles usos de this son:

this. Referencia al objeto actual. Se usa por ejemplo pasarle como


parmetro a un mtodo cuando es llamado desde la propia clase.

this.atributo. Para acceder a una propiedad del objeto actual. this.mtodo(parmetros). Permite llamar a un mtodo del objeto
actual con los parmetros indicados.

this(parmetros). Permite llamar a un constructor del objeto actual.


Esta llamada slo puede ser empleada en la primera lnea de un constructor. En realidad cuando desde un mtodo invocamos a un mtodo de la propia clase o a una propiedad de la misma, se usa this de forma implcita, es decir que aunque no escribamos this, el compilador lo sobreentiende. Por eso en la prctica slo se indica si es imprescindible.

(25 )

Fundamentos de programacin
Programacin orientada a objetos

(6.8) constructores
Cuando se crea un objeto mediante el operador new, las propiedades toman un valor inicial. Ese valor puede ser los que Java otorga por defecto o bien los que se asignan a las propiedades si se utiliza la asignacin en su declaracin. Pero esa forma de iniciar implcita es muy poco habitual. Es mucho ms habitual crear un constructor para colocar esos valores. Un constructor es un mtodo que se invoca cuando se crea un objeto y que sirve para iniciar los atributos del objeto y para realizar las acciones pertinentes que requiera el mismo para ser creado. En realidad siempre hay al menos un constructor, el llamado constructor por defecto. Ese es un constructor que le crea el compilador en caso de que nosotros no creemos ninguno y se invoca cuando la creacin es como: Persona p=new Persona(); Pero nosotros podemos crear nuestros propios constructores ya que un constructor no es ms que un mtodo que tiene el mismo nombre que la clase. Con lo cual para crear un constructor basta definir un mtodo en el cdigo de la clase que tenga el mismo nombre que la clase. Ejemplo: public class Ficha { private int casilla; public Ficha() { //constructor casilla = 1; } public void avanzar(int n) { casilla += n; } public int casillaActual(){ return casilla; } } public class App { public static void main(String[] args) { Ficha ficha1 = new Ficha(); ficha1.avanzar(3); System.out.println(ficha1.casillaActual());//Da 4 } } En la lnea Ficha ficha1 = new Ficha(); es cuando se llama al constructor, que es el que coloca inicialmente la casilla a 1.

(26 )

CBTis No. 134. Tcnico en Programacin

An ms interesante es que los constructores pueden tener parmetros como los mtodos y eso permite crear objetos con diferentes valores para sus propiedades (que es lo habitual en la prctica): public class Ficha { private int casilla; //Valor inicial de la propiedad public Ficha(int n) { //constructor casilla = n; } public void avanzar(int n) { casilla += n; } public int casillaActual(){ return casilla; } } public class App { public static void main(String[] args) { Ficha ficha1 = new Ficha(6); ficha1.avanzar(3); System.out.println(ficha1.casillaActual());//Da 9 } } En este otro ejemplo, al crear el objeto ficha1, se le da un valor a la casilla, por lo que la casilla vale al principio 6. Cuando hay un constructor especfico con parmetros, entonces no se puede invocar al constructor por defecto. Es decir en el ejemplo anterior la llamada new Ficha() lanzara un error. Hay que tener en cuenta que puede haber ms de un constructor para la misma clase. Al igual que ocurra con los mtodos, los constructores se pueden sobrecargar. De este modo en el cdigo anterior de la clase Ficha se podran haber colocado los dos constructores que hemos visto, y sera entonces posible este cdigo: Ficha ficha1= new Ficha(); //La propiedad casilla de la //ficha valdr 1 Ficha ficha1= new Ficha(6); //La propiedad casilla de la //ficha valdr 6 Cuando se sobrecargan los constructores (se utilizan varias posibilidades de constructor), se pueden hacer llamadas a constructores mediante el objeto this. Pero entonces tiene que ser la primera lnea del cdigo.

(27 )

Fundamentos de programacin
Programacin orientada a objetos

Ejemplo: class Ficha { private int casilla; //Valor inicial de la propiedad public Ficha(){ this(1); } public Ficha(int n) { //constructor casilla = n; } public void avanzar(int n) { casilla += n; } public int casillaActual(){ return casilla; } } La llamada this(1) invoca al segundo constructor pasndole como parmetro el valor 1.

(6.9) comentarios Javadoc


Ya se han comentado la importancia de los comentarios Javadoc. Pero en el caso de las clases an es mayor ya que documentar bien una clase y todos los mtodos y atributos de la misma no debera ser una opcin sino una obligacin. La razn, al utilizar clases ajenas es fundamental disponer de esta documentacin. As ocurre con las clases estndar, cuando se usan dentro de nuestro cdigo podemos revisar el Javadoc para as conocer su funcionamiento. Nosotros debemos hacer lo mismo y eso implica:

Realizar un comentario Javadoc inmediatamente delante del nombre Escribir un comentario Javadoc inmediatamente delante de la
declaracin de cada atributo para describirle

de la clase. En ese comentario se describe la clase. Es interesante en l utilizar los modificadores @author y @version.

Escribir un Javadoc inmediatamente delante de cada mtodo y


constructor. En ese caso hay que utilizar al menos los modificadores: @param. Para comentar cada uno de los parmetros del mtodo o constructor. Se coloca un @param por cada parmetro. @return. Para los mtodos que devuelven valores, se usa para describir el valor de retorno

(28 )

CBTis No. 134. Tcnico en Programacin

Ejemplo: /** * Representa muy simblicamente un vehculo * @author Jorge Snchez * */ public class Vehiculo { /** n de ruedas del vehculo */ public int ruedas; /** almacena la velocidad a la que marcha el vehculo */ private double velocidad=0; String nombre; /** Aumenta la velocidad * @param cantidad Cunto aceleramos el vehculo * */ public void acelerar(double cantidad) { velocidad += cantidad; } /** * Disminuye la velocidad * @param cantidad Cunto deceleramos el vehculo * */ public void frenar(double cantidad) { velocidad -= cantidad; } /** * Devuelve la velocidad a la que marcha el vehculo * @return la velocidad*/ public double obtenerVelocidad(){ return velocidad; } }

(6.10) arrays de objetos


En Java es posible crear arrays de objetos. Los propios arrays son objetos, pero dadas sus capacidades para manipular listas de datos, es muy frecuente utilizarles para hacer referencia a conjuntos de objetos. Por ejemplo: Punto a[]=new Punto[4]; Con esa instruccin declaramos la existencia de un array que contiene cuatro referencias a Puntos. En ese instante an no se ha creado ningn punto (los objetos se crean con new). Cada elemento del array puede ser una referencia a un nuevo punto o sealar a un punto existente.

(29 )

Fundamentos de programacin
Programacin orientada a objetos

Ejemplo: a[0]=new Punto(3,4); a[1]=p; //suponiendo que p es una referencia vlida aun punto, //a[1] hara tambon referencia a ese punto a[2]=null; Para usar las propiedades y mtodos de los arrays de objetos: a[0].mover(5,6); System.out.println(a[0].getX()); En definitiva los arrays de objetos funcionan como cualquier otro array, slo que hay que tener ms precaucin al usarles por la cantidad de smbolos que manejan.

(6.11) mtodos y propiedades genricos (s ta ti c )


Cuando se crean varios objetos de una misma clase, stos poseen una copia propia de cada propiedad y mtodo. As si e1 y e2 son objetos de la clase Empleado lo ms probable es que e1.edad y e2.edad sean valores diferentes, porque la edad de cada empleado es distinta. Pero puede haber propiedades y mtodos comunes a todos los objetos de una clase. En ese caso se consideran propiedades y mtodos de la clase y no de los objetos. Comnmente se les conoce como mtodos y propiedades estticas. Por ejemplo si todos los empleados tuvieran el mismo salario mnimo entonces se definira esa propiedad como esttica. Y para manipularla se utilizara el nombre de la clase y no de los objetos. As funciona la clase Math vista en temas anteriores. Para crear mtodos o propiedades estticas basta con colocar la palabra static antes del tipo del atributo o mtodo. Ejemplo: public class Calculadora { public static int factorial(int n) { int fact=1; while (n>0) { fact *=n--; } return fact; } }

(30 )

CBTis No. 134. Tcnico en Programacin

Para utilizar el mtodo factorial de la clase Calculadora: public class App { public static void main(String[] args) { System.out.println(Calculadora.factorial(5)); } } En este ejemplo no ha hecho falta crear objeto alguno para poder calcular el factorial. Una clase puede tener mtodos y propiedades genricos (static) y mtodos y propiedades dinmicas (normales). Cada vez que se crea un objeto con new, se almacena ste en memoria. Los mtodos y propiedades normales, gastan memoria por cada objeto que se cree, sin embargo los mtodos estticos no gastan memoria por cada objeto creado, gastan memoria slo al definir la clase. Es decir los mtodos y atributos static son los mismos para todos los objetos creados se almacenan en la zona comn de la memoria de la clase.

Cl ase Atributos y mtodos static Obj eto1 Atributos y mtodos dinmic os Obj eto1 Atributos y mtodos dinmic os Obj eto1 Atributos y mtodos dinmic os

Ilustracin 6-7, Funcionamiento de los mtodos estticos

Hay que crear mtodos y propiedades genricos cuando ese mtodo o propiedad vale lo mismo en todos los objetos. Pero hay que utilizar mtodos normales (dinmicos) cuando el mtodo da resultados distintos segn el objeto. Por ejemplo en un clase que represente aviones, la altura sera un atributo dinmico (distinto en cada objeto), mientras que el nmero total de aviones que hemos construido, sera un mtodo static (es el mismo para todos los aviones). Una de las grandes sorpresas para los programadores en lenguaje C que pasan a Java es el hecho de que Java no posee variables ni funciones globales. Las variables globales de C y otros lenguajes crean malas maas al programar ya que no independizan los objetos del sistema. (31)

Fundamentos de programacin
Programacin orientada a objetos

En gran parte las clases estticas solucionan algunos problemas que suceden al no disponer de variables y funciones globales. Es el caso de la funcin factorial comentada anteriormente. Es un mtodo que es difcil de asociar a un objeto, por eso es esttico, porque se asocia a una clase; en definitiva es fcil entender su uso como el de una funcin global de C. En UML las propiedades y mtodos estticos se escriben en cursiva para distinguirles de los otros. Las variables estticas no son muy habituales, pero s las constantes (con el cualificador final). Hay que recordar que las constantes se escriben con todas las letras en maysculas

(6.12) el mtodo main


Hasta ahora hemos utilizado el mtodo main de forma incoherente como nico posible mecanismo para ejecutar programas. De hecho este mtodo dentro de una clase, indica que la clase es ejecutable desde la consola. Su prototipo es: public static void main(String[] args){ ...instruccionesejecutables.... } Hay que tener en cuenta que el mtodo main es esttico, por lo que no podr utilizar atributos o mtodos dinmicos de la clase.

(6.13) destruccin de objetos


En C y C++ todos los programadores saben que los objetos se crean con new (en realidad en C mediante la funcin malloc) y para eliminarles de la memoria y as ahorrarla, se deben eliminar con la instruccin delete (en C con free). Es decir, es responsabilidad del programador eliminar la memoria que gastaban los objetos que se van a dejar de usar. La instruccin delete del C++ llama al destructor de la clase, que es un mtodo que se encarga de eliminar adecuadamente el objeto. La sorpresa de los programadores C++ que empiezan a trabajar en Java es que no hay instruccin delete en Java. La duda est entonces, en cundo se elimina la memoria que ocupa un objeto. En Java hay un recolector de basura (garbage collector) que se encarga de gestionar los objetos que se dejan de usar y de eliminarles de memoria. Este proceso es automtico e impredecible y trabaja en un hilo (thread) de baja prioridad, por lo que apenas ralentiza al sistema. Por lo general ese proceso de recoleccin de basura, trabaja cuando detecta que un objeto hace demasiado tiempo que no se utiliza en un (32 )

CBTis No. 134. Tcnico en Programacin

programa. Esta eliminacin depende de la mquina virtual, en casi todas la recoleccin se realiza peridicamente en un determinado lapso de tiempo. La implantacin de mquina virtual conocida como HotSpot 1 suele hacer la recoleccin mucho ms a menudo Se puede forzar la eliminacin de un objeto asignndole el valor null, pero teniendo en cuenta que eso no equivale al famoso delete del lenguaje C++. Con null no se libera inmediatamente la memoria, sino que pasar un cierto tiempo (impredecible, por otro lado) hasta su total destruccin. Se puede invocar al recolector de basura desde el cdigo invocando al mtodo esttico System.gc(). Esto hace que el recolector de basura trabaje en cuanto se lea esa invocacin. Sin embargo puede haber problemas al crear referencias circulares. Como: public class uno { dos d; public uno() { //constructor d = new dos(); } } public class dos { public uno u; public dos() { u = new uno(); } } public class App { public static void main(String[] args) { uno prueba = new uno();//referencia circular prueba = null; //no se liberar bien la memoria } } Al crear un objeto de clase uno, automticamente se crea uno de la clase dos, que al crearse crear otro de la clase uno. Eso es un error que provocar que no se libere bien la memoria salvo que se eliminen previamente los objetos referenciados.

Para saber ms sobre HotSpot acudir a java.sun.com/products/hotspot/index.html.

(33 )

Fundamentos de programacin
Programacin orientada a objetos

( 6 . 1 3. 1 ) el mtodo finalize
Es equivalente a los destructores del C++. Es un mtodo que es llamado antes de eliminar definitivamente al objeto para hacer limpieza final. Un uso puede ser eliminar los objetos creados en la clase para eliminar referencias circulares. Ejemplo: public class uno { dos d; public uno() { d = new dos(); } protected void finalize(){ d = null;//Se elimina d por lo que pudiera pasar } } finalize es un mtodo de tipo protected heredado por todas las clases ya que est definido en la clase raz Object. La diferencia de finalize respecto a los mtodos destructores de C++ estriba en que en Java no se llaman al instante (de hecho es imposible saber cuando son llamados). la llamada System.gc() llama a todos los finalize pendientes inmediatamente (es una forma de probar si el mtodo finalize funciona o no). Normalmente el mtodo finalize no es necesario salvo en casos de objetos que utilicen archivos (que se debern cerrar) u otros objetos que manipulen recursos del sistema.

(34 )

You might also like