En esta ocasión les muestro como usar un HashMap en Java. Es una estructura dinámica que permite administrar eficientemente pares de datos: una llave y su valor asociado.
Java, a diferencia de lo que pensaba, no tiene una función para determinar si un texto es un número válido. En muchas situaciones este es muy útil, así que aquí hice un pequeño video donde te muestro una función que hace precisamente eso.
Si quieres bajar este código (aunque sea muy simple y de pocas líneas), esta es la liga.
Hace mucho tiempo escribí sobre diferentes paradigmas de programación e hice una introducción a la programación orientada a objetos en C++. Ahora vuelvo a tomar la idea para enfocarlo a la programación en Java y, para que sea más fácil de entender, preferí hacerlo en una serie de videos, mismas que presento aquí en orden.
El primer video habla sobre lo que es la programación orientada a objetos en general. Da bases para hablar de conceptos posteriores.
El segundo video habla sobre lo que son las clases y objetos y da un ejemplo cómo usarlos en Java.
Y en éste tercer (y último) video, se ejemplifica lo descrito en Java.
Algo que es muy importante para cualquier programa o aplicación, es poder leer y escribir a archivos. De otra manera, nuestra información se pierde al apagar la computadora.
En Java se puede leer de y escribir a archivos de diferentes maneras. En el video que presento, usé streams (concretamente un FileInputStream) para leer los datos de un archivo MP3 y obtener la información sobre la canción, si es que se almacenó.
Aquí les presento el video y abajo hay una liga para descargar el código fuente.
La imagen de Duke (la mascota de Java) tocando la guitarra lo tomé del blog de La Playina del Norte y la idea de este proyecto surgió del siguiente libro:
Antes que nada, hay que tener la imagen que deseas poner en la ventana (o JFrame como dijimos antes). Lo puedes dibujar en Paint, Photoshop o bajar de internet. En mi caso bajé esta imagen de dos carros que luego giré en las 4 direcciones (arriba, abajo, izquierda y derecha) para tener el total de 8 imágenes:
Luego estas imágenes se tienen que copiar a la carpeta donde está tu proyecto, dentro de la carpeta /build/classes donde es el nombre que le asignaste al proyecto hecho en NetBeans.
Ahora para dibujar una de estas imágenes en la ventana, el código necesario antes de dibujar la imagen (en el constructor, por ejemplo) es algo como este:
Luego para dibujar la imagen, usa este código (que debe reemplazar el dibujo de los 2 rectángulos con los que estábamos representando a los carritos hasta ahora):
g.drawImage(img,x,y,this);
Obviamente, x y y son las coordenadas de la esquina superior derecha de la imagen (en nuestro caso, son las del Rectangle p1 y p2) y this hace referencia a la ventana actual (el JFrame donde está todo).
Para que todo esto funcione, se tiene que incluir al principio de la clase este import (para la clase URL):
import java.net.*;
¡Y listo! Con eso debería quedar. En el video mostraré el código que usé en este proyecto, mismo que puedes descargar aquí.
Audio en Java
Es muy sencillo poner audio en formato WAV (el método aquí descrito no funciona para MP3). Al igual que con las imágenes de mapa de bits, hay que copiar el o los archivos a la carpeta donde está el proyecto.
Después de esto, deberá ingresar un código como este:
Como se podrá suponer el lector archivo.wav es el nombre del archivo que se copió a la carpeta del proyecto. Las instrucción sonido.loop() hace que el sonido suene y cuando termine vuelva a sonar y así repetir indefinidamente hasta que se termina el programa. Si desea que solo suene una vez, en lugar de eso escriba sonido.play().
No olvides de importar la librería con import java.applet.AudioClip.
Explicación en video
Aquí les dejo el video donde comento los cambios realizados al proyecto. El código fuente del proyecto final se puede descargar aquí.
¿Y qué sigue?
Hay mil cosas que se podrían hacer para que este proyecto quedara mejor. Se puede crear una imagen que diga las instrucciones al entrar al juego, se pueden contar el número de vueltas que da cada jugador (revisando si el rectángulo del carro hace colisión con el rectángulo de la meta y que va en dirección UP) y que gane el primer jugador en completar 3 vueltas. Pero eso ya lo dejo para que sea implementado por el lector.
Agradecimientos
La pintura hecha en una oficina de Duke (la mascota de Java) con un rubí, lo tomé del blog de JRuby. Y como ha sucedido con los posts del proyecto de la carrera de carros, las ideas principales salieron de este libro:
Hemos estado trabajando con un proyecto en Java que dibuja una pista de carreras (no muy estético, pero funcional) y luego usamos threads para mover 2 carros. Hasta allí todo bien, pero no muy divertido que digamos. Por eso, en este post, vamos a hacer dos cosas: detectar colisiones (para que los "carros" no puedan pasar por los obstáculos ni por encima del otro carro) y escuchar eventos del teclado para poder controlar los carros. En pocas palabras, nuestro juego por fin va a ser funcional.
Pero como dijo Jack el destripador, vámonos por partes: primero vamos a ver que onda con la detección de colisiones y luego veremos que onda con el teclado. Así que sin más preámbulos, arrancamos...
Colisiones
Hacer la detección de colisiones (en otras palabras, ver si un objeto "choca" con otro) es bastante sencillo en Java cuando se usan objetos de la clase Rectangle (por eso los usamos desde el primer momento: era más sencillo dibujar sin ellos, pero nos sirven en este momento) porque tiene un método que revisa si hay colisión. Este método se llama intersects.
Digamos que quiero saber si el Rectangler1 se intersecta (o colisiona) con un Rectangle r2, puedo usar el siguiente código:
if (r1.intersects(r2)) {
// Código que se ejecuta si hay colisión
}
Y como podrán imaginar, para revisar múltiples colisiones, puedo usar el operador booleano AND (representado como &&) para ver si dos condiciones se cumplen o el operados OR (representado como ||) para ver si uno de los dos condiciones son verdaderos.
Por ejemplo, si quiero ver si el rectángulo r1 chocó con el rectángulo r2 o el r3, usaría este código:
if (r1.intersects(r2) || r1.intersects(r3)) {
// Código que se ejecuta si choca con r2 o con r3
}
Esta imagen muestra si hay colisiones entre rectángulos (en otras palabras, si se intersectan):
Escuchando el teclado (KeyListener)
Ya en un post anterior hablé sobre "escuchar" eventos en Java (incluyendo el teclado), pero aquí me concentraré solo en el teclado para completar este proyecto. Si desea profundizar, sugiero que vea el post Interfaces gráficas 4: Escuchando eventos.
El KeyListener permite recibir lo que ha escrito el usuario en el teclado. Para usarlo, es necesario agregar, al final de la línea de "public class ..." lo siguiente (esto también aplica para clases internas como las que hicimos en los threads del post anterior):
implements KeyListener
Después de esto, en el constructor (o el método run si estás en un thread), hay que agregar el siguiente código para "despertar" al KeyListener y ponerlo a trabajar:
addKeyListener(this);
Recuerda que el this asocia los eventos que "escucha" del teclado a esta clase.
Después de esto, hay que agregar 3 métodos a la clase
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) { }
Estas funciones, al igual que el paint del que hablamos en el primer post de esta serie, son ejecutadas de forma automática: el keyPressed se llama cuando se presiona una tecla, el keyReleased se ejecuta cuando el usuario quita el dedo de la tecla y ésta se levanta y el keyTyped ocurre cuando el usuario presiona y suelta la tecla. El mas usado de los tres es el keyTyped, que es precisamente el único que vamos a codificar en este ejemplo.
Finalmente, para saber qué tecla presionó el usuario, uso el código:
e.getKeyChar()
(Si te fijas, e es el parámetro que viene en los métodos y es objeto de la clase KeyEvent que tiene información sobre lo que se ha tecleado).
Integrando este rollo con el proyecto
Como explico con más detalle en el video, voy a crear variables para indicar la dirección del carrito: si vale 0 el carrito viaja hacia arriba, 1 a la izquierda, etc. Para hacerlo más fácil, los voy a hacer constantes porque no quiero que se modifiquen en el código (usando la palabra final al declararlos).
Después de esto, voy a usar el KeyListener para cambiar la dirección del carrito del jugador. También vamos a hacer que el rumbo del carrito cambie al alterar la coordenada x si se mueve hacia la izquierda o derecha y la coordenada y si va hacia arriba o abajo.
Finalmente hay que revisar si el usuario no chocó con un obstáculo o con el otro jugador. Si sucede, vamos a poner la velocidad del jugador en un valor negativo para que el carro retroceda hasta "agarrar vuelo".
Aquí les dejo el video donde lo explico y el código fuente completo (bueno, completo hasta este momento) lo pueden descargar aquí.
Agradecimientos
La imagen de Duke evitando colisiones en patineta lo tomé del blog de CPU y la de los rectángulos que se intersectan son de una página de Tufts University. Y como ha sucedido con los 2 posts anteriores, la idea vino de este libro:
En mi post anterior dibujamos una pista de carreras rudimentaria con rectángulos usando Java. Pero, ¿de qué sirve una pista sin carros? Eso mismo pensé, así que en esta ocasión vamos a añadirle código al proyecto anterior para que podamos tener dos carritos moviéndose de forma independiente una de otra.
La mejor manera de hacer que cada carro se mueva de forma independiente a la ejecución del resto del programa es usar algo llamaos hilos o threads como se conocen en inglés. Cada thread es un código (o "flujo de control" para que se oiga más interesante) que se ejecuta en paralelo con el resto del programa (o con otros threads). Es la forma de implementar multiprocesamiento en un programa de Java (¿nunca han escuchado de multithreading cuando hablan de sistemas operativos?).
Para crear un thread, lo vamos a implemtar como una clase que está dentro de la clase principal (en el caso de este ejemplo, va a ser una clase dentro de mi clase RaceGame). Lo único que hay que cuidar es que herede de la clase Thread. El código de declaración de la clase interna sería esta:
public class extends Thread {
}
Como has de imaginar, puede ser cualquier cosa menos el nombre de la clase en la que está declarado (recuérdate que lo estoy implementando como una clase dentro de la otra clase). En mi caso, declaré dos clases de este tipo (una para cada carrito) llamados moveCar1 y moveCar2.
El corazón de un thread es el método run(). Aquí es donde se define el código que se va a ejecutar. En mi caso concreto voy a mover un carro y lo voy a poner dentro de un ciclo infinito para que siempre esté moviéndose. Un ciclo while(true)me sirve para este fin.
Para hacer mi programa mas seguro, voy a poner mi código dentro de un bloque try...catch. El código que ponga después de la instrucción try se va a ejecutar, pero si hay algún problema va a hacer lo que le diga en la sección catch. De otra forma, mostraría error y truena mi programa. Lo que he dicho hasta ahorita se vería así:
while (true) {
try {
// código para mover el carrito
} catch (Exception e) {
break;
}
}
Como podrá observar el lector, si sucede un error simplemente lo ignoro (con el break). A lo mejor en otro tipo de programa podría poner código aquí para cerrar bases de datos, liberar memoria, o intentar otra cosa. Pero en este programa simplemente voy a hacer de cuenta que nada pasó. Y como el lector podrá deducir, en lugar de lo que va en el comentario // código para mover el carrito debe ir el código que haga que se mueva el carro.
Finalmente para que el Thread se ejecute, es necesario crear el objeto y llamar su método start(). Así que en el constructor de la clase principal, en mi caso RaceGame, voy a escribir lo siguiente:
moveCar1 mc1 = new moveCar1();
mc1.start();
En este video muestro lo que expliqué aquí (con los cambios que realicé en el código del proyecto anterior) y el código modificado lo puedes descargar aquí.
La imagen de Duke (la mascota de Java) con hilos (o Threads) lo tomé de una página de crunchify.com. Y, al igual que con el post anterior, la idea de este proyecto surgió de este libro:
Hablando de Java, ya había comentado como hacer interfaces gráficas, usar Layout Managers para ventanas, hacer interfaces complejas, escuchar eventos y hasta como usar un ScrollPane. En esta ocasión voy a hablar de la forma de usar la clase JFrame para dibujar rectángulos en una ventana. Obviamente estos principios pueden ayudarte a dibujar lo que quieras, pero voy a crear una pista de carreras rudimentaria para un juego donde los jugadores podrán controlar unos carritos (rectángulos) a través de esta pista.
Antes de mostrar el video, quiero resaltar algunos aspectos importantes del programa (el código fuente se puede descargar también más adelante).
Antes de hacer otra cosa, para dibujar en un JFrame (el JFrame es la pura ventana vacía), se tiene que incluir en la línea de declaración de la clase. En mi caso concreto, se hace de esta manera:
public class RaceGame extends JFrame
Después de esto, hay que cambiar la función main() para que contenga una línea de código donde se crea el objeto de la clase (lo cual hace que se llame el constructor de la clase). En mi caso concreto se puede hacer de la siguiente forma:
RaceGame g = new RaceGame();
Todo el código necesario para correr tu clase debe estar en el constructor: por esta razón no escribo más código en la función main(). Si tienes dudas con constructores, no dudes en ver este post de mi blog donde lo explico.
Después para dibujar objetos en mi JFrame, es necesario incluir el método paint() en la clase. Es aquí donde se establecen colores y dibujan figuras. Esta función la ejecuta el sistema operativo cada vez que necesita redibujar la ventana.
Aquí les dejo un video que explica el programa hasta esta etapa:
Y si quieren el código, lo pueden descargar de aquí.
La imagen de la pisa de carreras que se está dibujando la tomé de la página de Bit Rebels.
La idea de este proyecto fue tomado de este libro:
Continuando con la forma de programar interfaces en Java (te sugiero que antes de seguir, leas los posts 1, 2, 3 y 4), hoy hice un pequeño video que explica cómo usar la clase JScrollPane.
El código fuente lo puedes descargar aquí y el video lo puedes ver a continuación:
La imagen de Duke en una ventana que usa ScrollPane lo encontré en el sitio de Oracle (está el ejemplo de cómo crear una ventana con JScrollPane).
La saga de programar en Java continúa. En posts anteriores, expliqué como hacer interfaces gráficas muy simples (usando controles simples como botones, cajas de texto, etc.), luego hablé de la manera de usar Layout Managers para controlar cómo se ponen los objetos en pantalla. Anteayer expliqué cómo hacer una interfaz más compleja de una aplicación que hiciera algo útil (aunque me quedé en la interfaz, sin dejar que el programa respondiera).
En esta ocasión preparé un video que continúa con el ejemplo anterior para explicar cómo hacer que nuestra interfaz responda ante eventos generados por el usuario al interactuar con él. El código de lo de los eventos está aquí y el video lo puedes ver a continuación:
La imagen de Duke como Indiana Jones abriendo el cofre del tesoro lo encontré en el blog de sellmic.com.
En esta ocasión sigo trabajando con interfaces gráficas, pero ahora es una interfaz más compleja, más real que los ejemplos anteriores. Uso paneles y varios Layout Managers para llevar a cabo la tarea.
El código fuente del archivo LoteriaGUI.java lo puedes descargar aquí y el video donde explico el código lo puedes ver a continuación:
La imagen de Duke en el columpio (Swing, en inglés) lo copié del sitio de OpenJDKWiki.
En mi post anterior sobre interfaces gráficas en Java, usé un Layout Manager y dije que luego explicaba de qué trata. La hora ha llegado (o bueno, me he dado tiempo de hacerlo) para explicar de qué tratan. Les presento este video donde muestro los diferentes Layout Managers que hay en Java, esperando que les sea de utilidad. Al final vienen las ligas para descargar el código fuente.
Para crear una interfaz gráfica en Java, hay varios detalles que tomar en cuenta. En este video explico las bases para crear uno usando NetBeans. Abajo del video pongo el código fuente de los programas explicados.
Sería útil, antes de ver el video, que tengas claro los conceptos de clases, constructores y de herencia en Java.
El código fuente es este:
Proyecto GUI (un archivo ZIP con toda la carpeta del proyecto de NetBeans, con todos los archivos .java)
Para entender mejor las capacidades de Java como lenguaje de programación, es bueno hacer un tour de diversas aplicaciones que se han escrito en este lenguaje. Esto te puede abrir el horizonte acerca de lo que se puede hacer en este lenguaje tan interesante. Así que, relájate, agarra una taza de café y prepárate para una visita guiada por algunas de las peripecias que se pueden hacer con Java.
Oracle, el Rey
Oracle es la compañía que creó el lenguaje de programación Java, así que es un buen lugar para comenzar. Ellos crearon el sitio en www.java.com y puedes experimentar con diferentes applets que muestran allí (muestran los que ellos creen que son los mejores).
Un programa de Java que corre en un navegador se conoce como applet y se colocan en la página como cualquier otro elemento (si estás familiarizado con HTML, se pone una etiqueta para decir en dónde se va a colocar en la página, el tamaño y el programa que va a ejecutar). También es posible ejecutar aplicaciones Java de otras maneras: aplicaciones escritos en Java en una computadora pueden ser ejecutados por un navegador de internet, y pueden ser ejecutados desde un servidor web (estas aplicaciones son llamados servlets).
Si te interesa algo más técnico de Java, visita www.oracle.com/technetwork/java. Allí encontrarás información para programadores (por ejemplo, sobre las nuevas versiones de NetBeans y el JDK).
Un poco de diversión: Runescape
Una de las categorías de software más complicado de hacer son los videojuegos. Si quieres ver si un lenguaje es potente, intenta hacer un videojuego. Por eso me encontré con una grata sorpresa al encontrar Runescape (www.runescape.com), un MMORPG escrito en Java.
Java y Educación
Como Java permite hacer aplicaciones interactivas, muchos educadores han hecho aplicaciones para ambientes educativos (aunque yo creo que se puede aprender mucho de Runescape, pero en fin). Por ejemplo, Michiel van de Panne, un profesor de computación en la Universidad de British Columbia en Vancouver, Canadá. Como allá les gusta esquiar, hizo una aplicación con la que enseña física con un esquiador que se controla moviendo el mouse sobre el en una de 8 direcciones, mismas que afectan el éxito del salto. La página es www.cs.ubc.ca/~van/sssjava.
Hay muchas otros programas educacionales escritos en Java que son usados en celulares, pero éste solo necesita el navegador: nada de software que instalar, ni nada. Como es solo un tour, no me voy a quedar hablar más sobre educación para seguir adelante.
Java World
Java World (www.javaworld.com) es una revista en línea para programadores de Java donde ofrecen artículos que muestran paso a paso como hacer diferentes cosas, noticias, investigaciones, etc. Es un recurso excelente para aprender como le hacen otros programadores para hacer diferentes cosas: ves el resultado y el código fuente. ¿Podrías pedir algo más?
Viaje a las estrellas
Otros que usan mucho Java es la NASA (si, esos que mandan satélites y cohetes al espacio). Tienen una aplicación, escrita en Java obviamente, llamado SkyWatch (spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/JavaSSOP.html). Esta maravilla sobrepone la ubicación y trayectoria de ocho satélites diferentes sobre un globo terráqueo. Está padrísimo porque redibuja la posición de cada satélite en tiempo real, gracias a que Java es multiprocesamiento: cada satélite es un proceso independiente que se ejecuta sin molestar a los demás procesos.
Negocios con Java
Java no es solamente para diversión, educación y ver las estrellas. También se pueden hacer aplicaciones para el mundo de los negocios y finanzas. Visita la página de JTicker (www.jticker.com), de la compañía Stock Applets, que muestra cabeceras que pasa noticias e información sobre el mercado bursátil. Lo padre de este es que no es necesario instalar software especial: basta el navegador de internet para poder ver la información pasar por el applet. Este applet hace uso de la programación orientada a objetos para funcionar: tiene un objeto de cotización, otro de portafolio, otro que maneja un timer para ir recorriendo el texto de las noticias, entre muchos otros. Para saber más, te recomiendo mi artículo Paradigmas de Programación y muchos objetos en C++ que, aunque fue escrito pensando en C++ y no Java, puede ayudar a entender la forma en que se usan los objetos para resolver problemas.
Controlando el enojo con Java
La última estación de este tour lo puedes realizar en tu teléfono Android (y el un iPhone o iPod u otra iCosa que tengas). Creo que todos los programas para Android (conocidos como Apps) han sido programados con Java. Y uno de las aplicaciones más serias y populares es un juego, que seguramente conoces, llamado Angry Birds (www.angrybirds.com). Si no lo conoces te prevengo: esta app puede impactar tu productividad durante el siguiente mes de que lo descargues.
Termino esta visita con Android porque se está volviendo un lugar muy popular para el uso de este lenguaje. Después que aprendas Java puedes desarrollar tus propias aplicaciones usando el Android Software Development Kit (que es gratuito) que funciona en Windows, MacOS y Linux.
Ya que ando en eso de la historia de los lenguajes de programación (ver mi post anterior con imágenes sobre esta historia), me topé con este sitio web que se encarga de hacer una comparación entre C, C++ y Java.
Aunque hay ejemplos de código y toda la onda, creo que incluso los que son recién iniciados en las artes oscuras y claras de la programación lo pueden entender sin demasiado problemas.
Vagando errabundo por el internet me encontré con esta imagen que resume el desarrollo de los lenguajes de programación. Se me hizo muy interesante en lo particular y como muchos me han preguntado sobre la importancia de los lenguajes, de dónde surgieron, etc., decidí compartirles la imagen. Si haces clic sobre la imagen, te va a llevar a otra página donde lo puedes descargar (es que está muy grande):
Una editorial hizo otra imagen con una línea cronológica del desarrollo de los lenguajes de programación. No me gustó tanto como la imagen anterior, pero lo puedes conseguir aquí si te interesa.
Ojalá te sea útil estos recursos para despejar dudas acerca de como y cuando surgieron los lenguajes de programación y qué lenguajes tuvieron influencia sobre otros. ¡Saludos!
Hace mucho hablé de arreglos y puse un ejemplo hecho en Visual Basic 6.0 (otro ejemplo lo puedes encontrar aquí). También mostré la manera de ordenar datos usando arreglos con el algoritmo Burbuja (los ejemplos los hice en Visual Basic 6, Visual Basic 2005 y C), sin embargo nunca lo hice en Java, así que voy a aprovechar para mostrar como funcionan los arreglos en este lenguaje.
A modo de repaso rápido, un arreglo es una estructura de datos que se componen de datos del mismo tipo. Se hace referencia a ella por medio de un nombre y el número del elemento deseado. Funciona como los asientos numerados de un autobús: el camión tiene un nombre (bueno, origen-destino) y cada asiento tiene un número. De esta manera puedes encontrar a una persona sabiendo el nombre del camión y su número de asiento.
Dejando la explicación breve a un lado, vamos viendo como se hace esto en Java. En Java los arreglos son objetos, así que tienen algunas cosas interesantes que se pueden hacer con ellos (por ejemplo, tienen una propiedad llamada length que devuelve el número de elementos que contiene el arreglo). Como objetos, para declararlos lo hago con la instrucción new como se ve aquí (declaro un arreglo llamado c de tipo entero que tiene 12 elementos):
int c[] = new int[12];
También puedo declarar arreglos poniendo corchetes cuadrados después del tipo de dato. Aquí lo hago y de una vez estoy declarando dos arreglos en la misma línea:
String[] semana = new String[7], meses = new String[12];
Ahora sí, voy a escribir un programa en Java que haga algo con arreglos. Este es el código de un programa que inicializa un arreglo con los resultados de la tabla de multiplicar del 6 (a lo mejor te preguntarás porque la tabla del 6... yo también me hice la misma pregunta y no supe responder :) ):
Al correrlo se ve esto:
Si quiero, puedo inicializar un arreglo en cuanto lo declaro y sirve que no tengo que escribir la instrucción new. Modifiqué el código anterior para incluir un arreglo que muestre los días de la semana:
Y este es el resultado:
Hasta aquí llego hoy. Con esto creo que queda claro la manera de declarar y usar arreglos. Luego explicaré unos ejemplos donde se usen los arreglos de forma chuviduvis. ¡Hasta la próxima!
Hace unos cuantos posts, hablé de algunas características de la programación orientada a objetos que lo hacen único, particularmente del polimorfismo (bueno, ese es el aspecto del que quiero hablar hoy).
Como dije en aquél post, el polimorfismo le permite a una comportarse de diferentes maneras según el contexto en el que se encuentra. Vamos a hablar de un ejemplo de la vida real: yo. Aunque soy el mismo en muchos lugares, me comporto de manera diferentes cuando estoy en misa, que cuando estoy con mi esposa, que cuando estoy dando clases o que cuando hablo con algún empresario. De la misma manera, puedo hacer una sobrecarga de operadores (cosa del que hablaré en otra ocasión) que significa que un operador (por ejemplo el +) funcione diferente si se le aplica a cadenas o a números u otra cosa, sobrecargar funciones. El día de hoy, vamos a sobrecargar (u overload en inglés) un constructor (si tienes dudas sobre constructores, revisa este post que publiqué que habla de ellos).
Voy a comenzar creando una clase que se encargue de hacer operaciones entre 2 números enteros. Que contenga dos datos de tipo entero (en este caso se van a llamar x y y) y varios constructores: uno que funciones cuando no se inicialice ningún valor, otro cuando se le dan valores para x y y, otro cuando solo se inicialice x.
Aunque el propósito es mostrar la manera en que se pueden sobrecargar el constructor (palabra dominguera para decir que puedo tener una función que se comporte de manera diferente según el contexto en que se use), le voy a agregar otros métodos para que sirva para algo: uno que sume los numeritos, otro que los reste, otro que multiplique y otro que divida.
El código de la clase es esta (estoy usando un programa llamado Editra, que estuve probando aunque ahora puedo decir que prefiero el Notepad++). Incluí comentarios para que se entendiera mejor:
Aquí puedes ver mi ventana cuando compilé y corrí el programa:
En este caso, estoy haciendo varias versiones del constructor, pero lo mismo podría hacer para cualquier función. Por ejemplo, voy a alterar el código para agregarle otra función suma que sume x y y con otro valor proporcionado por el usuario. El código se ve así (ahora sí con el Notepad++):
Aquí puedes ver mi ventana cuando compilé y corrí el programa:
Al estar trabajando con Java en mi post anterior sobre Java tuve que hacer un pequeño "truco" para facilitarme la vida. Lo que pasa es que el compilador javac, la máquina virtual java y algunos otros programas que necesitas para trabajar están en una carpeta (en mi caso, en C:\j2sdk1.4.2_13\bin). Una solución sencilla sería copiar tus archivos java a esta carpeta y desde allí compilarlos y ejecutarlos (como hice en el post pasado), pero es más fácil hacer un cambio pequeño a Windows para que funcione en cualquier carpeta.
¿Cómo se hace esto? ¡Fácil! Ve al Panel de Control, abre Sistema y de allí da clic sobre la pestaña Opciones Avanzadas. Haz clic sobre el botón Variables de entorno. Aparece la siguiente ventana:
De la lista de variables del sistema, selecciona Path y haz clic sobre el botón Modificar y al final de esta línea, agrega un punto y coma y escribe la ruta donde están los archivos (en mi caso, agregué ;C:\j2sdk1.4.2_13\bin). Ahora da clic en Aceptar hasta que salgas de la ventana del Sistema (son 3 botones Aceptar).
En Windows más viejos (como el 98 o el ME), hay que editar el archivo AUTOEXEC.BAT que generalmente está en C:\ y hacer lo mismo en la línea que dice PATH=.
Les paso al costo este tip esperando que les ayude un poco en sus aventuras programáticas (o como se llame) en Java. ¡Hasta la próxima!
Ayer les escribí el código de dos clases, Ejemplo y Ejemplo2 (el artículo fue este), y ahora los escribí en la compu para ejecutarlo. Quiero compartir contigo mi experiencia desde la linea de comando.
El proceso consiste en usar el programa javac para compilar el archivo con extensión java (el del código fuente). Esto me genera un archivo con la extensión class (el famoso P-Code del que hablamos aquí). Luego usas el programa java (que arranca la máquina virtual) para ejecutar el archivo class. No hay problema si tu programa consiste en una sola clase: solo tienes que escribir java nombre-archivo.class y asunto arreglado.
Sin embargo el código de ayer usaba dos clases lo cual genera dos archivos .class. Hmm... si le doy java Ejemplo, me marca error porque no tiene la función main() y si escribo java Ejemplo2, me dice que no tiene la clase Ejemplo. ¡Ah que lata! Y todo por querer usar la línea de comando... pero como decidí no renunciar e irme a un ambiente gráfico (todavía), me puse a averiguar que onda y encontré la solución.
En primer lugar tengo que arrejuntar todos los archivos .class en un solo archivo JAR (Java ARchives, o archivos Java). Esto se hace con el programita jar que viene en la misma carpeta que el javay javac. La sintaxis completa la puedes ver si escribes jar en la línea de comando y eso hace innecesario que lo escriba aquí. Yo escribí la siguiente instrucción:
jar cf EjemploClases.jar Ejemplo.class Ejemplo2.class
Lo cual significa que haga un nuevo archivo llamado EjemploClases.jarque va a contener el contenido de Ejemplo.class y Ejemplo2.class. Para ver el contenido del archivo , escribo la siguiente instrucción:
jar tf EjemploClases.jar
Esta es el texto que me aparece cuando ejecuto esta extensión:
Si te fijas, aparece Ejemplo.class y Ejemplo2.class tal y como nos lo esperábamos pero, ¿qué onda con el META-INF y el MANIFEST.MF? es un archivo que le permite al archivo JAR agregar funcionalidad que incluye firmas electrónicas, control de versiones y otras tantas cosas. Solamente puede haber un archivo manifest en un archivo y contiene información acerca de los archivos que están empaquetados en el archivo JAR. Al crear un archivo JAR, se crea un archivo de manifest de manera automática. Tengo que modificar este manifest default para que corra mi programa, específicamente decirle cuál de las clases va a ser el que se ejecuta (el que tiene el main()). Para hacer esto, primero se tiene que hacer un archivo de texto que contenga la información que quiero agregar al manifest y luego uso la herramienta jar con la opción m para agregarlo. Hice un archivo en el bloc de notas, llamado Manifest.txt, que contenía lo siguiente:
Main-class: Ejemplo2
Toma en cuenta que el último renglón tiene que terminar con un enter, si no, no jala. Luego escribo el comando:
jar cfm EjemploClases.jar Manifest.txt Ejemplo.class Ejemplo2.class
Ahora al ejecutar el archivo rar, se ejecuta la función main de la clase Ejemplo2. Esta es la instrucción:
java -jar EjemploClases.jar
¡Y listo! Todo funciona de maravilla. Bueno, la verdad es que hice tanto argüende (nota cultural totalmente fuera del tema: argüende se deriva del verbo argüir del latín ʽarguereʼ que significa alegar o dar argumentos a favor o en contra) para que apareciera un pinchurriento -14 en la pantalla, pero lo importante es que esta es la manera de empaquetar clases para su ejecución. Los archivos JAR también son usados para desplegar aplicaciones (proceso conocido como depoyment) con el Java Web Start (para aplicaciones correr como aplicaciones de forma local en las computadoras de los clientes) o el Java Plug-in (para aplicaciones que se ejecuten en un navegador).