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
12
16
24
(3.5) ejecucin de programas Java (3.6) javadoc (3.7) import (3.8) variables
26
30 31 31
27 29 30
(5)
Fundamentos de programacin
(Programacin bsica en Java
32
32 33 34 34 35 35 36 36 37 38 38 39 39
(3.10) operadores
36
40 41
41 41
73 73 73
76 77 77 77 77
45
43
(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
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
86
(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
(8 )
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.
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.
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.
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.
(10 )
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
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
(12 )
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
(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 )
(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.
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 )
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:
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
bsqueda de recursos. Integra los servicios de bsqueda ms populares (como LDAP por ejemplo). (17)
Fundamentos de programacin
(Programacin bsica en Java
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
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)
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 )
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
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)
(4)
Para comprobar la versin de Java basta con ir al smbolo del sistema Windows y escribir java version
(20 )
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:
Fundamentos de programacin
(Programacin bsica en Java
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
entornos de edicin, algunos incluyen el compilador y otras utilizan el propio JDK de Sun. Algunas ventajas que ofrecen son:
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:
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).
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 */
(24 )
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.
(25 )
Fundamentos de programacin
(Programacin bsica en Java
(26 )
(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)
(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
(28 )
(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 )
que simbolice letras (valen smbolos como la , , no permitidos en la mayora de lenguajes por no ser parte del ASCII estndar)
(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.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 )
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
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 )
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.
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 )
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
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;
a la derecha a la izquierda derecha con relleno de ceros izquierda con relleno de ceros
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 )
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 )
(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);
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:
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 )
Hay que tener cuidado con las maysculas, son obligatorias donde aparezcan.
double floor(double x)
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
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 )
(45 )
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:
Seleccionamos los componentes a instalar (para Java, al menos hay que instalar el IDE Base y Java SE).
(74 )
Finalmente seleccionamos el directorio en el que se instalar Netbeans y el directorio que contiene el SDK que se utilizar por defecto:
La instalacin finaliza y disponemos de Netbeans. Una vez lanzado podremos iniciar un tutorial, obtener ayuda,. o directamente empezar a trabajar.
(75 )
Fundamentos de programacin
Programacin bsica en Java
Una vez cerrada la ventana de bienvenida de Netbeans, el aspecto de la misma es similar al de Eclipse. Los elementos fundamentales son:
(77 )
Fundamentos de programacin
Programacin bsica en Java
En la ventana Proyecto Nuevo hay que seleccin aplicacin Java. Despus podremos elegir el nombre y 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 )
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
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
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
(80 )
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
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).
(82 )
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
(7)
(84 )
(II.vi) javadoc
Netbeans tiene tambin capacidad para generar toda la documentacin javadoc de un proyecto.
(85 )
Fundamentos de programacin
Programacin bsica en Java
(8)
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.
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 )
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.
Diseador GUI. Sin duda una de las opciones donde Netbeans aventaja
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.
Ilustracin 3-38, El cuadro de opciones del editor en el apartado de formato del cdigo
(88 )
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:
Fundamentos de programacin
Programacin bsica en Java
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.
(90 )
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.
(91 )
Fundamentos de programacin
Programacin bsica en Java
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 )
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
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)
(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
[nota>=5]
escribe "Aprobado"
(6)
fundamentos de programacin
(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 )
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
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 )
(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
(11)
fundamentos de programacin
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.
(12 )
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:
Comparando los bucles de centinela con los de contador, podemos sealar estos puntos:
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
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 )
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
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.
(16 )
(5)
fundamentos de programacin
14
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)
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).
(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
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
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 )
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
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
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 )
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
(12 )
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
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}
(14 )
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.
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)
Fundamentos de programacin
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.
(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.
(16 )
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
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 )
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 de control (\n,\\,.) Opciones de caracteres. Se ponen entre corchetes. Por ejemplo
[abc] significa a, b c.
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.
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
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 )
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
(22 )
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 )
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
8 8 11
14 15
(6.9) mtodos y propiedades genricos (static) (6.10) el mtodo main (6.11) destruccin de objetos
(6.11.1) el mtodo finalize
34
24 26 29 32 32
(6)
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).
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.
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.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:
mayscula y seguirle letras minsculas (si el nombre se compone de varias palabras, la inicial de cada palabra se deja en mayscula). El (8 )
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).
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).
(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(){... }
(10 )
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.
(11)
Fundamentos de programacin
Programacin orientada a objetos
(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.
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
miNoria:Noria
E incluso sin indicar el nombre del objeto:
(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.
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 )
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
(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)
(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 )
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 )
public int getEdad() { return edad; } public void setEdad(int edad) { this.edad=edad; } }
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
(22 )
4 * factorial(3)
4*3*2*1
3*2*1 2*1 1
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:
(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.
(24 )
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.atributo. Para acceder a una propiedad del objeto actual. this.mtodo(parmetros). Permite llamar a un mtodo del objeto
actual con los parmetros indicados.
(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 )
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.
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.
(28 )
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; } }
(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.
(30 )
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
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
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.
(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 )