Академический Документы
Профессиональный Документы
Культура Документы
PDF generado usando el kit de herramientas de fuente abierta mwlib. Ver http://code.pediapress.com/ para mayor informacin. PDF generated at: Fri, 02 Jul 2010 18:20:52 UTC
Contenidos
Artculos
Programacin en Java Programacin en Java/Instalacin JDK Programacin en Java/Caractersticas del lenguaje Programacin en Java/Primer programa Programacin en Java/Variables Programacin en Java/Literales Programacin en Java/La palabra reservada final Programacin en Java/Secuencias de Escape Programacin en Java/Arrays Programacin en Java/Operadores Programacin en Java/Operadores aritmticos Programacin en Java/Operadores relacionales Programacin en Java/Operadores booleanos Programacin en Java/Operadores de bits Programacin en Java/Operadores de asignacin Programacin en Java/Operador cast Programacin en Java/Precedencia de operadores Programacin en Java/Estructuras de control Programacin en Java/Estructuras de seleccin Programacin en Java/Sentencia if-else Programacin en Java/Sentencia switch Programacin en Java/Operador if-else Programacin en Java/Estructuras de iteracin Programacin en Java/Sentencia while Programacin en Java/Sentencia do-while Programacin en Java/Sentencia for Programacin en Java/Sentencia break Programacin en Java/Sentencia continue Programacin en Java/Funciones Programacin en Java / Parmetros de una funcin Programacin en Java/Clusula return Programacin en Java/Funciones recursivas Programacin en Java/Programacin Orientada a Objetos Programacin en Java/Clases 1 4 7 9 10 13 15 15 16 18 18 21 22 24 27 28 29 31 31 32 36 39 40 41 43 45 47 48 48 50 53 53 55 56
Programacin en Java/Ejemplos de Implementacin Programacin en Java/Ejercicios Prcticos Programacin en Java/Objetos Programacin en Java/Encapsulamiento Programacin en Java/Herencia Programacin en Java/Polimorfismo Programacin en Java/La clase String Programacin en Java/La clase Vector Programacin en Java/La clase Hashtable Programacin en Java/Imprimir en Pantalla Programacin en Java/Applets Programacin en Java/Palabras reservadas Programacin en Java / Prcticas
58 58 59 60 60 60 61 62 64 65 65 65 67
Referencias
Fuentes y contribuyentes del artculo Fuentes de imagen, Licencias y contribuyentes 68 70
Licencias de artculos
Licencia 71
Programacin en Java
Programacin en Java
Programacin en Java
Java es un lenguaje de programacin de propsito general y orientado a objetos desarrollado por Sun Microsystems.
Temas Pendientes
Recin comenzamos. Algo ya tenemos para ir revisando. Un poco de pintura por aqu, un poco de retoque por all. Algunas partes ni siquiera tienen los cimientos. Animamos al que quiera contribuir, es libre de hacerlo. Pero si no tienes conocimientos o tiempo para escribir y quieres que un tema en particular aparezca en esta obra, puedes incluirlo en este listado. Aqu enumeramos el contenido que falta. Recuerda que nicamente incluimos tpicos sobre una introduccin al lenguaje Java. Instalacin del JDK. Breve explicacin de los elementos de un programa. Prcticas de todos los temas. Entornos de desarrollo.
Programacin en Java
ndice de contenidos
1. 2. 3. 4. Instalacin JDK Caractersticas del lenguaje Primer programa Variables
1. Literales 2. La palabra reservada final 3. Secuencias de Escape 4. Arrays 5. Operadores 1. 2. 3. 4. 5. 6. Operadores aritmticos Operadores relacionales Operadores booleanos Operadores de bits Operadores de asignacin Operador cast
7. Precedencia de operadores 6. Estructuras de control 1. Estructuras de seleccin 1. Sentencia if-else 2. Sentencia switch 3. Operador if-else 2. Estructuras de iteracin 1. Sentencia while 2. Sentencia do-while 3. Sentencia for 3. Saltos 1. Sentencia break 2. Sentencia continue 7. Funciones 1. Parmetros de una funcin 2. Clusula return 3. Funciones recursivas 8. Programacin Orientada a Objetos 1. Clases 1. Ejemplos de Implementacin 2. Ejercicios Prcticos Objetos Ciclo de vida de un objeto Paquetes Encapsulamiento Herencia Interfaces
2. 3. 4. 5. 6. 7.
8. Polimorfismo 9. Excepciones
Programacin en Java 10. Almacenamiento en Java 1. 2. 3. 4. 5. La clase String La clase StringBuffer La clase StringTokenizer Vectores (Arreglos) Colecciones (JFC)
1. La clase ArrayList 2. La clase Vector 3. La clase Stack 4. La clase Hashtable 5. La clase HashSet 6. La clase LinkedList 7. La clase TreeMap 8. La clase StringTokenizer 11. Entrada y Salida 1. Imprimir en Pantalla 2. Lectura del Teclado 12. Interfaz Grfica 1. Componentes Swing 2. Eventos 3. Applets 13. Threads 1. Qu es un thread? 2. MPI en Java 14. Acceso a bases de datos 1. Acceso mediante JDBC 2. Acceso mediante JPA 3. Apache Derby 15. Comunicaciones mediante redes IP 16. Aplicaciones WEB 1. Servlets 2. JSP 3. Spring Framework 17. Clusters Terracota 18. Apndices 1. Palabras reservadas 1. Ejemplos prcticos 1. Crear un PDF en Java
Programacin en Java
Prcticas de Java
Para reforzar el aprendizaje del lenguaje es til que practiquemos con l. En esta seccin se estn desarrollando una serie de prcticas correspondientes a las secciones del libro. Esta parte esta en estado "experimental" Prcticas
Instalacin en GNU/Linux
Gua de instalacin del Java Development Kit mediante repositorio:
El cambio de licencia del JDK de Sun permiti que las principales distribuciones de GNU/Linux (y BSD) incorporasen OpenJDK en sus repositorios de software de forma que la instalacin y actualizaciones se automatizan mediante las utilidades estndar de cada distribucin. Puede consultarse la documentacin que acompaa a las mismas para obtener ms informacin, aqu se muestran unos ejemplos para algunas distribuciones populares (estos ejemplos no significan ninguna preferencia sobre otras distribuciones no listadas).
Programacin en Java/Instalacin JDK Mandriva Para instalar en Mandriva Linux como root ejecutamos: # urpmi.update -a El comando anterior actualiza la base de datos de software disponible en los repositorios. A continuacin ejecutamos: # urpmi java-1.6.0-openjdk Opcionalmente podemos instalar otros paquetes relacionados: # # # # urpmi urpmi urpmi urpmi java-1.6.0-openjdk-src <--- fuentes de JDK java-1.6.0-openjdk-javadoc eclipse-jdt <--- Entorno de desarrollo Java para eclipse tomcat6 <--- Desarrollo de aplicacines web con java
El proyecto Apache jakarta contiene una extensa coleccin de libreras java de uso frecuente. Muchas se encuentran tamben disponibles como paquetes. Para ver el listado de libreras disponibles: # urpmf --name "jakarta" jakarta-commons-collections jakarta-commons-beanutils jakarta-commons-pool jakarta-commons-dbcp-tomcat5 jakarta-commons-httpclient jakarta-commons-io ... Las libreras (ficheros jar) quedarn instaladas bajo el directorio /usr/share/java. Peridicamente podemos actualizar el software mediante: # urpmi.update -a # urpmi --auto-select El comando urpmi --auto-select actualizar el JDK as como cualquier otro software ya instalado en la mquina de trabajo. Debian (Ubuntu, Mephis, etc...) Para instalar en Debian como root ejecutamos: # apt-get update El comando anterior actualiza la base de datos de software disponible en los repositorios. A continuacin ejecutamos: # apt-get install openjdk-6-jdk Opcionalmente podemos instalar otros paquetes relacionados:
# apt-get openjdk-6-source # apt-get openjdk-6-doc # apt-get eclipse-jdt # apt-get tomcat6 <--- Entorno de desarrollo Java para eclipse <--- Desarrollo de aplicacines web con java (En Debian Stable slo est disponible la versin 5.5) <--- fuentes de JDK
Programacin en Java/Instalacin JDK El proyecto Apache jakarta contiene una extensa coleccin de libreras java de uso frecuente. Muchas se encuentran tamben disponibles como paquetes. Para ver el listado de libreras disponibles:
# apt-cache search "libcommons" libcommons-collections3-java - A set of abstract data type interfaces and implementations libcommons-beanutils-java - utility for manipulating JavaBeans libcommons-pool-java - pooling implementation for Java objects libcommons-dbcp-java - Database Connection Pooling Services libcommons-httpclient-java - A Java(TM) library for creating HTTP clients libcommons-io-java - Common useful IO related classes ...
Las libreras (ficheros jar) quedarn instaladas bajo el directorio /usr/share/java. Peridicamente podemos actualizar el software mediante: # apt-get update # apt-get upgrade El comando apt-get upgrade actualizar el JDK as como cualquier otro software ya instalado en la mquina de trabajo. Otros sistemas Es importante resaltar que quizs el sistema Linux ms utilizado para aplicaciones java es RedHat o su variante Fedora, debido principalmente a que dicha compaa es propietaria de JBoss, un potente sistema basado en Java muy utilizado en entornos profesionales financieros. Sin embargo el autor de estas lneas no dispona de informacin fiable sobre la instalacin de Java en dicha distribucin, aunque considera oportuno mencionarla.
Gua de instalacin del Java Development Kit en Linux (sin usar repositorios, directamente de Sun.com):
1. En primer lugar, descargue el archivo de instalacin desde la pestaa donwloads desde: http://java.sun.com/ javase/downloads/index.jsp 1. Busque el JDK 6 Update 17 (o ltima actualizacin), Development Kit, y baje el fichero de instalacin para Linux (tambin se puede encontrar la versin para Linux x64): jdk-6u7-linux-i586.bin 2. Supngase que este fichero se deja en el directorio temporal /tmp . 2. Entre como superusuario (root) # su (pedir la contrasea, teclela y siga adelante) 3. Ubquese en el directorio a partir del que desea instalar el JDK. 1. Tpicamente /opt. 2. # cd /opt 4. Ejecute el fichero de la instalacin # /tmp/jdk-6u7-linux-i586.bin (conteste afirmativamente a lo que le pregunte) 5. Prepare un enlace simblico a la nueva instalacin del JDK # cd /usr/lib # mv java java.old # ln -s /opt/jdk1.6.0_07 java (en el segundo paso, el mv java java.old puede sustituirse por rm -f java, si est seguro de que desea eliminarlo) 6. Asegrese de que la variable de entorno PATH contiene el directorio /usr/lib/java/bin. 1. Si no lo tiene, modifique el fichero correspondiente segn la distribucin de Linux que utilice. Habitualmente sera en /etc/profile, y lo que habra que aadir es un par de lneas como las siguientes: 1. 2. 3. 4.
Caractersticas
Lenguaje totalmente orientado a Objetos. Todos los conceptos en los que se apoya esta tcnica, encapsulacin, herencia, polimorfismo, etc., estn presentes en Java. Disponibilidad de un amplio conjunto de libreras. Como ya se mencion anteriormente, Java es algo mas que un lenguaje. La programacin de aplicaciones con Java se basa no solo en el empleo del juego de instrucciones que componen el lenguaje, sino, fundamentalmente, en la posibilidad de utilizar el amplsimo conjunto de clases que Sun pone a disposicin del programador y con las cuales es posible realizar prcticamente cualquier tipo de aplicacin. Lenguaje simple. Java posee una curva de aprendizaje muy rpida. Resulta relativamente sencillo escribir applets interesantes desde el principio. Todos aquellos familiarizados con C++ encontrarn que Java es ms sencillo, ya que se han eliminado ciertas caractersticas, como los punteros. Debido a su semejanza con C y C++, y dado que la mayora de la gente los conoce aunque sea de forma elemental, resulta muy fcil aprender Java. Los programadores experimentados en C++ pueden migrar muy rpidamente a Java y ser productivos en poco tiempo. Distribuido Java proporciona una coleccin de clases para su uso en aplicaciones de red, que permiten abrir sockets y establecer y aceptar conexiones con servidores o clientes remotos, facilitando as la creacin de aplicaciones distribuidas. Interpretado y compilado a la vez Java es compilado, en la medida en que su cdigo fuente se transforma en una especie de cdigo mquina, los bytecodes, semejantes a las instrucciones de ensamblador. Por otra parte, es interpretado, ya que los bytecodes se pueden ejecutar directamente sobre cualquier mquina a la cual se hayan portado el intrprete y el sistema de ejecucin en tiempo real (run-time). Robusto Java fue diseado para crear software altamente fiable. Para ello proporciona numerosas comprobaciones en compilacin y en tiempo de ejecucin. Sus caractersticas de memoria liberan a los programadores de una familia entera de errores (la aritmtica de punteros), ya que se ha prescindido por completo los punteros, y la recoleccin de basura elimina la necesidad de liberacin explcita de memoria. Seguro (?) Dada la naturaleza distribuida de Java, donde las applets se bajan desde cualquier punto de la Red, la seguridad se impuso como una necesidad de vital importancia. A nadie le gustara ejecutar en su ordenador programas con acceso total a su sistema, procedentes de fuentes desconocidas. As que se implementaron barreras
Programacin en Java/Caractersticas del lenguaje de seguridad en el lenguaje y en el sistema de ejecucin en tiempo real. Indiferente a la arquitectura Java est diseado para soportar aplicaciones que sern ejecutadas en los ms variados entornos de red, desde Unix a Windows Nt, pasando por Mac y estaciones de trabajo, sobre arquitecturas distintas y con sistemas operativos diversos. Para acomodar requisitos de ejecucin tan diversos o variopintos, el compilador de Java genera bytecodes: un formato intermedio indiferente a la arquitectura diseado para transportar el cdigo eficientemente a mltiples plataformas hardware y software. El resto de problemas los soluciona el intrprete de Java. Portable La indiferencia a la arquitectura representa slo una parte de su portabilidad. Adems, Java especifica los tamaos de sus tipos de datos bsicos y el comportamiento de sus operadores aritmticos, de manera que los programas son iguales en todas las plataformas. Estas dos ltimas caractersticas se conocen como la Mquina Virtual Java (JVM). Alto rendimiento Multihebra Hoy en da ya se ven como terriblemente limitadas las aplicaciones que slo pueden ejecutar una accin a la vez. Java soporta sincronizacin de mltiples hilos de ejecucin (multithreading) a nivel de lenguaje, especialmente tiles en la creacin de aplicaciones de red distribuidas. As, mientras un hilo se encarga de la comunicacin, otro puede interactuar con el usuario mientras otro presenta una animacin en pantalla y otro realiza clculos.
Dinmico El lenguaje Java y su sistema de ejecucin en tiempo real son dinmicos en la fase de enlazado. Las clases slo se enlazan a medida que son necesitadas. Se pueden enlazar nuevos mdulos de cdigo bajo demanda, procedente de fuentes muy variadas, incluso desde la Red. Produce applets Java puede ser usado para crear dos tipos de programas: aplicaciones independientes y applets. Las aplicaciones independientes se comportan como cualquier otro programa escrito en cualquier lenguaje, como por ejemplo el navegador de Web HotJava, escrito ntegramente en Java. Por su parte, las applets son pequeos programas que aparecen embebidos en las pginas Web, como aparecen los grficos o el texto, pero con la capacidad de ejecutar acciones muy complejas, como animar imgenes, establecer conexiones de red, presentar mens y cuadros de dilogo para luego emprender acciones, etc.
Escribiendo el cdigo
Para crear el cdigo fuente, abrimos un editor, por ejemplo, el Bloc de Notas de Windows, o el 'vim' en cualquier Unix, y escribimos: /* El programa Hola Mundo muestra un saludo en la pantalla */ public class HolaMundo { public static void main(String[] args){ //Muestra "Hola Mundo!" System.out.println("Hola Mundo!"); } } Hay que tener cuidado de copiar el cdigo tal cual se muestra aqu. El lenguaje Java es sensible a las maysculas y minsculas, entonces HolaMundo no es lo mismo que holamundo. Una vez terminado lo guardamos en un archivo con el nombre de "HolaMundo.java". Compilando el cdigo==public class HolaMundo { public static void main(String[] args){ System.out.println("Hola Mundo!"); } } Una vez guardado el cdigo fuente, abrimos el MS-DOS o Command Prompt. Nos situamos en el directorio en donde se encuentra el archivo y luego ejecutamos el siguiente comando: javac HolaMundo.java Si todo sale bien, el compilador genera un archivo bytecode , HolaMundo.class en el mismo directorio en donde esta el programa. De lo contrario muestra los errores que contiene el cdigo.
10
Ejecutando el Cdigo
En el mismo directorio en donde estamos trabajando escribir el siguiente comando: java HolaMundo Esta vez escribimos el nombre del programa, pero sin la extensin. Si hemos realizado bien los pasos y tenemos instalado correctamente el JDK , tendremos en la pantalla el saludo: Hola Mundo!
Para saber ms
Mquina virtual de Java Bytecode
Programacin en Java/Variables
Las variables son la manera en que indicamos al compilador el espacio en memoria que debe de reservar para almacenar la informacin. Podemos acceder a un dato alojado en la memoria por medio de una variable. Toda variable tiene un nombre para poder identificarla y realizar operaciones. Antes de trabajar con alguna variable debemos declararla en el programa. Por ejemplo: String cliente; Aqu estamos reservando memoria para una variable de tipo String y la identificamos con el nombre cliente. De ahora en adelante si en el programa hablamos de cliente, estamos haciendo referencia a esa porcin de memoria y al valor que contiene. Podemos asignarle algn valor en el momento de declarar una variable. Por ejemplo: String cliente = "Isaac Newton"; Aqu reservamos memoria para una cadena de caracteres y le asignamos el valor "Isaac Newton". Tambin podemos declararla y en otro lugar del programa fijarle un valor : String cliente; // declaracin ... // El programa sigue cliente = "Isaac Newton"; // le damos un valor La sentencia para declarar una variable se resume como: Tipo_Dato Nombre_Variable [= Valor]; Definimos el tipo de dato, el nombre y opcionalmente su valor. Para ver como se utilizan las variables, podemos modificar el primer programa. Agregaremos una variable que contenga el texto que se mostrar en pantalla: public class HolaMundo { public static void main(String[] args){ String saludo = "Hola Mundo!"; System.out.println( saludo ); } }
Programacin en Java/Variables Definimos una variable de tipo String con el nombre "saludo". En la declaracin de la variable tambin la inicializamos con el valor "Hola mundo!". Luego llamamos al mtodo que imprimir el texto en la pantalla haciendo referencia a la variable. En el programa original, explcitamente introducamos el texto que se mostrara, ahora solo escribimos el nombre de la variable. Cuando el intrprete se encuentre con el nombre de esta variable, tendr que buscar valor que almacene en la memoria para mostrarlo por pantalla. Un variable puede cambiar su valor en el transcurso del programa. public class UsoVariables{ public static void main(String args[]){ String saludo; saludo = "Hola Mundo!"; System.out.println( saludo ); saludo = ("Estoy utilizando variables"); System.out.println( saludo ); } } Siempre debemos inicializar una variable. Al momento de leer el contenido de una variable, el compilador de Java siempre verifica que tenga un valor. De lo contrario el programa no compilar y mostrar el error. Un ejemplo de este caso: if (x > 0) { saludo = "Hola Mundo!!!"; } System.out.println( saludo ); En este caso el compilador mostrar un mensaje de error indicando que la variable x no se ha inicializado con ningn valor. Como se puede observar esta variable solo se inicia cuando se cumple una condicin, sin embargo se indica que va a ser utilizada siempre. El compilador detecta este posible error. Un ejemplo de solucin posible sera: int x = 1; if (x > 0) { saludo = "Hola Mundo!"; } System.out.println( saludo ); Agregando estas lneas al final del cdigo de la clase UsoVariables nos mostrara lo siguiente a la salida: Hola Mundo! Estoy utilizando variables Hola Mundo!!!
11
Programacin en Java/Variables
12
Nombre de la variable
El nombre debe ser nico en el contexto del programa. Adems debe seguir las siguientes reglas: No debe ser una palabra reservada del lenguaje o un literal booleano (true o false) Puede contener cualquier caracter Unicode, pero no debe comenzar con un nmero No debe contener los smbolos que se utilicen como operadores ( + , - , ?, etc ) Por convencin: Los nombres comienzan con una letra en minscula. Si un nombre consiste en mas de una palabra, se escribir sin espacios y cada palabra comenzar con una letra mayscula (por ejemplo : estaBienEsteNombre )
Tipo de variable
Cada variable debe tener un tipo de dato predefinido. Esto determina el rango de valores que puede almacenar y que operaciones se pueden realizar. Por ejemplo una variable de tipo entero puede almacenar nmeros sin decimales y puede realizarse operaciones aritmticas, pero no puede contener palabras. Existen dos categoras de variables: las de tipo primitivo o las referenciadas. Una variable de tipo primitivo accede al valor asignado directamente. Las referenciadas se accede a travs de un puntero, es decir que no almacenan un valor sino una direccin de memoria. Estas ltimas son utilizadas por las matrices , las clases e interfaces.
boolean 1 bit
En otros lenguajes de programacin, el formato o el tamao de los tipos primitivos dependen del microprocesador o del sistema operativo que se estn ejecutando. En cambio, Java pretende ser independiente de la plataforma, y mantiene los formatos sin cambios. Para los caracteres alfanumricos utiliza la codificacin UNICODE de 16 bits para permitir la inclusin de varios alfabetos.
Para saber ms
Variables Tipos de datos
Programacin en Java/Literales
13
Programacin en Java/Literales
Pueden existir varias formas de representar un valor. Por ejemplo al tener el nmero 100, significa exactamente 100 en una base decimal, pero hablamos de 4 en una base binaria o 256 en hexadecimal. Para evitar ambigedades, en Java se establecieron algunas normas.
Literales enteros
Existen 3 maneras de representar el valor de un nmero entero. Si se escribe el nmero solamente, este representa un nmero en base decimal. Si tiene un cero adelante estamos escribiendo octales y si tiene el prefijo "0x" el valor est representado en base hexadecimal. Por ejemplo:
Base de numeracin Decimal Octal Hexadecimal valor valor decimal
100 0100
100 64
0x100 256
Para indicarle al compilador que un valor dado es de tipo long debemos incluir el sufijo L: long largo= 800L;
Para determinar si estamos hablando de float o double, al nmero se le agrega un sufijo: F o f para float y D o d para double. Si no colocamos un sufijo el compilador lo toma como double.
Literales char
Una variable de tipo char almacena un carcter Unicode. Este sistema de codificacin ampla la escasez de opciones que tiene la codificacin ASCII para incluir otros alfabetos. Podemos escribir en griego, hebreo o en vietnamita sin que el compilador proteste. Un literal de tipo char se expresa encerrando el carcter entre comillas simples: char caracter = 'z'; Otra forma de representar un carcter es indicando el cdigo Unicode en hexadecimal, anteponiendo los smbolos \u, todo entre comillas simples. De esta manera el smbolo arroba ( @ ) se escribe: char arroba = '\u0040'; El primer byte de la codificacin Unicode es la misma que el viejo y querido ASCII
Programacin en Java/Literales
14
Literales boolean
Sencillamente true o false (verdadero o falso) sin comillas y en minscula. No tienen correlacin con ningn nmero como ocurre en el lenguaje C que tenamos al 0 como false y al 1 como true.
Literales String
El tipo String no es un tipo de dato primitivo. Pero se comporta como si lo fuera. Para indicar una cadena de caracteres se encierran entre comillas dobles. String cadena = "Time is money";
26.45e-45 double '\u00ff' 'c' "true" true char char String boolean
En los sufijos que tenemos para identificar el tipo de dato no importa si son en minscula o mayscula. Pero por convencin se utilizan en mayscula, pues se puede confundir al leer el cdigo una ele minscula ( l ) con un uno ( 1 ). Hay que tener cuidado de no olvidarnos los sufijos cuando sean necesarios. El siguiente cdigo da un error en tiempo de compilacin: float f = 3.14; El compilador nos dar el error de "possible loss of precision" (posible prdida de precisin). Esto se debe a que sin la F atrs, estamos indicando un valor de tipo double. El compilador se niega a comprimir un double de 64 bits en un float de tan solo 32 bits. Lo solucionamos de esta manera: float f = 3.14f; Y le alegramos la vida a un compilador gruon.
15
Programacin en Java/Secuencias de Escape public class SecEsc04 { public static void main(String args[]) { System.out.println("\tTexto tabulado"); } } A continuacin hay una lista de secuencias de escape: \n -----> Nueva Linea. \t -----> Tabulador. \r -----> Retroceso de Carro. \f -----> Comienzo de Pagina. \b -----> Borrado a la Izquierda. \\ -----> El caracter "\". \' -----> El caracter "'". \" -----> El caracter '"'.
16
Programacin en Java/Arrays
En java a diferencia del lenguaje C, existe un tipo de variable especial, el Array. Este tipo de variables no es ms que un conjunto secuencial de memoria a las que se accede a travs de un ndice de posicin. Los arreglos en Java son objetos, por lo que cuentan con propiedades y mtodos para manipularlos. Se pueden declarar arreglos de tipos de datos primitivos y de objetos. Ms abajo tienes la sintaxis bsica de declaracin de arrays. Sintaxis: tipodedato nombre [] [= new tipodedato[capacidad]] o tipodedato[] nombre [= new tipodedato[capacidad]] Como puedes observar puedes inicializar un array al momento de declararlo o postergar esta operacin para cuando sea necesario. Para inicializar un array existen 2 maneras: int[] arreglo=new int[4] o int[] arreglo={100,200,302,400} Como podrs concluir la primera declaras el array nada ms dicindole la cantidad de memoria secuencial que se debe reservar, en el segundo ejemplo se inicializa el array dndole los valores que va a contener (obviamente la cantidad de memoria secuencial reservada sera igual a la cantidad de elementos insertados). Al momento de inicializar un arreglo de la manera : int[] arreglo=new int[4] cada posicin del arreglo sera inicializada con el valor por defecto del tipo de variable. Por ejemplo si el arreglo si el arreglo es de tipo boolean, todas las posiciones del arreglo sern inicializadas con el valor false (ya que este es valor por defecto de este tipo de dato), por el contrario si el arreglo fuese de un tipo no primitivo, el valor que contendr cada casilla sera null. A continuacin tienes una lista de los valores por defecto de cada tipo de dato Tipo de Dato-->Valor byte-->0 short-->0 int-->0
Programacin en Java/Arrays long-->0 float-->0.0 double-->0.0 char-->/u0000 boolean-->false Object (Cualquier tipo de Objeto)-->null Para obtener el tamao de un array de manera dinmica se utiliza la propiedad .length, esta propiedad es comn para todos los array . Tambin es importante saber que los arreglos se empiezan a enumerar desde el numero (0) cero por tanto para acceder al valor almacenado en la ultima posicin debers colocar el tamao del arreglo menos 1 unidad. Al momento de tratar de acceder a una posicin fuera del rango del arreglo se lanzara un exception de tipo java.lang.ArrayIndexOutOfBoundsException (esta exception es una exception no chequeada es por eso que no es necesario colocar un bloque try/catch en el cdigo) Pasaremos con un ejemplo: public class Arrays01 { public static void main(String args[]) { int ita_nro[] = new int[4]; int it_cont; for (it_cont = 0;it_cont < 4; it_cont ++){ ita_nro[it_cont] = it_cont * 2; System.out.println(ita_nro[it_cont]); } } } Joe Herbert Arroyo Pea Jesus M. Baez R. Alberto Ladrn de Guevara Herrero.
17
Programacin en Java/Operadores
18
Programacin en Java/Operadores
Un operador realiza una funcin, toma uno o ms argumentos y devuelve un resultado. Cuando vimos las variables, definimos un tipo de dato con un conjunto de operaciones asociadas. Es de esperar que podamos realizar operaciones aritmticas con nmeros y lgicas con los booleanos. Estas operaciones se representan mediante operadores. Los operadores, al igual que los mtodos, se pueden sobrecargar, es decir se puede redefinir su funcionalidad dependiendo de los tipos de datos de los operandos que reciba. As, podemos indicar que el operador (+) realice una suma aritmtica si los operandos que recibe son dos enteros y una concatenacin si recibe una cadena y otro objeto.
Programacin en Java/Operadores aritmticos Tendremos un "possible lost of precision" como respuesta, por mas que el pequeito 2 entra holgadamente en una variable short. El compilador evita que al utilizar estos tipos de datos no nos pasemos de largo. Pero de todas formas me voy a vengar. Analicemos el siguiente cdigo: public class IntGrande{ public static void main(String[] args){ int j = 2147483647; int i = j + 1; System.out.println("El valor obtenido es " + i); } } El valor 2147483647 (es decir 2^31 - 1 ) es el ms grande que puede tolerar un int. Pero veamos que pasa al sumarle uno ms. El compilador se queda mudo y cae en nuestra trampa. Ejecutamos el programa y obtenemos: El valor obtenido es -2147483648 Desastroso, Verdad? Veamos lo que pas: Tenamos el valor mximo para los int: 01111111111111111111111111111111 : 2147483647 en nmeros binarios. 00000000000000000000000000000001 : le sumamos 1 10000000000000000000000000000000 : Resultado: -2147483648 complemento a 2 Esta anomala se la conoce como overflow (desbordamiento). El procesador puede identificar un resultado con este problema comparando los signos. Es de esperar que si sumamos dos nmeros positivos, no nos de como resultado un nmero negativo. Pero el intrprete de Java no nos avisa, por lo tanto tenemos que cuidarnos al trabajar cerca de los extremos. Sigamos metindonos en embrollos. Veamos ahora que ocurre si tratamos de dividir cualquier numero por cero. Para la verificacin escribimos este programa: public class DivCero{ public static void main(String[] args){ int x = 5; int y = 0; int z = x/y; System.out.println(z); } } No tenemos noticias al compilar. Pero al ejecutar el programa, el intrprete nos manda a pasear con la siguiente nota: Exception in thread "main" java.lang.ArithmeticException: / by zero Veremos mas adelante como controlar el nimo del interprete cuando ocurren estos errores, aqu conocidos como excepciones. La moraleja es que no se puede dividir un entero por cero. Sigamos dando pelea, no nos dejemos intimidar. Probemos que ocurre con los nmeros reales: public class DivCeroFloat{ public static void main(String[] args){
19
Programacin en Java/Operadores aritmticos float x = 5.0f; float y = 0.0f; float z = x/y; System.out.println(z); } } Compilamos y no escuchamos nada. Ejecutamos el programa... Infinity Ni error ni cosas raras, el float se aguant los malos tratos. Esto ocurre porque los nmeros reales en su representacin binaria soportan el valor infinito.
20
Programacin en Java/Operadores aritmticos Partiendo del mismo valor, vemos que j se increment, mientras que la variable i se mostr sin cambios. Si colocamos el operador como sufijo, primero se evala la variable y luego se realiza la operacin. En el caso de la variable i, antes de incrementar su valor se mostr por pantalla. Para la variable j el procedimiento fue inverso. Antes de mostrar su valor se increment.
21
Operadores relacionales
Operador Utilizacin > >= < <= == != A>B A >= B A<B A <= B A == B A != B Resultado verdadero si A es mayor que B verdadero si A es mayor o igual que B verdadero si A es menor que B verdadero si A es menor o igual que B verdadero si A es igual a B verdadero si A es distinto de B
Aqu tenemos un programa para ver el funcionamiento de estos operadores : public class Relaciones { public static void main(String args[]){ int i = -3; byte b = 5; float f = 1e-10f; double d = 3.14; boolean b1 = i > i; boolean b2 = i < b; boolean b3 = b <= f; boolean b4 = f >= d; boolean b5 = d != 0; boolean b6 = 1 == f; System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( } i i b f d 1 + + + + + + " " " " " " > " + i + " = " + b1); < " + b + " = " + b2); <= " + f + " = " + b3); >= " + d + " = " + b4); != " + 0 + " = " + b5); == " + f + " = " + b6);
22
} No nos olvidemos de los char, que tambin participan. Podemos comparar caracteres, pues internamente estn almacenados como nmeros. char a = 'A'; char b = 'B'; boolean x = a > b; Entre los booleanos solo se permiten los operadores de equivalencia, es igual (==) o es distinto (!= ) boolean x = true; boolean y = x == x; boolean z = x != y;
Operadores booleanos
Nombre Operador Utilizacin AND OR NOT AND OR XOR && || ! & | ^ A && B A || B !A A&B A|B A^B Resultado verdadero cuando A y B son verdaderos. Evaluacin condicional. verdadero cuando A o B son verdaderos. Evaluacin condicional. verdadero si A es falso. verdadero cuando A y B son verdaderos. Siempre evala ambos operandos. verdadero cuando A o B son verdaderos. Siempre evala ambos operandos. verdadero cuando A y B son diferentes
Cada una de estas operaciones tiene asociada una tabla de verdad. Esto nos permite ver el resultado de un operador aplicado a las distintas combinaciones de valores que pueden tener los operandos. A continuacin mostraremos como se comporta el operador AND mediante su tabla de verdad. public class TablaAnd { public static void main(String args[]){ boolean x = true; boolean y = false; boolean a1 = x && x; boolean a2 = x && y; boolean a3 = y && x; boolean a4 = y && y; System.out.println("Tabla System.out.println( x + " System.out.println( x + " System.out.println( y + " de verdad AND " + x AND " + y AND " + x de la + " = + " = + " = conjuncion"); " + a1 ); " + a2 ); " + a3 );
Programacin en Java/Operadores booleanos System.out.println( y + " AND " + y + " = " + a4 ); } } Si probamos de quitar un ampersand ( & ) del operador, vemos que obtenemos los mismos resultados. Existen dos operadores AND, uno con dos smbolos & y el otro con uno solo. Tambin tenemos dos operadores OR. boolean x1 = operando1 && operando2; boolean x2 = operando1 & operando2; boolean y1 = operando1 || operando2; boolean y2 = operando1 | operando2; Parece extrao, sobre todo porque tienen la misma tabla de verdad. Pero internamente tienen un comportamiento diferente. Cuando estamos en presencia de un operador con un solo smbolo, siempre se evalan ambos operandos. En cambio para el operador con el smbolo repetido, su evaluacin cambia segn el valor del primer operando. Por ejemplo tenemos la siguiente operacin. boolean x = true && false; El resultado es falso, pero el intrprete tiene que mirar el segundo operando para saberlo. boolean x = false && true Aqu ni se molesta en mirar el ltimo operando, porque la operacin AND es verdadera solamente cuando ambos operandos son verdaderos. En el caso del operador OR, se evala el segundo operador si el primero es falso. Cuando es verdadero, no tiene en cuenta el otro operando. El resultado es verdadero sin importar el valor del segundo. Veamos un caso extremo para mostrar como funciona la evaluacin condicional. Tenemos el siguiente programa en donde pretendemos hacer saltar al intrprete con un error. public class Condicional { public static void main(String args[]){ int x = 0; int y = 2; boolean b = ( x != 0 ) && ( ( y / x ) != 0 ); System.out.println(b); } } Sin ningn tipo de emocin, aburridamente el intrprete nos avisa que el resultado es "false". Ahora ver. Quitemos un smbolo & y quedmonos con uno solo. El resultado es otro : java.lang.ArithmeticException: / by zero La primera vez verific que x!=0 era falso, entonces dio por terminada la operacin con el resultado falso. Cuando cambiamos de operador, evalu los dos operandos y cay en nuestra trampa. Tuvo que calcular cuanto es y / x dando luego un error de divisin por cero. Los operadores booleanos son muy amigos de los relacionales. Se llevan bien porque los ltimos dan resultados booleanos. Entre ambos tipos de operadores se pueden construir instrucciones mas complejas.
23
Programacin en Java/Operadores booleanos Por ejemplo, queremos saber si un nmero est dentro de un rango. Solo tenemos que compararlo con los extremos: int y = 4; boolean x = ( y > 3 ) && ( y < 6 ); Ahora deseamos saber si una variable tiene el valor "a" no importando si es mayscula o minscula. char c = 'b'; boolean x = ( c == 'a' ) || ( c == 'A' ); No olviden que el operador de equivalencia (==) tiene dos smbolos igual (=), si colocan uno solo les dar un error de asignacin.
24
Los Bits
El mtodo mas sencillo de representacin son los nmeros naturales. Por ejemplo, si tengo el nmero 85 en decimal, solo tengo que llevarlo a binario y obtengo una serie de unos y ceros. : 1010101 = 85 en binario Cada dgito (un cero o un uno) de este nmero se llama bit. Java tiene una serie de operadores capaces de manipular estos dgitos, son los operadores de bits.
Operadores de bits
Operador Utilizacin << >> >>> A << B A >> B A >>> B Resultado Desplazamiento de A a la izquierda en B posiciones Desplazamiento de A a la derecha en B posiciones, tiene en cuenta el signo. Desplazamiento de A a la derecha en B posiciones, no tiene en cuenta el signo. Operacin AND a nivel de bits Operacin OR a nivel de bits Operacin XOR a nivel de bits Complemento de A a nivel de bits
& | ^ ~
Para operar a nivel de bit es necesario tomar toda la longitud predefinida para el tipo de dato. Estamos acostumbrados a desechar los ceros a la izquierda en nuestra representacin de nmeros. Pero aqu es importante. Si trabajamos una variable de tipo short con un valor de 3, est representada de la siguiente manera : 0000000000000011 Aqu los 16 bits de un short se tienen en cuenta.
25
Desplazamientos
Los operadores de desplazamiento, mueven los bits a la izquierda o a la derecha. El primer operando ser la victima a sacudir. El segundo indicar cuantas posiciones.
Cada "hueco" que queda a la derecha tras correr este nmero se rellena con los dgitos que van saliendo por la izquierda (ceros en este caso). Si prestamos atencin, observaremos que esta operacin multiplic a j por 2 tantas veces como posiciones se ha desplazado. En este caso se multiplic por 4 ( 2 x 2 ). Como el signo del nmero puede cambiar tras la operacin, se denomina desplazamiento con signo.
Programacin en Java/Operadores de bits El resultado es: -1 Qued exactamente igual. Prueben de correr el nmero tantas posiciones como tengan ganas y obtendrn el mismo resultado. Esto ocurre porque en el desplazamiento, los "huecos" que quedan a la izquierda se rellenan con el bit uno (1), quedando inalterable. Este operador desplaza el conjunto de bit a la derecha y agrega a la izquierda los bits que faltan segn el signo. Si se encuentra con un nmero positivo, agrega ceros, en cambio si son negativos agrega unos. Se lo conoce como desplazamiento con signo.
26
27
El resultado da -133 Como los enteros negativos en Java se representan con el mtodo del complemento a dos, podemos realizar un sencillo experimento de cambiarle el signo a un nmero. Para realizarlo debemos aplicar a un entero el operador NOT y sumarle uno. int x = 123; int y = ~x; int z = y + 1; El resultado da -123,
Para saber ms
Bit Lgica binaria
= Pi * dimetro;
En el ejemplo vemos la variable par toma el valor de 2 y permetro el resultado de una expresin. Veamos un ejemplo de una instruccin tonta, que en realidad no hace nada. algo = algo; La variable algo toma el valor de algo; todo queda como antes. Ahora aumentemos el valor de la variable en 3 unidades. algo = algo + 3; Aqu la variable toma el valor que tena mas 3 unidades. Existe una forma de simplificar la notacin anterior. Es la siguiente: algo += 3; // equivalente a algo = algo + 3
Se juntaron el operador de suma con el de asignacin. Este atajo se puede realizar para otras operaciones adems de la suma. Es til cuando la operacin contiene como primer operando al valor de la misma variable en la que se almacena el resultado.
28
Operadores de asignacin
Operacin Suma Resta Multiplicacin Divisin Resto de divisin Desplazamiento a la izquierda Desplazamiento a la derecha Operador Utilizacin Operacin equivalnte += -= *= /= %= <<= >>= A += B A -= B A *= B A /= B A %= B A <<= B A >>= B A >>>= B A &= B A |= B A ^= B A=A+B A=A-B A=A*B A=A/B A=A%B A = A << B A = A >> B A = A >>> B A=A&B A=A|B A=A^B
Desplazamiento a la derecha sin signo >>>= AND de bits OR de bits XOR de bits &= |= ^=
Programacin en Java/Operador cast Existe un cierto peligro en la utilizacin indiscriminada de este operador. Observemos el siguiente programa : public class Int2Byte { public static void main(String args[]){ int unInt = 5000; byte unByte = (byte)unInt; System.out.println("el resultado es : " + unByte); } } Aqu intentamos meter a empujones un valor en un byte , cuyo valor es mas grande de lo soportado. Pero en este caso Java tomas las cosas con indiferencia. Si ejecutamos el programa nos indicar : el resultado es : -120 El resultado dista mucho del valor original. El operador cast se comport como una picadora de bits. Si miramos con lupa ambos valores, nos damos cuenta que ocurri: 00000000000000000001001110001000 : un int de valor 5000 10001000 : un byte de valor -120, complemento a 2 Resulta que al aplicar el cast "cortamos" la variable int en los primeros 8 bits que corresponden al tamao del byte.
29
j/j*j>j-j+j&&j<<j>>>j==j%j||++j<--j+j--;
Civilizadamente se organizan de acuerdo al nivel del precedencia de cada uno. Primeramente proceden los unarios, luego los aritmticos, despus los de bits, posteriormente los relacionales, detrs vienen los booleanos y por ltimo el operador de asignacin. La regla de precedencia establece que los operadores de mayor nivel se ejecuten primero.
Precedencia de operadores
Descripcin operadores posfijos operadores unarios op++ op-++op --op +op -op ~ ! Operadores
multiplicacin y divisin * / % suma y resta desplazamiento operadores relacionales equivalencia operador AND operador XOR operador OR AND booleano +<< >> >>> < > <= => == != & ^ | &&
30
|| ?: = += -= *= /= %= &= ^= |= <<= >>= >>>=
En la tabla se muestra el nivel de precedencia de los operadores. Los de mayor nivel se encuentran arriba. Podemos ver que los ltimos son los de asignacin. Esto es lgico, ya que se debe calcular primeramente la expresin antes de asignar un resultado a una variable. Veamos unos ejemplos de cmo acta esta regla. int j = 1 + 3 * 4; // resultado j = 13 Desde que aprendimos aritmtica bsica, conocemos la regla que nos obliga a calcular la multiplicacin antes de una suma. Esto tambin se cumple en Java. int j = 1 + 3 4; resultado j= 0;
Si todos los operadores tienen un nivel idntico de precedencia se evalua la expresin de izquierda a derecha.
Utilizacin de parntesis
Se utilizan para aislar una porcin de la expresin de forma que el clculo se ejecute de forma independiente. Puede forzar a una expresin a ignorar las reglas de precedencia. int j = 1 + 3 * 4; // resultado j = 13 int h = (1 + 3) * 4 // resultado j = 16 Tomando el primer ejemplo, forzamos al compilador a realizar la suma antes que la multiplicacin. En este ejemplo es imprescindible la utilizacin de parntesis : int k = 1 + (h = 3); Si quitamos los parntesis el compilador protestar. Porque al establecer un nivel muy bajo para la asignacin, procede primero la suma. Pero estamos sumando con una variable sin valor. Como en matemticas, podemos anidar los parntesis. Se comenzara a evaluar los internos hasta llegar a los externos. Cabe agregar que los parntesis no disminuyen el rendimiento de los programas. Por lo tanto, agregar parntesis no afecta negativamente al programa. int k = ((12 - 2) * ( 21 - 11)) / ((1+1)*(15-10)) + 1 ;
31
velocidad_del_vehculo = 0 Estamos frente a una seleccin simple: tenemos dos alternativas. Este tipo de seleccin la condicin toma un valor lgico de verdadero o falso. Se tienen que especificar las acciones que deben ocurrir si la condicin es verdadera. Opcionalmente se puede indicar que debe ocurrir si la condicin es falsa. Para lo ltimo veamos un ejemplo. si luz = rojo entonces frenar de otro modo seguir con la misma velocidad. Imaginemos que estamos en un da de mucho calor y deseamos tomar un refresco. Para ello nos dirigimos a una mquina expendedora de gaseosas, insertamos una moneda y elegimos el tipo de bebida. Generalmente una mquina expendedora tiene un panel con botones para realizar la eleccin. Internamente dispone de un programa que suelta una lata de acuerdo al botn pulsado. El algoritmo puede ser similar a esto: Seleccin de acuerdo al botn presionado:
32
En el caso de "2" expulsar lata de Lemmon Duke. En el caso de "3" expulsar lata de Cola Duke.
En el caso de "4" expulsar lata de Coffee Duke. En el caso de "5" expulsar lata de Cherry Duke. Tenemos varias alternativas y la accin realizada depender de un valor discreto. Esta es una seleccin mltiple.
Programacin en Java/Sentencia if-else Qu ocurre si la condicin no se cumple? En este caso nada. Podemos agregar una serie de instrucciones que se ejecutarn solo si la condicin no se cumple. Para esto tendremos que agregar la sentencia else. La estructura de seleccin quedar as: if (condicin) sentencia 1; else sentencia 2; Si la condicin es verdadera se ejecuta la sentencia 1 en caso contrario se ejecuta la sentencia 2. Ambas sentencias nunca se ejecutarn al mismo tiempo, son excluyentes. Ahora ampliemos el programa para mostrar una advertencia en el caso que se encuentre cara a cara con un cero siniestro. public class DivisionSegura { public static void main(String args[]){ int x = 12; int y = 0; int z = 0; if( y !=0 ) z = x / y; else System.out.println("Atencin! se pretende dividir por 0"); System.out.println("El resultado es : " + z); } } El programa nos qued mas completo. Con la clusula else incluimos otra alternativa de accin. Pero algo anda suelto. Este programa siempre muestra un resultado, se cumpla o no la condicin. El mensaje por pantalla no est incluido en la estructura de seleccin. Tendremos que colocarlo dentro del sector de sentencias que se ejecutarn cuando la condicin sea verdadera. Para agrupar las sentencias se utilizan las llaves ( { } ) Indicarn el inicio y el fin de un bloque de sentencias. Probemos como queda con un bloque public class DivisionSegura { public static void main(String args[]){ int x = 12; int y = 2; int z = 0; if( y !=0 ) { z = x / y; System.out.println("El resultado es : " + z); } else { System.out.println("Atencin! se pretende dividir por 0"); } } } Las buenas prcticas en defensa de un cdigo mantenible han dictaminado que utilicemos las llaves en todo momento, an en el caso que utilicemos una sola sentencia. if (condicin) { sentencia; } else {
33
Programacin en Java/Sentencia if-else sentencia; } Lamentablemente no siempre nos encontraremos con condiciones tan sencillas. Muchas veces tendremos que recurrir a proposiciones compuestas para formar una condicin. Para ello podemos recurrir a operadores relacionales o lgicos. Recuerden que siempre debe dar como resultado un valor booleano. Supongamos que deseamos saber si un ao es bisiesto. Sabemos que debe ser mltiplo de 4. Para esto tendremos que verificar si el mdulo es igual a cero. ao % 4 == 0 Pero no debe ser mltiplo de 100. ( ao % 4 == 0 ) && ( ao % 100 != 0 ) A menos que sea mltiplo de 400. ((( ao % 4 == 0 ) && ( ao % 100 != 0 )) || ( ao % 400 == 0 )) Formamos una proposicin compuesta con conectores lgicos. Ahora vamos a incorporarlo en una estructura se seleccin. if ((( ao % 4 == 0 ) && ( ao % 100 != 0 )) || ( ao % 400 == 0 )) { System.out.println("Es bisiesto"); } else { System.out.println("No es bisiesto"); } Los conectores lgicos nos permiten simplificar la estructura. Sin ellos nos veramos en la necesidad de anidar las sentencias. Veamos que ocurre si en elejemplo anterior descartamos el AND y el OR. if ( x % 4 == 0 ) { if ( x % 100 == 0 ) { if ( x % 400 == 0 ) { System.out.println("Es bisiesto"); } else { System.out.println("No es bisiesto"); } } else { System.out.println("Es bisiesto"); } } else { System.out.println("No es bisiesto"); } Parece complicado, pero nos demuestra muchas cosas. En primer lugar observamos que se pueden anidar las sentencias if-else. Cada resultado de una condicin puede caer en una nueva comprobacin para formar una estructura compleja de seleccin. Tambin vemos que hay cierta relacin entre conectores lgicos y la estructura.
34
35
Conjuncin if (condicin1 && condicin2){ sentecia1; } else { sentencia2; } if ( condicin1 ) { if ( condicin2 ) { sentencia1; } else { sentencia2; } } else { sentencia2; }
Disyuncin if ( condicin1 || condicin2 ) { sentencia1; } else { sentencia2; } if ( condicin1 ){ sentencia1; } else { if ( condicin2 ) { sentencia1; } else { sentencia2; } }
36
Programacin en Java/Sentencia switch default: System.out.println("error" ); break; } } } La sentencia switch se encarga de estructurar una seleccin mltiple. Al contrario del enunciado if-else que slo podemos indicar dos alternativas, maneja un nmero finito de posibilidades. La estructura general del enunciado switch es la siguiente: switch( expresin ) { case constante1: sentencia1; ... break; ... case constanteN: sentenciaN; ... break; default: sentencia; ... break } El valor de la expresin y de las constantes tiene que ser de tipo char, byte, short o int. No hay lugar para booleanos, reales ni long porque, en la ejecucin, todos los valores que incorporamos se transforman en valores de tipo int. Al evaluar la expresin de switch, el intrprete busca una constante con el mismo valor. Si la encuentra, ejecuta las sentencias asociadas a esta constante hasta que tropiece con un break. La sentencia break finaliza la ejecucin de esta estructura. Si no encuentra ninguna constante que coincida con la expresin, busca la lnea default. Si existe, ejecuta las sentencias que le siguen. La sentencia default es opcional. Volviendo a la mini calculadora, vemos como se organiza las distintas alternativas de acuerdo al valor de una constante char. Estas alternativas representan las distintas operaciones que estn disponibles y solo se ejecutar una sola. Por ejemplo, si el valor del operador (en el programa figura op) es igual al signo de la suma , la sentencia switch ejecutar solamente la lnea que corresponde con esta operacin. Que ocurre si cambiamos la variable op por algn carcter distinto a los especificados? Entra en juego la alternativa default y todas las setencias que le siguen. En este caso imprime por pantalla el mensaje "error". Si nos olvidamos de incorporar esta alternativa, no pasa nada. Ninguna sentencia dentro de la estructura switch se ejecutar. Ya que hablamos de default, es conveniente mencionar que no es necesario que quede relegado al final de la estructura. Podemos situarla al comienzo , en el medio, en definitiva, en donde nos quede mas til segn la lgica que apliquemos o donde queramos. switch ( op ) { default : System.out.println("error"); break;
37
Programacin en Java/Sentencia switch case '+': System.out.println( a + b ); break; ... En el ejemplo presentado, funciona de la misma manera un default al principio. Obviamente no debe existir mas de una alternativa default. Las sentencias break son opcionales. Se utilizan con el propsito de separar las alternativas. Pero fieles a nuestro estilo de meternos en problemas decidimos que algunos break deben desaparecer. Probemos que ocurre con este cdigo: switch ( op ) { case '+': System.out.println( a + b ); case '-': System.out.println( a - b ); break; ... Es el mismo que el original, solo "olvidamos" de agregarle un break al final de la alternativa suma. Si cambiamos el valor de op por el carcter '+' y ejecutamos el programa, nos responde de esta manera: El resultado es : 2 0 Nos dio los resultados de la suma y la resta. Al no tener un break en la suma, se pas de largo y ejecuto la de abajo , que justamente era la resta. En algunas circunstancias, el break est de mas. Es posible contruir una estructura en donde se ejecuten mas de una alternativa al mismo tiempo. Vemos un ejemplo: public class Lineas{ public static void main(String args[]){ int j = 2; switch (j) { case 5: System.out.println("********"); case 4: System.out.println("********"); case 3: System.out.println("********"); case 2: System.out.println("********"); case 1: System.out.println("********"); } } } El programa tiene por objetivo listar un nmero dado de lneas. Se pueden dibujar hasta 5 lneas trazadas con el smbolo *. La cantidad depender del valor de la variable j. Por ejemplo, si j vale 2, activa la alternativa que tiene
38
Programacin en Java/Sentencia switch esta constante y como no tiene un break que la obstaculice sigue con la alternativa de abajo.
39
Programacin en Java/Operador if-else Se han utilizado los parntesis debido a que su orden de precedencia es bajsima. De otra forma se hubiera evaluado la resta antes de las selecciones.
40
Programacin en Java/Estructuras de iteracin Realicemos un programa que transforme un nmero decimal en binario. En la vida real, para hacer esto, realizamos sucesivas divisiones por 2 al numero decimal. A cada divisin tomamos el resto y continuamos hasta que el resultado sea cero. Por ejemplo: Tenemos que pasar el nmero 25 a binario 25 12 6 3 1 mod mod mod mod mod 2 2 2 2 2 = = = = = 1; 0; 0; 1; 1; 25 div 2 = 12; 12 div 2 = 6; 6 div 2 = 3; 3 div 2 = 1; 1 div 2 = 0;
41
(NOTA: en java actualmente se usa el signo "%" para hacer el mod) El resultado es 11001 En general, no sabemos cuantas divisiones tendremos que realizar. Pero si sabemos que debemos llegar a cero con la divisin. Las tareas que repetimos son las de tomar el resto y el resultado de la divisin. Con estos datos en mente, podremos realizar un algoritmo. DECIMAL = 25; Mientras que DECIMAL > 0 : BINARIO = DECIMAL % 2 + BINARIO; DECIMAL = DECIMAL / 2;
Programacin en Java/Sentencia while boolean prueba = true; while ( prueba ) { System.out.println("Esto lo vers muchas veces"); } Generalmente esta estructura se utiliza en situaciones en donde desconocemos la cantidad de ciclos que se deben ejecutar para producir un resultado. Mostraremos como se utiliza en estas circunstancias con el ejemplo de pase a binario, mostrado en el captulo anterior. Tenamos que transformar un nmero decimal a binario. El programa en java nos queda de esta manera: public class Dec2Bin{ public static void main(String args[]){ int decimal = 252222; String binario = ""; while ( decimal > 0 ) { binario = decimal % 2 + binario; decimal /= 2; } System.out.println(binario); } } Como no sabemos de antemano cuantas vueltas debe dar, simplemente esperamos que el resultado de las divisiones sucesivas sea igual a cero. Tambin se pueden realizar ciclos con while en donde ya conocemos, antes de entrar en la estructura, cuantas vueltas debe dar para terminar. Para esto nos auxiliamos con un contador de vueltas. Previamente tiene que inicializarse antes de ingresar al ciclo. Luego en cada vuelta se modificara segn la lgica del algoritmo. Realicemos el programa que despliegue por pantalla cinco lneas de caracteres. public class Cuadrado{ public static void main(String args[]){ int contador = 1; while ( contador <= 5 ) { System.out.println("*****"); contador++; } } } En este algoritmo, inicializamos el contador a 1 y luego en cada ciclo se incrementa. La condicin de corte tiene como objetivo no permitir mas vueltas si el contador super el valor 5. Para tener varias veces el asterisco sin necesidad de imprimirlo asi "*****", utilizamos otro ciclo while y otra variable que inicializaremos dentro del ciclo para que se cumpla la cual llamaremos "contador2", obtendremos el mismo resultado que el anterior, el codigo quedaria asi: public class Cuadrado { public static void main (String args []) { int contador = 1;
42
Programacin en Java/Sentencia while while (contador <= 5) { int contador2 = 1; while (contador2 <= 5) { System.out.print ("*"); contador2++; } System.out.println (); contador++; } } } (copian la parte que queda fuera del recuadro punteado al principio, y la llave que queda fuera al final del mismo, lo pegan en ready to program y lo corren)
43
Programacin en Java/Sentencia do-while Qu ocurre si el nmero que nos dan es el cero? El resultado nos dar cero. Obviamente es errneo, debera devolver un dgito. Pero no entra en el ciclo debido a que de entrada no satisface la condicin. Podramos implementar una solucin "ad hoc". nmero /=10; dgitos++; while ( nmero > 0 ) { nmero /=10; dgitos++; } Realizamos primeramente las operaciones y luego entramos en el bucle si se verifica la condicin. Pero no hace falta mirar mucho para darnos cuenta que es una solucin poco elegante. En realidad quedar mejor con la sentencia do-while public class CuentaDigitos{ public static void main(String args[]){ int nmero = 4557888; int dgitos = 0; do { nmero /=10; dgitos++; } while ( nmero > 0 ); System.out.println(dgitos); } }
44
45
Pero ya conocemos las estructuras que nos ahorran el esfuerzo de escribir tanto cdigo. Utilizaremos una sentencia que ya conocemos: el while int factor = 1; while ( factor <= 9 ) { System.out.println("3 x " + factor + " = " + 3*factor ); factor++; } Utilizamos la variable factor para contar la cantidad de lneas que imprimimos. Primeramente la inicializamos en uno. Cuando se ejecuta la interaccin se controla que no supere su valor de 9. Si el valor es menor o igual que nueve, imprime una lnea de la tabla e incrementa a uno el valor de factor. Cualquier caso de interaccin que se complete en una cantidad prefijada de ciclos, necesitamos una variable de control. Si utilizamos la sentencia while, esta variable se debe definir e inicializar antes del bucle y contar con una instruccin que modifique su valor dentro del bucle. Veremos como este cdigo cambia ligeramente si en lugar de while presentamos una nueva sentencia denominada for for ( int factor = 1; factor <= 9; factor ++ ) { System.out.println("3 x " + factor + " = " + 3*factor ); } la sentencia for me permite repetir un ciclo n veces, en donde se debe determinar el valor inicial y cuantas veces se repetira. sintaxis
for({valor inicial};{condicin de termino};{factor de incremento del valor inicial}){ //ac va lo que se repetir n veces de acuerdo a la condicin de termino }
Programacin en Java/Sentencia for Operador coma : for ( int k=1, j=10 ;k < j ;k++ ,j-- ){ System.out.println(k + " " + j); }
46
for mejorado
Supongamos que tenemos un arreglo de enteros que deseamos presentar en pantalla, usando la orden for tradicional, el cdigo, podra quedar as: int[] laiEnteros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i = 0; i < 10; i ++) System.out.println (laiEnteros[i]); Java ofrece una funcionalidad extra para la orden for, mediante la que se puede simplificar notablemente el codigo anterior, quedando as: int[] laiEnteros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int liElemento : laiEnteros) System.out.println (liElemento); En este caso, liElemento toma el valor de cada uno de los elementos de laiEnteros, permitiendo una navegacin ms simple, puesto que se evitan posibles errores derivados del uso de los arreglos en forma directa. Tambin se puede usar esta forma, para estructuras ms complejas como objetos de la clase Collection public void Presenta (Collection <Integer> poConjunto){ for (Iterator <Integer> loElemento : poConjunto) System.out.println (loElemento) }
47
48
Programacin en Java/Funciones
Queremos depositar todo nuestro dinero ganado como programadores. Hay dos bancos que compiten por nuestros dividendos. El primero, lo llamamos "Banco A", nos ofrecen un inters con una tasa mensual del 1 % mas una bonificacin final del 5%. El segundo, el "Banco B", nos ofrece una tasa del 1,5 %. Como buenos programadores realizamos un algoritmo para obtener el mayor beneficio. El programa calcular el monto obtenido en un perodo de 12 meses con un clculo de inters compuesto. Para darnos una mejor idea de lo que tenemos que hacer realizamos el algoritmo principal. monto = 10000; meses = 12; for ( int n = 1; n <= meses; n++){ monto = monto + monto * inters / 100; } Al monto inicial le sumamos las sucesivas capitalizaciones que ganamos mes a mes, hasta llegar a un perodo de 12 meses. Con este algoritmo probado, realizamos el programa: public class ShowMeTheMoney{ public static void main(String args[]){ int meses = 12; float interesBanco1 = 1f; float bonificBanco1 = 5f; float interesBanco2 = 1.5f; double monto = 10000; double montoBanco1 = monto; double montoBanco2 = monto; for ( int n = 1; n <= meses; n++){ montoBanco1 += montoBanco1 * interesBanco1 / 100;
Programacin en Java/Funciones } montoBanco1 += montoBanco1 * bonificBanco1 /100; for ( int n = 1; n <= meses; n++){ montoBanco2 += montoBanco2 * interesBanco2 / 100; } System.out.println("Importe final del banco1 : " + montoBanco1); System.out.println("Importe final del banco2 : " + montoBanco2); } } Si observamos el cdigo, notaremos que repetimos el mismo algoritmo por cada banco. Esto ocurrir cada vez que tengamos que realizar un clculo de intereses. Si la eleccin se extendiera a, por ejemplo, cinco bancos, tendramos que copiar el algoritmo para cada uno de ellos. Para no tener que repetir una y otra vez lo mismo, podemos recurrir a una tcnica muy utilizada en programacin: dividir el cdigo en funciones. Una funcin es un conjunto de instrucciones que ejecutan una rutina y devuelven un resultado. El resultado puede depender de parmetros de entrada. Un funcin se construye de la siguiente manera: tipo_resultado nombre_funcin (tipo_parmetro nombre_parmetro, ... ) { sentencia1; sentencia2; ... sentenciaN; } Se debe definir el tipo de dato del resultado y el nombre que identifica a la funcin. Ademas, opcionalmente se pueden definir parmetros de entrada con el tipo de dato y su nombre. Una funcin permite que reutilicemos un algoritmo. En el caso de nuestro problema bancario, podemos reutilizar el clculo de inters aplicndolo a cada banco. Veamos como se construye esta funcin: double interesCompuesto(double monto, float tasa, int perodos){ for(int n = 1; n <= perodos; n++ ){ monto += monto * tasa / 100; } return monto; } Necesitamos definir ciertos datos de entrada para ejecutar el algoritmo. Vamos a necesitar el monto inicial, la tasa de inters y el perodo. A su vez definimos el tipo de datos del resultado. La funcin nos devuelve el monto final, entonces el tipo de dato es double. Para identificar a la funcin le hemos puesto el nombre de interesCompuesto. Para utilizar la funcin en el programa la llamamos por su nombre. Como esta nos devuelve un resultado, tendremos que almacenarlo en una variable que tenga un tipo de dato compatible con el resultado. double montoBanco2 = interesCompuesto(10000 , interesBanco2, meses); Debemos pasar los parmetros como se han definido, en el mismo orden y con el mismo tipo de dato. Conociendo como se arma y se invoca una funcin, estamos prestos para utilizarla en nuestro programa. public class ShowMeTheMoney2{ static double interesCompuesto(double monto, float tasa, int perodos){
49
Programacin en Java/Funciones for(int n = 1; n <= perodos; n++ ){ monto += monto * tasa / 100; } return monto; } public static void main(String args[]){ int meses = 12; float interesBanco1 = 1f; float bonificBanco1 = 5f; float interesBanco2 = 1.5f; double monto = 10000; double montoBanco1 = monto; double montoBanco2 = monto; montoBanco1 = interesCompuesto( montoBanco1, interesBanco1, meses ); montoBanco1 += montoBanco1 * bonificBanco1 /100; montoBanco2 = interesCompuesto( montoBanco2, interesBanco2, meses ); System.out.println("Importe final del banco1 : " + montoBanco1); System.out.println("Importe final del banco2 : " + montoBanco2); } }
50
51
Funciones estticas
Supongamos que tenemos una clase de funciones matemticas llamada Calculadora. La misma puede contener mtodos para el clculo de logartmos, cosenos, etc... Es un poco molesto tener que instanciar un objeto de dicha clase para poder utilizar la misma tal y como se muestra en el siguiente ejemplo: Calculadora objetoCalculadora = new Calculadora(); float resultado = objetoCalculadora.logaritmo(33.4); Para solucionar esto podemos crear funciones estticas. Estas funciones pueden ser invocadas utilizando directamente la clase, no un objeto instancia de la misma. Para ello basta aadir el atributo static a la funcin. En el caso anterior: class Calculadora { ... float logaritmo(float entrada){ float resultado; ... return resultado; } } Entonces el ejemplo anterior se simplifica y queda simplemente como: float resultado = Calculadora.logaritmo(33.4); No se debe abusar de las funciones estticas ya que entonces perdemos la orientacin a objetos de Java. Debe ser el sentido comn quien nos indique cuando realmente merece la pena utilizar las mismas. Un ejemplo donde suele ser conveniente crear funciones estticas es en las "fbricas" de objetos. Las fbricas de objetos crean y retornan un nuevo objeto de forma similar al constructor de una clase, pero teniendo en cuenta el contexto de la aplicacin. Las fbricas de objetos al tener informacin sobre el contexto/estado de la aplicacin pueden realizar tareas que un constructor no es capaz. P.ej, la conexin por red suele estar asociada a un objeto. Las creacin de una nueva conexin por red es un proceso lento (en comparacin a la velocidad de proceso de una CPU moderna) y es mejor reutilizar conexiones de red creadas anteriormente antes de crear una nueva. En tal caso creamos una fbrica de conexiones con una funcin esttica getNuevaConexion: class FabricaDeConexiones { static java.util.ArrayList listaDeConexiones = new java.util.ArrayList(); static void Conexion getNuevaConexion(){ for (int indice=0; indice<listaDeConexiones.size(); indice++){ if listaDeConexiones.get(indice).estaLibre = true { return listaDeConexiones.get(indice); } } Conexion nuevaConexion = new Conexion(....);
Programacin en Java / Parmetros de una funcin listaDeConexiones.add(nuevaConexion); } } En el ejemplo anterior FabricaDeConexiones.getNuevaConexion() consulta un listado de conexiones. Antes de crear una nueva conexin recorre el listado de conexiones ya existentes y si hay alguna conexin libre devuelve la misma antes de crear una nueva. As en vez de utilizar el cdigo: Conexion miConexion = new Conexion(); lo reemplazamos con: Conexion miConexion = FabricaDeConexiones.getNuevaConexion(); que ser mucho ms rpido y fiable.
52
Buenas prcticas
En algunos lenguajes sin soporte para excepciones es comn utilizar un entero como valor de retorno para indicar si hubo o no error. En general 0 significa que no paso nada y un valor distinto de cero indica un error. En Java (y cualquier otro lenguaje con control de excepciones) es una mala prctica utilizar un entero para devolver un error. Es mejor generar y lanzar un objeto excepcin para indicar un error en la funcin. Es fcil olvidar comprobar el valor retornado de una funcin, especialmente si la funcin invocada pertenece a una librera y va a ser utilizada por terceros que pueden NO ser conscientes de que la funcin devuelve error. Entonces el error quedara oculto y se manifestara aleatreamente en otra parte del cdigo haciendo muy difcil su depuracin y mantenimiento. En vez de escribir: int imprimeTodo(String nombre, String apellido1, if (nombre ==null || nombre =="") return if (apellido1==null || apellido1=="") return if (apellido2==null || apellido2=="") return String apellido2){ 1; 2; 3;
if (apellido1==null || apellido1=="") errores += "apellido1 no puede ser nulo/vacio,"; if (apellido2==null || apellido2=="") errores += "apellido2 no puede ser nulo/vacio,";
Programacin en Java / Parmetros de una funcin El valor de los parmetros enviados a la funcin deben comprobarse antes de ejecutar la lgica de la funcin. Si los mismos no son vlidos debe lanzarse una excepcin e interrumpir la ejecucin de la misma. Esto ayuda a detectar errores y hace el cdigo ms comprensible y fcil de leer.
53
Programacin en Java/Funciones recursivas } } La misma funcin en forma iterativa: public class Factoriales{ static int factorial(int numero){ int resultado = 1; while(numero > 0){ resultado = resultado*numero; nmero--; } } public static void main(String args[]){ System.out.println(factorial(5)); } } Como puede observarse, la funcin iterativa slo recorre un bucle while, mientras que la recursiva invoca un mtodo nuevo hasta que nmero vale 1 (Esto requiere un trabajo considerablemente mayor por parte del ordenador). La recursin es por lo tanto una potente herramienta en programacin, pero hay que saber diferenciar cuando es til y cuando no.
54
Recursin mutua
Este en un ejemplo de recursin mutua. Se trata de un programa que devolver true o false si el parmetro nmero es respectivamente, impar o par (en el caso de que invoquemos la funcin impar(nmero)). public class Paridad{ public static boolean impar (int numero){ if (numero==0) return false; else return par(numero-1); } public static boolean par (int numero){ if (numero==0) return true; else return impar(numero-1); } } Al leer el cdigo de una sola de las funciones, no se aprecia la recursin pero existe igualmente.
55
6. Los perros corren. 7. Los perros duermen. 8. Algunos perros tienen pulgas. 9. Algunos perros tienen dueo. 10. Algunos perros tienen nombre. Bueno, vamos a dejar tranquilos a los perritos hasta aqu, y ahora explicar el por que enumere estas caractersticas de nuestros amigos caninos. En primer lugar podemos darnos cuenta que "el objeto perro" tiene caractersticas (1, 2), puede realizan acciones (3, 4, 5, 6, 7) y tienen cierto tipo de relacin con otros objetos (8, 9). Ahora no perdamos el detalle, de que ningn perro es igual a otro, es decir, aunque compartan caractersticas, no todos perteneceran a la misma raza, o al mismo dueo, o no viviran en el mismo lugar, etc. Es aqu cuando surge algo llamado "Clase". Todos los perros del mundo, pertenecen a la "Clase Perro". Y cada uno de los perros es en si un "Objeto Perro", que pertenece a la "Clase Perro". Ahora profundizando un poco mas en estos trminos. Cuando uno programa con Java, lo que principalmente hace es crear clases, de las cuales se crean objetos. Un cdigo de ejemplo para entender esto seria: class Perro{ String nombre; String raza; boolean pulgas; } Perro perrito1=new Perro(); Perro perrito2=new Perro();
Programacin en Java/Clases
56
Programacin en Java/Clases
Introduccin
La programacin orientada a objetos (POO), se rige por ciertos principios de desarrollo de software que permiten una implementacin limpia, segura y entendible de los programas. Dentro de la limpieza, eficiencia y calidad que exige el desarrollo de software mediante la programacin por objetos, se encuentran las Clases. Las Clases comprenden el estilo de diseo e implementacin ms utilizado en el modelado por objetos, aunque no es el nico. Para empezar a utilizar Clases, entender su funcionamiento y como consecuencia, su utilizacin e importancia, es necesario recordar algunos principios bsico de la Programacin en Java. En el lenguaje Java existen distintos Tipos. Un Tipo es, como su nombre lo indica un "tipo" de elemento programable ya definido dentro del lenguaje. Los principales Tipos Primitivos de Java son: boolean (falso o verdadero), byte, short, int, float, double, long y char. Ahora pensemos un momento: qu sucede si necesitamos representar o utilizar en nuestros programas "Tipos" no definidos? qu sucedera si lo que necesito guardar o manipular es la informacin de una persona? cmo manejo fechas? cmo declaro horarios? cmo represento un auto? Son muchas las preguntas que se responden mediante la implementacin de la programacin de Clases.
Definicin
Una Clase puede considerarse como la representacin programada de un objeto o situacin real y existente del mundo cotidiano. Las Clases son la forma abstracta de manejar la informacin de manera computacional. Mejor veamos un ejemplo muy sencillo: Si un programador necesita manejar la informacin de los clientes de la empresa para la cual trabaja, sera muy incdomo estar declarando, inicializando y manipulando mil nombre, mil apellidos, mil direcciones, mil nmeros de telfono, mil nmeros de identificacin, mil ... La solucin que plantea la POO es la utilizacin de Clases para representar aquellos elementos o tipos no pertenecientes al lenguaje mismo de programacin. Pues de hecho no existe un tipo primitivo que se llame "cliente". La solucin exacta que se propone es crear todos los tipos necesarios a partir, o mediante la utilizacin, de los tipos ya existentes. En este caso en particular, debemos utilizar los tipos primitivos de Java para crear nuestro propio "Tipo" (Clase). Si desea ms informacin, especficamente tcnica, puede visitar el sitio: http:/ / es. wikipedia. org/ wiki/ Clase_(inform%C3%A1tica)
Implementacin en Java
Ya es momento de ver cmo funcionan las clases en Java. Para nuestra primera implementacin vamos a utilizar el ejemplo anterior. Supngase que necesitamos manejar la informacin de n cliente, si tomamos en cuenta que necesitamos n nombres, n apellidos, n edades, y n elementos de cualquier tipo de informacin que deseemos almacenar o manipular con respecto al cliente, hara muy tedioso y sucio (computacionalmente hablando) el trabajo con la informacin, las variables, y por ende el programa en general. 1. Primero debemos analizar qu tipo de informacin queremos manipular con respecto al cliente:
57
2. Ahora debemos analizar el tipo primitivo o no primitivo que vamos a asignarle a cada elemento de informacin de nuestro cliente:
a. Nombre b. Apellido c. Identificacin Es una cadena de caracteres, String Es una cadena de caracteres, String Es un valor numrico, int (otros programadores podran usar String)
3. Ahora pensemos en las funciones (la funcionabilidad) que queremos darle a nuestros clientes, eso es, por ejemplo, que podamos ver su nombre, cambiar el nombre, ver edad, etc:
a. ObtenerNombre b. PonerNombre c. ObtenerApellido d. PonerApellido e. ObtenerID f. PonerID Nos dara el nombre del cliente Nos permite cambiar o poner el nombre del cliente Nos dara el apellido del cliente Nos permite cambiar o poner el apellido del cliente Nos dara la identificacin del cliente Nos permite cambiar o poner la identificacin del cliente
Explicando lo anterior, tenemos que: tipoFuncion: especifica el grado de encapsulamiento que le vamos a dar a nuestra funcin, o sea, que tan accesible va a estar para el programa. Existen dos tipos principales de funciones en Java; public, o sea, de acceso pblico, queriendo decir que puede ser llamada o invocada por cualquier entidad dentro o fuera de la clase. El tipo private indica una exclusividad mayor de funcionabilidad, lo que quiere decir que solamente puede ser invocado, en condiciones normales, dentro de otra funcin. tipoValorDevolver: indica el tipo de elemento que deseamos obtener de nuestra funcion. Por ejemplo, si deseamos saber el nombre de un cliente usamos como tipoValorDevolver un String o cadena de caracteres. nombreFuncion: corresponde al nombre que el programador quiere darle a la funcion. elementosUtilizadosPorLaFuncion; corresponde a todos los elementos que necesita la funcin para trabajar adecuadamente. Ejemplo sencillo, para poner el nombre de un cliente necesitamos una String como elementoUtilizadosPorLaFuncion. operacionesRealizar: corresponde a las operaciones matemticas, lgicas o computacionales en genera que se deseen aplicar a la informacin de la clase y a su contenido en s. 4. Definidos los tipos y funciones, pasamos a la declaracin e implementacin de la Clase: (Recuerden que se utiliza cdigo en Lenguaje Java) public class Cliente { String nombre; String apellido;
58
Programacin en Java/Objetos
59
Programacin en Java/Objetos
Un objeto es la instancia de una clase. Por ejemplo, si tenemos una clase perro definida de la siguiente manera: public class Perro { private String color; el color del perro private int numPatas; numero de patas
public Perro(String col, int numP) // cabecera del constructor de la funcion { color=col; // ponemos los valores que nos pasan por parametro a las variables del objeto numPatas=numP; } } Una instancia de la clase sera un perro en particular: Perro snoopy = new Perro("blanco", 4); En este caso estamos definiendo una nueva instancia de la clase "Perro" que llamamos snoopy, que definimos con pelo blanco y 4 patas (si, segn esto podramos crear perros o aberraciones de la naturaleza con otro nmero, XD).
Programacin en Java/Encapsulamiento
60
Programacin en Java/Encapsulamiento
Java, como lenguaje orientado a objetos puro que es, implementa la encapsulacin (o encapsulamiento) perfectamente. Este concepto consiste en la ocultacin del estado, o lo que es lo mismo, de los datos miembro de un objeto, de forma que slo es posible modificar los mismos mediante las operaciones (mtodos, en Java) definidos para dicho objeto. Cada objeto est aislado del exterior, de forma que la aplicacin al final es un conjunto ms o menos extenso de objetos que colaboran entre s mediante el paso de mensajes entre ellos, es decir, mediante la invocacin de sus operaciones o mtodos. De esta forma, los detalles de implementacin permanecen "ocultos" a las personas que usan las clases, evitando as modificaciones o accesos indebidos a los datos que almacenan las clases. Adems, el usuario de la clase no se tiene que preocupar de cmo estn implementados los mtodos y propiedades, concentrndose slo en cmo debe usarlos. La encapsulacin es una de las principales ventajas que proporciona la programacin orientada a objetos.
Programacin en Java/Herencia
La herencia es un principio fundamental de la Programacin Orientada a Objetos (POO) ya que esta permite la creacion jerarquias. Con el uso de la herencia puedes crear una clase general para definir los atributos comunes de objetos relacionados.
Programacin en Java/Polimorfismo
Son muchas formas de implementar un mismo metodo. Es La posiblilidad de utilizar una misma expresion para invocar a diferentes versiones de un mismo mtodo
61
Constructores
Los ms utilizados son: Constructor por defecto: String s = new String(); Crea un objeto de tipo String y lo inicializa a "vacio". String s = new String("texto"); Es un constructor que recibe como parmetro una cadena de texto, guardndola en la variable (da igual el tamao de dicha cadena).
Mtodos
Algunos de los mtodos ms utilizados son: Mtodo charAt, que recibe un entero como parmetro y devuelve el carcter que ocupe dicha posicin en el objeto String que lo invoque. Ejemplo con el String s de los ejemplos del constructor: char a = s.charAt(2); En la variable a, quedara guardado el carcter 'x'.
Enlaces
Puedes consultar esta clase en el manual original en ingles aqu [1]
Referencias
[1] http:/ / java. sun. com/ javase/ 6/ docs/ api/ java/ lang/ String. html
62
63
64
65
Programacin en Java/Applets
import java.io.*; import java.util.*; class CascaronIO { public static void main(String[] args) throws IOException,NumberFormatException { BufferedReader teclado=new BufferedReader(new InputStreamReader(System.in)); PrintStream pantalla=System.out; //aca va nuestro programa a partir de esta linea }}
Palabras clave
abstract boolean Tipo de variable break byte Tipo de variable case Sentencia switch catch char Tipo de variable class const (sin uso) continue default
Programacin en Java/Palabras reservadas else Sentencia if-else extends final La variable final finally float Tipo de variable for goto (sin uso) if Sentencia if-else implements import instanceof int
66
Tipo de variable interface long Tipo de variable native new package private protected public return short Tipo de variable static strictfp super switch Sentencia switch synchronized this throw throws transient try
Programacin en Java/Palabras reservadas true (literal booleano) Literales boolean false (literal booleano) Literales boolean null (literal nulo)
67
68
69
70
Licencia
71
Licencia
Creative Commons Attribution-Share Alike 3.0 Unported http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/