Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso
paso a paso
Si has ingresado en esta sección, es para saber alguna de las siguientes cosas: ¿Cómo
programar en Java?, ¿Qué diferencia a Java de algunos otros lenguajes de
programación?, ¿Por qué programar en Java? y algunas cosas más.
Java es un lenguaje 100% orientado a objetos de alto nivel, para programar en Java,
así sea la aplicación más básica siempre necesitaremos como mínimo una clase con el
método principal (main). Dado que Java es un lenguaje de alto nivel, hay muchos
conceptos que se facilitan en comparación a otros lenguajes de programación, el
ejemplo más claro es el manejo de punteros y gestión de memoria, los cuales son
bastante fáciles en Java (es algo prácticamente automático) mientras que en C y C++
es un poco más complicado; sin embargo no todo es bueno, pues su velocidad
disminuye al necesitar de un mayor número de instrucciones y el programador no
tiene control sobre algunas cosas pero no te preocupes por esto, Java es un lenguaje
bastante usado, extendido y poderoso. Actualmente programar en Java es bastante
sencillo e intuitivo con la correcta documentación y dedicación. Comencemos:
1
configurar y manejar. Cualquiera que sea el editor (IDE) de Java que elijas, no debe
presentarte problema alguno para desarrollar tus aplicaciones. En mi punto de vista
personal, el entorno de desarrollo para Java más potente es Netbeans, aclaro que es
un mero punto de vista personal y reconozco también que entornos para Java como
Eclipse presentan varias ventajas con respecto a Netbeans, pero bueno, nada es
perfecto y hace parte de nuestras competencias, sabernos defender con uno o con el
otro, tu simplemente para aprender acomódate con el que más te llame la atención.
Veamos ahora sí, una lista de algunos de los principales editores (IDE) para Java, en
orden de utilidad (nuevamente desde mi punto de vista).
Netbeans:
NetBeans es un proyecto de código abierto muy popular que posee una gran base de
usuarios, una comunidad en constante crecimiento y por ende gran facilidad al
momento de solicitar ayuda. Sun MicroSystems fundó el proyecto de código abierto
NetBeans en junio de 2000, actualmente Oracle es el encargado del mantenimiento
y desarrollo de este y hasta ahora, todo va muy bien.
2
IntelliJ:
IntelliJ es creado por JetBrains, uno de los creadores de entornos de desarrollo más
populares a nivel empresarial, no solo para Java, sino para otro tipo de proyectos y
lenguajes de programación. IntelliJ, posee una versión de comunidad que puedes
usar de forma completamente gratuita y abierta para tus proyectos Java.
Eclipse:
Nota: En el enlace que daré a continuación tendrás varias opciones para descargar,
de todas estas te recomiendo el primer enlace "Eclipse Standard", que es la versión
para Java más simple y tiene todo lo necesario.
Puedes encontrarlo aquí
JCreator:
Nota: En el enlace que daré a continuación tendrás tres opciones para descargar, de
todas estas te recomiendo la primera, que es la versión para Java más completa, sin
embargo es una versión de prueba de 30 días, pero podrías comprarla o buscar la
manera de usarla seguramente.
Puedes encontrarlo aquí
3
Instalación del JDK (importante)
Nota: En el enlace que daré a continuación tendrás tres opciones para descargar, de
todas estas debes seleccionar la primera que dice "Java Platform (JDK)", que es la
que necesitamos.
Puedes encontrarlo aquí
Muy bien, ahora tienes tu herramienta de trabajo, habrás elegido la que mejor te
parezca y la tendrás instalada en tu computador. Si tienes algún problema, deja tus
problemas y comentarios en la sección de comentarios y describe tu problema.
Ahora sí!!! Por fin!! Llegó el momento de aprender a programar en Java, pues ya
tenemos lo necesario. Primero, puedes acceder a una sección opcional
llamada Creación de Proyectos en la que explico cómo crear proyectos en Netbeans,
como añadir elementos al proyecto y como ejecutarlo. En caso de que ya sepas como
crear y ejecutar proyectos en el entorno seleccionado, podemos avanzar a la sección
de Librerías en Java y Paquetes en Java recuerda que también puedes dejar un
comentario acerca de esta sección, y así ayudarás a mejorar el sitio, todas las
sugerencias y opiniones son tenidas en cuenta.
4
La última actualización de este artículo fue hace 11 meses
Vamos a ver rápidamente los fácil que es crear un proyecto en Netbean. Veremos,
algunas imágenes y una guía para crear un proyecto en este entorno de desarrollo.
Comencemos:
5
Una vez haya iniciado correctamente Netbeans, podremos crear el nuevo proyecto.
Luego
se abrirá
una
ventana
6
Hecho esto, podremos añadir elementos a nuestro proyecto, clases, interfaces, etc.
Vamos a ver cómo crear una clase al interior de nuestro proyecto:
package mipaquete;
System.out.println("Hola mundo");
7
Una vez pegado el código, podremos ejecutar
nuestro primer programa en Java
presionando Shift+F6. Al ejecutarlo se nos
mostrará en la parte inferior la ejecución de nuestro código,
Muy bien, es todo en este contenido, espero que todo haya quedado lo más claro
posible. De igual forma, te recuerdo que puedes dejar tu dudas, comentarios,
problemas y/o sugerencias en la sección de comentarios. Si todo ha ido bien y ya
dominas perfectamente y sin problemas la creación y ejecución de proyectos en
Netbeans, podremos continuar con la siguiente sección llamada Comentarios en java.
8
En nuestro ejemplo de la fábrica de galletas, la clase sería uno de los moldes para
galletas, junto con los métodos para colorearlas y la receta (método para prepararlas).
Quiere decir que en nuestro programa de Java tendremos una manera de especificar
las caracteristicas de la galleta dado que hay diferentes moldes de galletas.
En java las clases son las matrices de las que luego se pueden crear múltiples
instancias del mismo tipo. La clase define las variables y los métodos comunes a las
instancias de ese tipo (el tipo de la clase creada), pero luego, cada instancia de esta
clase tendrá sus propios valores (sus propio molde, color y receta) y compartirán las
mismas funciones.
En java, primero deberemos crear una clase antes de poder crear instancias o
ejemplares de esa clase. Evidentemente primero necesitamos los moldes y demás
para poder hacer las galletas.
Para nuestro ejemplo de la fábrica de galletas, los objetos vendrían siendo cada una
de las diferentes galletas obtenidas de los moldes definidos (clases).
Lo más importante de los objetos en Java es que permiten tener un control total
sobre "quién" o "qué" puede acceder a sus miembros, es decir, los objetos pueden
tener miembros públicos a los que podrán acceder otros objetos o miembros
privados a los que sólo puede acceder él. Estos miembros pueden ser tanto variables
como funciones.
Para poder crear una aplicación Java que sea un tanto robusta, es muy probable que
necesitemos más de un objeto (más de una instancia de una clase), y probablemente
algunos de estos objetos no deben estar aislados unos de otros, pues bien, para
comunicarse, esos objetos se envían mensajes entre sí.
9
Los mensajes son simples llamadas a las funciones o métodos del objeto en particular
con el cual se quiere comunicar para solicitarle que ejecute alguna "accion" según sus
métodos y/o atributos.
¿Qué significa esto de la herencia?, ¿quién hereda qué?, bueno calma, no entres en
pánico, esto sólo significa que en Java puedes crear una clase partiendo de otra que
ya exista.
Es decir, puedes crear una clase a través de una clase existente, y ésta clase tendrá
todas las variables y los métodos de su "superclase", y además se le podrán añadir
otras variables y métodos propios.
Se llama "Superclase" a aquella clase de la cual desciende una clase, más adelante
veremos un poco más de esto al detalle.
Vamos a ver un pequeño ejemplo basado en la fábrica de galletas que hemos estado
tratando a lo largo de este artículo. Vamos a crear una pequeña clase llamada
"Galleta" que contendrá los diferentes atributos.
public Galleta()
{
//Constructor
}
10
//Método para fabricar galletas
}
}
Muy bien, probablemente ya tienes cierta noción acerca de lo que estamos hablando
y no es necesario profundizar mucho más por ahora, recuerda que si no estás
entendiendo algo de lo que he hablado anteriormente en esta sección, no debes
preocuparte, pues más adelante iré clarificando todo con más detalle, si tienes alguna
duda o sugerencia usa la sección de comentarios que se encuentra al final de este
artículo.
11
funciona cierta parte de un código, lo cual permite identificar todo con mayor
rapidez.
Vamos entonces a ver cómo hacer comentarios en Java y las características de estos.
Existen tres tipos de comentarios en Java, así que veamos cada uno en detalle:
Pueden ser colocados en cualquier parte de nuestro código en Java y comienzan por
un doble slash "//", al colocar el doble slash en cualquier línea de código, todo lo que
haya de ahí en adelante en dicha línea será tomado como comentario, ten en cuenta
que el doble slash solo convierte en comentario al texto que haya justo después de
éstos y que pertenezca a su misma línea, las líneas de abajo de este, no se verán
afectadas, tal como es de esperarse, el doble slash "//", solo afecta una línea desde el
lugar donde se colocan.
Ejemplo comentarios en Java de una sola línea:
Los comentarios multi-línea en Java tal como el nombre lo indica nos permiten
comentar varias líneas de nuestro código Java de manera mucho más sencilla en vez
de esta añadiendo doble slash "//" a cada línea. Estos comentarios van cerrados
entre "/*" y "*/", es decir comienzan donde se ponga "/*" y terminan donde esté el
"*/". Estos comentarios funcionan de manera similar a los comentarios de una sola
línea, pero deben tener un comienzo y un final. A diferencia de los comentarios de
una sola línea, al poner el símbolo "/*" todo el código que haya tanto en la misma
línea, como en las línea posteriores de este se convertirán en comentarios hasta que
12
pongamos el "*/", de manera que si iniciamos un comentario de múltiples líneas,
debemos cerrarlo, tal como sucede con las llaves o los corchetes en Java.
Ejemplo de comentario en Java de múltiples líneas
Estos comentarios van cerrados entre "/**" y "*/", es decir comienzan donde se
ponga "/**" y terminan donde esté el "*/". Nótese que los comentarios de
documentación, a diferencia de los comentarios de múltiples líneas, inician con "/**"
(doble asterisco) en lugar de "/*" (un solo asterisco). Adicionalmente, se recomienda
que cada línea que compone el bloque de comentarios inicie con "*".
13
Ejemplo de comentario de documentación en Java (Javadoc)
/**
* Este método se encarga de iniciar la ejecución del programar
* Éste es el método principal del proyecto
* @param args[] es un arreglo con los parámetros que el reciba por consola
* @return void
*/
public static void main(String args[])
{
String saludo = mostrarSaludo("Juan");
}
/**
* Este método se encarga mostrar un saludo al usuario
* @author JuanDMeGon
* @param nombre es una cadena de texto con el nombre a usar
* @return El mensaje usado para el saludo
*/
public static String mostrarSaludo(String nombre)
{
String mensaje = "Hola " + nombre;
System.out.print(mensaje);
return mensaje;
}
14
Muy bien, eso es todo para ésta sección, como habrás visto es bastante sencillo todo
y no debería dar problemas. De igual forma si tienes alguna pregunta y/o problema
puedes plantearlo en la sección de comentarios. Si todo ha ido bien, podremos
continuar con nuestro curso de Java y ver ahora cómo crear un programa en Java
Básico y continuar con nuestro aprendizaje.
En Java el método main recibe como argumento un arreglo de String (más adelante
hablaremos sobre arreglos). Este arreglo contiene los argumentos enviados por la
línea de comandos para la invocación del programa. Generalmente en una aplicación
de Java básica, no se hace uso de éste argumento, sin embargo hay algunos casos
especificos en los que sí.
15
public static void main (String args[])
//bloque de sentencias;
Muy bien, como quizá has visto en la sección de C++, ya sabrás seguramente que es
cada una de estas 5 líneas, pero como quizá no lo recuerdes o simplemente no has
pasado por esta sección, entonces veamos en detalle el código anterior.
Línea 1 del programa Java básico:
Nuestra línea 2, tiene una llave abriendo "{", esto quiere decir que todo lo que haya
despues de esta llave forma parte de la clase "nombre_clase" (o como le hayas
llamado) e indica el comienzo de las líneas de sentencia de ésta, en este caso, esta la
declaración de la función main() que está má adelante.
Línea 3 del programa Java básico:
Si se le pusiera por ejemplo int (entero) entonces al final de la función, ésta debería
retornar algún número o variable de tipo entero, sin embargo al hacer esto, ya no
estaríamos hablando del método principal de nuestro programa sino que serí una
16
funció creada por nosotros llamada main y que es del tipo entero, eso es ya otro
tema muy distinto llamado sobrecarga de funciones que veremos más adelante.
La línea tres, también tiene un argumento para el método main, es lo que está dentro
de los parentesis "String args[]", esto quiere decir que la función main, debe recibir un
argumento el cual es de tipo String y es además un arreglo, luego hablaré de los tipos
de datos, no te preocupes mucho por esto. Aunque tu programa sea Java básico y no
hagas uso de éste argumento, es obligatorio declararlo o tendremos un error de
compilación, así que siempre debes ponerlo en tu código.
Línea 4 del programa Java básico:
La línea 4 de nuestro programa básico contiene una llave abriendo que indica el inicio
del bloque de instrucciones del método main
Línea 5 del programa Java básico:
La línea cinco contiene el bloque de sentencias del método main, es decir, las líneas
de código que nuestro programa seguirá durante su ejecución, es de notar que cada
sentencia termina con punto y coma ";". Se entiende como línea de sentencia, a las
líneas de código que en ellas contienen la declaración de alguna variable, o alguna
operación,( suma resta, división, etc.) o cualquier acción, como modificar, asignar, o
eliminar algo. Evidentemente el bloque de sentencias puede estar compuesto por
una cantidad ilimitada de instrucciones (no es una única línea). Una vez que éste
bloque de sentencias llega a su fin, también lo hará la ejecución de nuestra aplicación
Línea 6 y 7 :
Estas líneas contienen una llave cerrando "}" eso nos indica que en ésta termina la
ejecución de alguna función (para identificar esta función que se cierra, sigue la
indentación y seguramente sabrás cual es la que estamos cerrando). Pues bien, si no
te has equivocado, habrás notado que la función (mas bien método) que esta llave
está cerrando es main(), y luego está la línea 7 que cierra la definición de nuestra
clase y da por terminado el có de nuestro programa básico en Java.
17
Antes de finalizar esta sección quisiera poner un pequeño ejemplo que muestre la
estructura anteriormente explicada, asi que veamos
18
eclipse, o cualquier otro IDE para Java, deberías obtener algo como lo que se ve en la
imagen.
Deberías intentar cambiar el código, mover algún número, cambiar nombres, valores
y todo lo que se te ocurra en él, te aseguro que en el proceso aprenderás unas
cuantas cosas valiosas que te van a facilitar el proceso de aprendizaje y mejorarán
tus conocimientos, recuerda que la única forma de aprender a programar es
programando, así que.... ¿Qué esperas?, recuerda que si tienes problemas o dudas
durante el proceso, la sección de comentarios está allí para ayudarte.
Voy a retomar parte de las definiciones y el ejemplo que usé en la introducción para
profundizar aquí sobre las clases y los objetos en Java, los constructores y los
métodos y algunas otras cosas particulares de estos.
19
colores, evidentemente al tener diferentes formas para nuestras galletas
necesitaremos varios moldes para las galletas que fabricamos (un molde para cada
forma), necesitaremos diferentes recetas para el sabor de cada una y por último
diferentes maneras de darle color a las galletas.
Una clase en Java se puede entender como un prototipo que define las variables y
los métodos comunes a un cierto tipo de instancias, una clase define todo lo que
caracteriza y pueden hacer una o varias instancias.
En nuestro ejemplo de la fábrica de galletas, la clase sería uno de los moldes para
galletas, junto con los métodos para colorearlas y la receta (método para prepararlas).
Quiere decir que en nuestro programa de Java tendremos una manera de especificar
las características de la galleta dado que hay diferentes moldes de galletas.
En java las clases son las matrices de las que luego se pueden crear múltiples
instancias del mismo tipo. La clase define las variables y los métodos comunes a las
instancias de ese tipo (el tipo de la clase creada), pero luego, cada instancia de esta
clase tendrá sus propios valores (su propio molde, color y receta) y compartirán las
mismas funciones.
En java, primero deberemos crear una clase antes de poder crear instancias o
ejemplares de esa clase. Evidentemente primero necesitamos los moldes y demás
para poder hacer las galletas.
En Java, un objeto es básicamente una instancia de una clase (las instancias de las
que hablábamos hace un momento). Para el ejemplo de la fábrica de galletas, los
objetos vendrían siendo cada una de las diferentes galletas obtenidas de los moldes
definidos (clases), creados por medio de un proceso o "constructor" de galletas.
Muy bien, ya hemos hecho un repaso sobre el concepto de clase y objeto en Java, sin
embargo aún no sabemos cómo crearlos ni usarlos, así que vamos a ello.
Como dije anteriormente la clase es la que nos dice los componentes del ejemplar
que vamos a crear, es decir, una clase contiene los atributos y los métodos que
20
conformarán al ejemplar o instancias, de este modo al momento de crear una clase
en Java, debemos especificar el tipo y el nombre (como mínimo) de los atributos y
adicionalmente debemos especificar (si existen) los métodos o funciones, el tipo de
dato que retornan, el nombre y los parámetros que reciben dichos métodos.
Veamos la estructura básica de una clase en Java y luego veamos unos ejemplos de
clases en java un poco más complejos e ilustrativos.
Estructura básica de una clase en Java
//Atributos de la clase
public MiClase(){}
//Métodos de la clase
//Método vacío
21
public String metodo2()
return "metodo2";
En el ejemplo anterior hemos creado una clase en Java llamada "MiClase" la cual
posee un total de tres atributos (todos ellos privados) y son de tipo String, int y float
respectivamente. Adicionalmente esta clase tiene un constructor (que siempre por
norma, debe tener el mismo nombre de la clase) el cual no recibe ningún parámetro,
aunque pueden recibir todos los parámetros que nosotros deseemos, también tiene
un método llamado "metodo1" que no retorna valor alguno (es de tipo void) y otro
método llamado "metodo2" que retorna una cadena de caracteres (es de tipo String)
con el valor "metodo2". Cabe resaltar que una clase en Java puede tener o no
métodos y atributos, sin embargo lo más normal en la mayoría de los casos es que
tenga tanto métodos como atributos que la caractericen.
22
{
return edad;
edad = nuevaEdad;
return nombre;
La clase Java que hemos creado para este ejemplo tiene como nombre "Animal",
pertenece al paquete "misClases" y posee los atributos raza, nombre y edad,
23
adicionalmente tenemos un constructor que recibe un nombre y se lo asigna al
animal y tres métodos encargados de obtener y establecer la edad del animal y el
restante para obtener el nombre.
Objetos en Java
Muy bien, ya hemos aprendido a la perfección cómo crear clases en java, y cuáles
son sus componentes esenciales, ahora vamos a aprender a crear objetos en Java,
cómo se hace, veremos brevemente la utilidad y funcionamiento de los constructores
y como usar los métodos
Para crear objetos en Java, el lenguaje nos proporciona el comando new, con este
comando le decimos a Java que vamos a crear un nuevo objeto de una clase en
especifico y le enviamos los parámetros (en caso de ser necesario) según el
constructor, veamos un ejemplo.
Ejemplo de objetos en java
Vamos a crear un objeto o instancia en Java para la clase que hemos creado al
comienzo llamada MiClase. Esta clase tiene un constructor que no recibe parámetros,
por lo cual no es necesario enviar algún tipo de valor al momento de crear el objeto,
veamos entonces la sintaxis para crear un objeto del tipo MiClase en java.
24
MiClase miObjeto = new MiClase(); //Declaramos y creamos el objeto en una
línea
Vamos ahora a crear un objeto o instancia para la clase Animal (la del ejemplo dos),
en esta ocasión tenemos un constructor que recibe un parámetro (el nombre del
animal) y que posee tres métodos de los cuales haremos uso para este ejemplo.
miAnimal.setEdad(3);
//Este código deberia imprimir "El nombre es: Falco y tiene 3 años"
25
Nota: Es importante notar que es similar hacer uso de método set para establecer
atributos y usar el constructor enviandole parámetros, es decir, el resultado es el
mismo al usar un constructor vacío y luego establecer los valores de los atributos por
medio de una función set o usar un constructor que reciba una serie de parámetros
que usará para establecer valores a los atributos. La diferencia radica esencialmente
en la agilidad y número de líneas, al usar el constructor y enviar los parámetros, el
constructor hace todas las asignaciones por nosotros y usamos una sola línea de
código (normalmente) mientras que al usar métodos set debemos usar un método set
por cada atributo y si tenemos cinco o más atributos ya se vuelve un poco molesto
hacerlo además de tener que usar un constructor de todas formas. Veamos un corto
ejemplo para estar más claros.
Una pregunta que nos puede surgir es si debemos usar un constructor con
parámetros o los métodos set de los atributos para establecer los valores de los
atributos del objeto. En realidad es lo mismo en cuanto a resultados u términos
generales veamos:
Ejemplo 1: Usando constructor
//Declaramos un constructor
26
{
atributo1 = attr1;
atributo2 = attr2;
atributo3 = attr3;
En este ejemplo hemos hecho uso del constructor para establecerle los valores a los
atributos del objeto. Ahora hagamos lo mismo usando métodos set o accediendo
directamente a cada atributo.
Ejemplo 2: Usando métodos set
27
private String atributo3;
atributo1 = attr1;
atributo2 = attr2;
atributo3 = attr3;
28
Aclaracion ac2 = new Aclaracion();//Creamos otro objeto con
constructor vacío
ac1.setAtributo1(5);
ac1.setAtributo2(10);
ac1.setAtributo3("x");
ac2.atributo1 = 5;
ac2.atributo2 = 10;
ac2.atributo3 = "x";
Como podrás evidenciar hacer ambas cosas nos permiten llegar al mismo resultado,
sin emabrgo en el ejemplo 2, podemos ver como el número de líneas aumentó
29
considerablemente y fue más engorroso programarlo. En todo caso siempre es buena
práztica declarar los métodos set y get para cada atributo, pues si debemos modificar
el valor de un atributo cualquiera, debemos hacerlo por medio de un método get y no
creando un objeto nuevo.
Nota: En el ejemplo 2, podrás ver que hicimos uso de los métodos set para
establecer valores en el objeto ac1 mientras que para el objeto ac2 hicimos
asignaciones directas. Esto lo pudimos hacer debido a que los atributos son privados
y estamos accediendo a ellos desde la propia clase. Eso mismo no se podría hacer
desde otra clase, pues deberíamos usar el método set (que son públicos). Para más
información respecto a esto de acceso, publico, privado y demás, puedes ingresar al
artículo sobre modificadores de acceso.
Muy bien, ha sido todo en esta sección. En este punto debemos saber cómo crear
una clase, qué son atributos y métodos de una clase en Java, qué es y para qué sirve
un constructor (al menos en una forma muy básica), cómo crear objetos en Java y
cómo hacer uso de los métodos de una clase desde los objetos de la misma. Espero
entonces que todo haya quedado claro y sin fallas. De igual forma si tienes alguna
duda, comentario y/o sugerencia, siempre puedes hacer uso de la sección de
comentarios y allí con gusto responderé a cualquier comentario o duda que surja.
Los paquetes permiten poner en su interior casi cualquier cosa como: clases,
interfaces, archivos de texto, entre otros. De este modo, los paquetes en Java
ayudan a darle una buena organización a la aplicación ya que permiten modularizar o
categorizar las diferentes estructuras que componen nuestro software.
Los paquetes en Java, adicionalmente al orden que nos permite darle a la aplicación,
también nos brindan un nivel adicional de seguridad para nuestras clases, métodos o
interfaces, pues como veremos más adelante podremos especificar si una clase o
30
interfaz en particular es accesible por todos los componentes del software (sin
importar el paquete) o si en realidad es solo accesible por las clases que estén en el
mismo paquete que ésta. Veremos con más detalle este tema del acceso más
adelante.
Ya sabemos para qué sirven los paquetes en Java y sus características principales.
Vamos ahora a aprender cómo usarlos y qué cambios generan estos en la estructura
de nuestro proyecto.
package ruta.del.paquete;
Hay varias cosas que clarificar aquí. Como verás, la sintaxis es bastante simple y
comprensible pero hay algunos detalles a tener en cuenta, veamos.
La declaración del paquete debe estar al principio del archivo Java, es decir, es
la primera línea que se debe ver en nuestro código o archivo .java. Primero se
declara el paquete, y luego podremos poner los imports y luego las clases,
interfaces, métodos, etc.
Cada punto en la ruta del paquete es una nueva carpeta:
Cuando se escribe la ruta del paquete en Java, se pueden especificar una ruta
compleja usando el punto ".", por ejemplo en el código anterior, nuestra clase,
interfaz o archivo estará ubicado en una carpeta llamada "paquete" la cual a su
vez está en la carpeta "del" y esta también se encuentra dentro de una carpeta
llamada "ruta". De este modo si queremos por ejemplo que una clase quede al
interior de una carpeta llamada "mi_paquete" y ésta al interior de una carpeta
llamada "otro_paquete" pondríamos:
31
package otro_paquete.mi_paquete;
/*Se usa el punto para separar cada carpeta
equivale a la ruta otro_paquete/mi_paquete dentro del proyecto*/
public class mi_clase
{
}
Prácticas recomendadas para nombrar paquetes en Java
También hay varias buenas prácticas y recomendaciones para crear y declarar
paquetes en Java. En generarl, los paquetes en java se declaran siempre en
minúsculas y en caso de ser necesario las palabras se separan usando un guión
bajo "_".
Si no se declara un paquete (paquete por defecto):
Es común usar la primera letra en mayúscula cuando se declara una clase, pues
bien, cuando se declaran paquetes es común que todas la letras estén en
minúscula y en caso de ser varias palabras separarlas por un guion bajo "_" por
ejemplo "mi_paquete" es adecuado mientras que "MiPaquete" aunque no es
incorrecto, no es una buena práctica.
En estos momentos ya tenemos claro qué es y para qué sirve un paquete en Java,
también sabemos cómo se declaran los paquetes en Java y probablemente
tendremos una noción de los cambios que estos generan al interior de la estructura
de nuestro proyecto. A continuación veremos un ejemplo que consistirá de cuatro
32
clases diferentes en ubicaciones (paquetes) también diferentes y luego veremos
cómo queda la estructura de nuestro proyecto
package mis_clases.clases_publicas.clase_1;
public class Clase_1
{
package mis_clases.clase_2;
class Clase_2
{
package mis_clases;
class Clase_3
{
33
}
class Clase_4
{
Concluyendo finalmente con el ejemplo, tenemos que las tres primeras clases se
encuentran al interior de la carpeta "mis_clases", la cuarta clase no se encuentra allí
dado que se encuentra en la carpeta raíz del proyecto. La clase dos además de estar
34
al interior de "mis_clases" está en un carpeta propia "clase_2" y la clase uno, se
encuentra además al interior de la carpeta "clases_publicas" (si lo notaste es la única
clase publica) y luego al interior de su propia carpeta "clase_1"
Muy bien, hemos llegado al final de este contenido, espero que hayas comprendido a
la perfección cada uno de los detalles aquí explicados y que ahora domines
correctamente el concepto de paquetes en Java. Recuerda que si tienes algún
problema, duda o comentario, puedes dejarlo sin ningún temor en la sección de
comentarios. Nuestro siguiente paso es aprender a hacer uso de una clase que se
encuentra al interior de un paquete desde otra clase, por ejemplo como usar algún
método de la clase_1 desde un método de la clase_3, esto lo veremos en la sección
de Librerías en Java junto con algunas cosas más. Ahí te espero.
Imaginemos cómo hacer un código para conseguir que nuestra aplicación imprima
algo por pantalla o conseguir que nuestra aplicación pueda hacer uso de arreglos
dinámicos con cualquier tipo de dato. Por medio de librerías, para imprimir texto en
pantalla en Java basta con usar System.out.print() y se puede hacer uso de ArrayList,
para tener arreglos dinámicos y demás, en Java, esto es así de fácil y todo es gracias a
las librerías, la clase System que pertenece a la librería java.lang (ésta es la librería
estándar de Java y no es necesario importarla). Ocurre de la misma forma con el
ArralyList, no podríamos hacer uso de éste si no existiera la librería java.util. Cabe
mencionar que estas librerías no solo poseen estas clases sino que poseen una gran
cantidad de clases Java adicionales que nos permiten llevar a cabo operaciones muy
complejas con gran facilidad.
35
Lo más interesante de las librerías en Java, es que nosotros también podemos
crearlas y hacer uso de ellas al interior de nuestros proyectos. Básicamente un
paquete en Java puede ser una librería, sin embargo una librería Java completa puede
estar conformada por muchos paquetes más. Al importar un paquete podemos hacer
uso de las clases, métodos y atributos que lo conforman, así que eso de las librerías
no es solo trabajo de otros sino que podemos crear nuestras propias librerías y
usarlas, incluso podemos hacer uso de un proyecto completo nuestro al interior de
otro (así de genial es esto).
Pues bien, hasta ahora todo suena muy impresionante y se entiende que es bastante
útil y que nos facilita enormemente la vida, pero ¿cómo importar una librería en Java?
¿cómo se usa una librería de Java? ¿qué es importar una librería? o mejor aún ¿qué es
import en Java? pues bien, vamos a resolver todas estas dudas a continuación.
Hacer uso de librerías tanto propias como externas, o librerías propias de Java, es
bastante fácil. Básicamente lo único que debemos saber es que para importar
librerías en Java se usa la palabra clave import seguido de la "ruta" del paquete o
clase que deseamos agregar al proyecto. Cabe resaltar que el import permite agregar
a nuestro proyecto una o varias clases (paquete) según lo necesitemos. Para
comprender y usar correctamente el import de Java, retomaremos los ejemplos
dados en la sección de paquetes.
Vamos a suponer que al interior de nuestro proyecto hemos creado cuatro clases
diferentes en paquetes diferentes, cada clase se llamará "Clase_1", "Clase_2",
"Clase_3" y "Clase_4" respectivamente.
36
una carpeta llamada "clase_2" la cual a su vez está al interior de la carpeta
"mis_clases". A la clase número tres se le impuso el paquete "mis_clases", esto indica
que esta estará al interior de la carpeta "mis_clases". Por último, la clase número
cuatro no tiene declarado ningún paquete por lo tanto el paquete asignado será el
paquete por defecto, en otras palabras, esta clase se mantendrá siempre en la
carpeta raíz del proyecto (en netbeans y eclipse la carpeta raíz se llama src).
Al igual que sucede con la declaración de los paquetes, realizar el import en Java
también tiene una localización especifica al interior del archivo java. La importación
de librerías y demás siempre debe ir después de la declaración del paquete, si la clase
no posee alguna declaración de paquete (pertenece al paquete por defecto),
entonces los import deberán estar en las primeras líneas del archivo.
package paquete.mipaquete;
import paquete2.otropaquete.*;
class Ejemplo1{}
37
package paquete.mipaquete;
import paquete3.otropaquete2.MiClase;
class Ejemplo2{}
En el código anterior hemos usado el mismo paquete para la clase pero hay una
pequeña diferencia al momento del import, en esta ocasión hemos importado una
clase directamente (MiClase), es decir, como no usamos el "*" no hemos importado
todas las clases pertenecientes al paquete "paquete3.otropaquete2" sino que solo
hemos importado a "MiClase"
import paquete.mipaquete.*;
class Ejemplo3{}
En esta ocasión se puede apreciar que no hemos declarado paquete alguno para
nuestra clase y que únicamente hemos realizado el import, sin embargo este import
como tal es algo particular para nosotros, pues hemos importado TODAS las clases
pertenecientes al paquete "paquete.mipaquete" que es el paquete al cual pertenecen
las clases del ejemplo 1 y 2, esto quiere decir que al interior de la clase Ejemplo3,
podemos usar las clases Ejemplo1 y Ejemplo2.
Muy bien!! Hasta el momento ya sabemos muchas cosas acerca del import en Java,
sabemos cómo importar todas las clases pertenecientes a un paquete, también como
importar una única clase de un paquete cualquiera y vimos también que los paquetes
que nosotros mismos creamos al interior del proyecto, pueden ser usados en otras
clases de manera instantánea. Pero aún hay algo que no hemos visto y lo cual es de
gran importancia, ¿cómo importar las clases y librerías propias de Java?, pues bien
vamos a verlo.
38
desde mi punto de vista creo que es bastante complejo conocerlas todas, aunque si
es importante conocer las más comunes y útiles, básicamente lo que debes hacer es
ingresar a la API de Java y allí encontrarás todas las clases que componen el lenguaje,
el paquete al que pertenecen, los métodos que poseen, los atributos y una breve
explicación de cada uno de estos. Si ingresas a la documentación de Java verás que
por ejemplo existe una clase llamada ArrayList, ésta pertenece al paquete java.util,
esto quiere decir que para importarla debemos usar esa dirección, veamos:
import java.util.ArrayList;
class Ejemplo4{}
Aquí hemos importado la clase ArrayList y podremos hacer uso de sus componentes,
siempre y cuando sean públicos (más adelante hablaremos de esto). Hay otra forma
de hacerlo, pero posee ciertos inconvenientes:
import java.util.*;
class Ejemplo5{}
Aqui hemos importado TODAS las clases pertenecientes al paquete "java.util" lo cual
incluye la clase ArrayList y por lo tanto es funcional y válido, sin embargo esto es
bastante ineficiente, pues estamos importando todas las clases que son
aproximadamente 50 y que seguramente no usaremos. Veamos entonces cómo
importar algunas clases propias de Java.
import java.util.ArrayList;
import java.io.* //importando clases para entrada y salida (IN OUT)
import java.math.* //clases utiles para operaciones y valores matematicos
class Ejemplo6{}
39
Como podrás ver, existen muchas librerías muy útiles y es bastante sencillo hacer uso
de ellas cuando sea necesario y así ahorrarnos mucho tiempo, trabajo y esfuerzo.
Muy bien, hasta ahora hemos aprendido todo lo necesario acerca del import en Java,
sabemos cómo importar nuestra propias clases, importar todas las clases de un
paquete, también vimos que Java posee una API y que está conformada por una
enorme cantidad de Clases, interfaces, excepciones, etc. y que en cualquier
momento podemos hacer uso de cualquiera de estas.
Cuando hablamos del sistema de tipos en Java, nos estamos refiriendo a todos los
tipos de datos (no solo los nativos o primitivos) que posee el lenguaje, es decir, el
40
sistema de tipos está conformado por todos los tipos que se le pueden asignar a las
diferentes variables dentro de una aplicación en Java y estos provienen de la
definición misma del lenguaje, es decir, nosotros no debemos crear el tipo sino que
Java ya lo trae creado para nosotros y lo podemos usar en cualquier momento. Estos
tipos de datos provienen de la librería estándar de Java y todos podemos hacer uso
de ellos.
De lo anterior entonces, podemos decir que los tipos de datos creados por el usuario
(clases) no conforman el sistema de tipos de Java, sin embargo no dejan de ser un
tipo de dato, simplemente, no son un tipo de dato estandar sino como lo dije antes,
son un tipo de dato creado por el usuario y quiza conformen un sistema de tipos
propio del usuario, mas no de Java como tal.
Como podrás imaginar Java posee una enorme cantidad de tipos de datos, sin
embargo de una manera más general, algunos de estos son más sencillos simples de
usar que otros. Veamos:
Los tipos nativos de Java, son los tipos de datos "fáciles de usar" es decir, como
veremos un poco más adelante, no es necesario crear un objeto de manera explícita
para hacer uso de ellos. Los tipos primitivos como su nombre lo da a entender, son
los tipos de datos más básicos y simples del sistema de tipos de Java y por ello es
bastante fácil usarlos. Veamos a continuación cuáles son estos tipos de datos
primitivos y sus características.
¿Cuáles son los tipos primitivos de Java?
Java posee un total de ocho tipos primitivos, que cubren todo tipo de números
(reales o decimales y enteros) cada uno con una extensión o magnitud máxima,
también cubre los valores lógicos (falso y verdadero) e incluye
caracteres. Nota: Debo advertir aquí que Java no incluye en sus tipos primitivos las
cadenas de caracteres (Strings) pues en este lenguaje (de hecho no es el único) son
representados por medio de la clase String.
Tipo primitivo char
Este tipo de dato permite representar caracteres aislados, es decir, por medio
de un único char no podemos representar palabras completas sino más bien
letras individuales. Por ejemplo entonces la palabra "carácter" estaría
41
conformada por un total de ocho chars ‘c’, ‘a’, ‘r’, ‘a’, ‘c’, ‘t’, ‘e’ y ‘r’. Un char tiene
un peso fijo (independientemente de la letra) de 16 bit.
Tipo boolean
Este es usado para representar números enteros más grandes que byte (aunque
no demasiado) tiene un peso de 16 bit y varía entre -32768 y 32767
Tipo primitivo int
Este tipo de dato es uno de los más populares entre una gran variedad de
programadores, pues generalmente cuando se piensa en un número entero
inmediatamente se coloca la variable como tipo int, sin embargo generalmente
int suele ser más grande de lo que llegamos a necesitar, desperdiciando así
algunos bits en memoria. Un tipo int tiene un peso de 32 bit con signo, es decir
va desde -2 a la 31 hasta 2 a la 32, aproximadamente desde -2.147’483.648
hasta 2.147’483.647.
El tipo long
42
Tipo primitivo float
Este tipo es el tipo de dato numérico más grande, con este podemos
representar casi cualquier número que necesitemos, es demasiado improbable
que necesitemos un número que supere la capacidad de éste (aunque existen
unos pocos casos en los que sí), tienen un peso de 64 bit.
Muy bien ya hemos visto y conocido los tipos de datos primitivos de Java, sin
embargo como mencioné al principio de esta sección, los tipos primitivos son solo
una parte del sistema de tipos de Java, así que veamos a continuación los tipos de
datos que nos hacen falta para completar nuestro sistema de tipos:
Tipos complejos o compuestos en java
43
Tipos de la biblioteca estándar de java
La clase String
Pues bien, esto ha sido todo en esta sección, hasta este momento ya debes saber
que el sistema de tipos de Java, está conformado por tipos primitivos y tipos
complejos o compuestos, también conoces los ocho tipos de datos primitivos de Java
y sus características, al igual que algunas importantes clases o tipos complejos de la
44
librería estándar de Java. Espero que todo esto haya quedado claro y sin problemas.
De igual forma si tienes alguna duda, comentario y/o sugerencia, siempre puedes
hacer uso de la sección de comentarios y allí con gusto estaré al tanto de cualquier
comentario que pongan. El siguiente contenido habla acerca de las variables y tipos
en Java (creo que ya lo he mencionado un montón de veces :P).
Declarar variables en Java es bastante similar por no decir que igual a la gran mayoría
de los lenguajes más populares de la actualidad, básicamente debemos definir un tipo
de datos (nativo o complejo) un nombre para la variable y de manera opcional
podremos inicializarla en la misma línea y darle un valor inicial. La sintaxis para
declarar variables en Java varía dependiendo de la naturaleza del tipo de datos, es
decir si corresponde a un tipo primitivo o a un tipo complejo, veamos entonces con
detalle ambos casos:
Declaración de variables de tipo primitivo
45
//Declaración de la variable
tipo nombreVariable;
nombreVariable = valor;
Acabamos de ver una forma genérica de declarar variables en Java, sin embargo
como mencioné esta forma de hacerlo coincide muy bien con los tipos nativos, sin
embargo varía un poco con los tipos complejos (ArrayList, Scanner, etc.), a
continuación pondré la sintaxis general para declarar tipos de datos complejos en
Java y luego veremos varios ejemplos de ambos casos:
Declaración de variables de tipo complejo en Java
//Declaración de la variable
TipoComplejo nombreVariable;
46
//Se declara la variable y se le asigna un valor al mismo tiempo
Muy bien, con esto tenemos claro cómo declarar variables de tipo complejo en Java.
Quisiera hacer una aclaración a partir de ahora para no desviarnos de la parte
conceptual de Java. Cuando creamos una variable cuyo tipo de dato es complejo,
esta variable se convierte en lo que se conoce como objeto, es decir que si creamos
una variable de tipo ArrayList (un tipo complejo), tendremos realmente un objeto de
tipo ArrayList; esto se diferencia de las variables de tipos nativos, pues al asignarles
un valor, siguen siendo variables y no objetos, pero con los tipos complejos en Java,
estamos creando objetos como tal. En la sección de objetos y clases encontrarás mas
información de esto.
Ahora llegó el momento de hacer varios ejemplos tanto para tipos primitivos como
para tipos complejos
char michar = 'a';//Los char se ponen entre comilla simple ' '
47
//Declaración de tipo short
float mifloat = 2436.2456f; //se pone una f para decir que es float
Ahora veamos cómo declarar tipos de datos complejos, para el ejemplo, veremos
cómo crear tipos complejos para ArrayList, Scanner y String.
Declaración de variables con tipo complejo
String miString = "Cadena txt";//Los String se ponen entre comilla doble ""
48
Scanner miScanner = new Scanner(System.in);
Eso es todo para las variables de tipo complejo, para más información de estos tipos
ingresa a documentación oficial de Strings en Java o documentación oficial de la
clase Scanner o a documentación oficial de la clase ArrayList.
Bueno, esto ha sido todo en esta sección, en el momento, debemos tener claro cómo
se declaran las variables en Java y sus correspondientes tipos de datos, ya sean
primitivos o complejos, tenemos una pequeña noción de objetos y constructores en
Java.
De igual forma si tienes alguna duda, comentario y/o sugerencia, siempre puedes
hacer uso de la sección de comentarios y allí con gusto estaré al tanto de cualquier
comentario que pongan. El siguiente contenido habla acerca de las constantes y el
final en Java. Hasta pronto
Las constantes son útiles para datos o atributos para los cuales el valor no tiene por
qué cambiar, por ejemplo, el número del documento de identidad de una persona, lo
más normal es que dicho número no cambie o la fecha de nacimiento, una persona
tiene una fecha de nacimiento única e invariable, por lo tanto por ejemplo un atributo
"nacimiento" debería ser constante. Con esto podremos evitar modificaciones en
nuestro sistema que puedan causar problemas durante la ejecución del mismo.
49
En esta sección no hablaremos únicamente sobre cómo hacer que un dato cualquiera
no permanezca constante, sino también, veremos qué implicaciones tiene que una
clase, un método y un atributo sean constantes (final). Comencemos:
Constantes en Java:
La palabra clave que java ha reservado para definir constantes es la palabra "final". En
java es muy simple definir constantes, solo basta con ponerles el modificador final
antes de la declaración del tipo. Al definir un dato como constante le podremos
asignar un valor por primera vez y luego de eso no será posible cambiarle ese valor.
Una vez inicializado el dato, este no podrá cambiar su valor de ninguna forma.
Como se puede apreciar la sintaxis es bastante sencilla, sin embargo hay que tener
en cuenta algunas cosas: cuando vamos a declarar un dato cualquiera como final,
debemos asignarle inmediatamente un valor, es decir debemos inicializarlo de
inmediato, de lo contrario no podremos compilar nuestro código. En este punto debo
hacer una aclaración, un dato cualquiera que se encuentre por ejemplo al interior del
método main, debe ser inicializado de inmediato, sin embargo un atributo propio de
una clase no necesariamente debe ser inicializado en el mismo momento que se
declara dicho atributo, sino que puede ser inicializado también por un constructor,
dando así la posibilidad de que cada objeto especifico tenga su propio valor
constante, ingresa a continuacón para saber más sobre atributos y constructores.
Vemos el ejemplo:
Atributos constantes en java
50
//Notar que no ha sido inicializado
//Constructor
Constantes(String valor)
{
//Aquí se inicializó el atributo
atribConstante = valor;
}
}
51
//Primer constructor
//Ver que en éste le asigna valor al atributo final
Constantes(String valor)
{
//Aquí se inicializó el atributo
atribConstante = valor;
}
//Segundo constructor
//Éste no le asigna valor al atributo final
Constantes(int valor)
{
//Aquí se inicializó el atributo
atributo = valor;
//Pero no se le dio valor al atributo final
//atribConstante ="";
El modificador final también puede ser usado en las clases y en los métodos, de
manera similar a como se hace con los datos y los atributos, sin embargo el
significado que esto posee es diferente.
52
Final class. Clases final
Una clase final es una clase que no puede ser extendida, es decir ninguna otra clase
puede ser hija de ésta, será entonces una clase única y que no tendrá herencia o
herederos al no poder ser extendida. Veamos:
Declaramos una clase "Madre" que será final, esto quiere decir que no podrá ser
extendida por otra
//Método de la clase
public void metodo1()
{
System.out.print("Hola");
}
}
Declaramos una clase "Hija" que intentará extender de la clase "Madre", la cual es
final. Esto generará un error de compilación y no podremos ejecutar nuestro código.
53
//Atributos de la clase
private int atributo1;
private String atributo2;
//Método de la clase
public void metodo1()
{
System.out.print("Hola");
}
}
Métodos final
Un método final no puede ser redefinido por una clase hija. Esto quiere decir que si
yo defino un método final en la clase X y luego la clase Y es hija de la clase X,
entonces la clase Y no podrá cambiar la definición de dicho método, puesto que éste
es final. Veamos:
Declaramos una clase "Madre" que será tendrá un método final, esto quiere decir
que dicho método no podrá ser redefinido.
54
System.out.print("Hola");
}
}
Declaramos una clase "Hija" que extenderá de la clase "Madre" sin problemas e
intentará redefinir el método1. Esto generará un error de compilación y no podremos
ejecutar nuestro código.
//Método de la clase
public void metodo1()
{
System.out.print("Adios");
}
//Lo anterior genera error, pues no se puede redefinir un método final
55
En el ejemplo anterior acabamos de ver como hemos intentado redefinir el método
de la clase madre y esto no generaría un error, pues método1 es final. Quiero hacer
la aclaración aquí. Redefinir no es lo mismo que sobrecargar. Cuando sobrecargamos
un método estamos cambiando la firma del método y esto lo podemos hacer
independientemente de si el método es final o no. Sin embargo redefinir el método
es intentar hacer que la clase Hija tenga el mismo método (sin sobrecargarlo), pero
que haga algo diferente, esto es lo que no podremos hacer. En este caso intentamos
que el método mostrara en pantalla "Adios" pero no podemos hacerlo, mientras que
luego SOBRECARGAMOS el método1, poniéndole un parámetro de entrada y un
valor de retorno.
Sé que esto último es bastante confuso y avanzado, sin embargo quise tocar el tema
para ir abriéndome a otras cosas y mostrando el alto potencial que tiene Java. En
otras secciones hablaré con detalle acerca de herencia en Java, todo esto de clases
Hijas, clases Madre y varias cosas más. Recuerda que cualquier duda o problema lo
puedes poner en la sección de comentarios.
Pues bien, hecha esta última aclaración doy por finalizada esta sección. Espero que
todo haya quedado lo suficientemente claro o por lo menos la parte de datos y
atributos constantes. No te preocupes si no comprender bien la parte de clases y
métodos final, pues más adelante hablaré de ellos con más detalle. No olvides dejar
tus dudas, comentarios y/o sugerencias, en la sección de comentarios. Nos leemos.
56
asegurándonos que el usuario deba seguir una "ruta" especificada por nosotros para
acceder a la información.
Es muy posible que nuestras aplicaciones vayan a ser usadas por otros
programadores o usuarios con cierto nivel de experiencia; haciendo uso de los
modificadores de acceso podremos asegurarnos de que un valor no será modificado
incorrectamente por parte de otro programador o usuario. Generalmente el acceso a
los atributos se consigue por medio de los métodos get y set, pues es estrictamente
necesario que los atributos de una clase sean privados.
Nota: Siempre se recomienda que los atributos de una clase sean privados y por
tanto cada atributo debe tener sus propios métodos get y set para obtener y
establecer respectivamente el valor del atributo.
Nota 2: Siempre que se use una clase de otro paquete, se debe importar
usando import. Cuando dos clases se encuentran en el mismo paquete no es
necesario hacer el import pero esto no significa que se pueda acceder a sus
componentes directamente.
package aap.ejemplo1;
57
//Si un atributo es privado podemos crear método get y set ...
return contador;
package aap.ejemplo2;
59
{
package aap.ejemplo2;
package aap.ejemplo3;
60
private static int atributo2; //Atributo privado
return atributo2;
package aap.ejemplo3_1;
//System.out.println(atributo2);
//System.out.println(atributo3);
61
}
Modificador public
package aap.ejemplo4;
System.out.println("Método publico");
package paquete.externo;
62
public class ClaseExterna
System.out.println(Ejemplo4.atributo1);
private Sí No No No
default Sí Sí No No
protected Sí Sí Sí/No No
public Sí Sí Sí Sí
Debo aclarar algo en el caso del modificador de acceso protected y el acceso desde
suclases. Es un error común pensar que se puede crear un objeto de la clase madre y
luego acceder al atributo con acceso protected sin problemas, sin embargo esto no
es cierto, puesto que el modificador protected lo que nos permite es acceder al
atributo heredado desde el ámbito de la clase hija y no directamente. Sé que esto es
63
un poco confuso así que te invito a ver el video explicativo que aparece al comienzo
para quedar más claros.
La salida de datos en Java, es bastante sencilla pues basta con usar una línea de
código para hacerlo. Para mostrar datos por pantalla en nuestros programas Java.
Para mostrar texto por pantalla en Java no es necesario hacer uso de librerías
importadas ni similares, pues éstas y están incluidas en la librería java.lang que
siempre es importada por defecto. Para imprimir por pantalla, se usa la clase System,
el atributo out, y su método println() o
print() así: System.out.println() o System.out.print() notar que System es una clase y
siempre debe ir con la "S" mayúscula.
La primer pregunta que surge al ver los métodos útiles para salida de datos en Java
es en qué se diferencian (print() vs println()), básicamente ambos son útiles para
mostrar texto por pantalla y la única diferencia es que println() muestra el texto y
luego deja un salto de línea (como si presionara enter) mientras que print() no lo hace,
veamos un ejemplo para conocer bien la diferencia:
64
public class Salida
Muy bien, si ejecutamos este código, vamos a ver que el primer ciclo imprime los
números del 10 al 1 dejando una línea entre cada número, mientras que el segundo
imprime todos los número continuos sin dejar ningún espacio entre
65
ellos.
En el anterior código vimos que podemos incluir nuestros propios mensajes unidos
con valores de variables y que los podemos unir (concatenar) con el operador +
66
(como si estuviéramos sumando texto). Pero hay un detalle importante, hay que ser
cuidadosos al momento de concatenar números y operaciones numéricas
(especialmente la suma) pues podríamos tener errores. Si nos fijamos en el
penúltimo println() quisimos poner hora + 2 sin embargo Java entendió que
queríamos unir (concatenar) el valor de hora con un dos, dándonos como resultado
un 122 en vez del 14 que esperábamos, para solucionar esto, debemos poner la
operación matemática entre paréntesis, para que Java comprenda que queremos que
primero realice esa operación de suma y luego lo concatene, obteniendo así un 12 +
2 = 14 como esperábamos.
¡Genial! Hemos llegado al final de este contenido, ahora debes saber bien cómo
mostrar datos por pantalla y dominas la salida de datos en Java usando
concatenación y variables. Recuerda dejar tus comentarios en la sección de
comentarios. Tampoco olvides mirar las secciones de librerías en java y objetos y
clases. ¡Nos leemos!
Comencemos entonces nuestros ejemplos para la lectura por teclado en Java usando
la clase BufferedReader y InputStreamReader.
67
Lectura de datos por teclado con BufferedReader y InputStreamReader
La entrada de datos con estas dos clases se puede hacer un menos de tres líneas
según lo que necesitemos hacer, veremos cómo leer números y texto y las
particularidades de ambos casos al usar estas clases.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
68
String entrada = br.readLine(); //Se guarda la entrada (edad) en
una variable
Como pudimos ver en el código anterior, ha sido bastante sencillo obtener la entrada
del usuario y almacenar ese valor en una variable. El único "problema" es
que BufferedReader únicamente posee el método readLine() para leer la entrada y este
siempre retorna String, de modo que para obtener un número debemos leer primero
como String y luego enviarle dicho String al método parseInt() de la clase Integer. Hay
que ser muy cuidadosos con Integer.parseInt() pues si el usuario no ingreso un
número sino letras, se disparará una excepción que debemos controlar (más adelante
veremos esto con detalle).
69
import java.util.Scanner;
70
}
Con este código hemos podido realizar la lectura de datos del usuario muy fácil, pues
ya no nos tuvimos que preocupar por el tipo de dato, solo debemos usar el método
adecuado según sea entero, String, float, etc.
Muy bien, creo que ha sido todo en esta sección, espero todo haya sido muy claro,
no olvides dejar tus comentarios en la sección de comentarios. No olvides darle una
mirada a las secciones de librerias en java y objetos y clases.
Puede que parezca un tanto confuso, pero, en cierto modo, un condicional permite
tomar decisiones al interior de nuestros programas. Permitiendo así que la ejecución
71
de ese programa, se haga por un camino u otro a partir de si determinada regla o
condición es cierta.
Ahora bien, existen diferentes tipos de condicionales, cada uno tiene una utilidad y
funcionalidad diferente. Cada uno, considera diferentes situaciones que se pueden
llegar a presentar durante la ejecución de un algoritmo o programa en Java. Depende
entonces del conocimiento que tengamos acerca de cada uno de los condicionales
saber determinar correctamente cuando es necesario implementar uno u otro.
Tenemos a nuestra disposición los siguientes tipos de condicionales en Java:
Condicional If en Java
Condicional if-else en Java
Condicional Switch en Java
Muy bien, ahora que sabemos un poco acerca de las estructuras de control
condicionales (o simplemente condicionales en Java jeje) y que además sabemos que
existen varios tipos de estos, podemos comenzar a aprender y dominar cada uno de
72
estos tipos de condicionales en Java, durante los próximos artículos, vamos a hacerlo
en orden, para no complicarnos.
Existen diferentes tipos de ciclos o bucles en Java, cada uno tiene una utilidad para
casos específicos y depende de nuestra habilidad y conocimientos poder determinar
en qué momento es bueno usar alguno de ellos. Tenemos entonces a nuestra
disposición los siguientes tipos de ciclos en Java:
Como mencioné anteriormente, cada uno de estos ciclos en Java tiene ciertas
características que lo hacen útil para algunos casos específicos. A lo largo de los
contenidos de esta sección de ciclos en Java veremos cada uno de estos al detalle,
aprendiendo durante el proceso los componentes, sintaxis y esas características
particulares que permiten decidir cual usar en qué momento, veremos también el
concepto de contador y acumulador que parte de la existencia de los ciclos en Java.
Muy bien, ahora que sabemos un poco acerca de las estructuras de control cíclicas (o
simplemente ciclos) y que además sabemos que existen varios tipos de ciclos,
podemos comenzar a aprender y dominar cada uno de éstos, vamos a hacerlo en
orden, para no complicarnos, así que vamos a la sección de Ciclo For (o en español
ciclo para), recuerda también que al igual que en todas las secciones de este sitio,
puedes dejar tus comentarios, ayudando así a la permanente evolución de la pagina.
74
Estamos ahora en capacidad de determinar los componentes esenciales para un ciclo
for.
Vamos a ver ahora la sintaxis de un ciclo for en Java, así estaremos listos para usarlos
en nuestros programas de ahora en adelante.
....
....
Bloque de Instrucciones....
....
....
Vamos ahora a ver línea por línea el anterior código para comprender todo y quedar
claros. Posteriormente veremos un ejemplo con valores reales.
Línea 1:
En esta línea está prácticamente todo lo esencial de un ciclo for. La sintaxis es simple,
tenemos una variable de control llamada i que es tipo entero (int), cabe notar que la
variable se puede llamar como nosotros lo deseemos y puede ser del tipo de
queramos también, sin embargo en la mayoría de los casos se usa la "i" como nombre
y el entero como tipo, pero somos libres de modificar esto a nuestro gusto. Esta
variable "i" se le asigna un valor inicial que puede ser cualquier número
75
correspondiente al tipo de dato asignado. Posteriormente lo que haremos será
especificar hasta donde irá nuestro ciclo por medio del valor final, ten en cuenta que
cada uno de estos componentes es separado por un punto y coma ";", también es
importante saber que la condición final puede ser cualquier cosa, mayor, menor,
mayor o igual, menor o igual, sin embargo no tiene sentido que la condición sea por
ejemplo un igual, pues nuestra variable de control siempre va a cambiar entre
valores, menores o mayores que el valor final deseado, si fuera un igual no
tendríamos un error de sintaxis, pero nuestro for básicamente no haría nada de nada.
Finalmente el ultimo componente de esta primer línea es el tamaño del paso, este
componente se especifica aumentando en la cantidad deseada la variable de control.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como seguramente ya sabrás
indica que allí comienza el bloque de instrucciones que se ejecutaran cada vez que el
ciclo de un "giro". Esta llave no es del todo obligatoria, sin embargo si no la ponemos
solo se ejecutara dentro de nuestro ciclo la primera línea inmediatamente posterior a
la declaración del ciclo, de modo que si deseamos que se ejecuten varias líneas
dentro de nuestro ciclo, debemos usar las llaves
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo
de manera iterativa durante la ejecución del ciclo, este bloque podrá tener la
cantidad de líneas necesarias incluso, como veremos más adelante dentro de estas
podría haber uno o más ciclos, así que podrías tener todo un programa dentro de un
ciclo.
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como
seguramente ya sabrás esta nos indica que allí termina el bloque del ciclo for y se
dará por terminada la ejecución de este para continuar ejecutando el resto del
algoritmo.
76
Ejemplos de Ciclo For en Java
Vamos a retomar el ejemplo anterior, donde deseábamos sacar los números pares
entre el numero 500 y el 1000, es un ejemplo sencillo con el que nos aseguraremos
de haber comprendido bien lo anterior:
Solución Ejemplo 1:
for(int i=500;i<=1000;i+=2)
System.out.println(i);
for(int i=500;i<=1000;i+=2)
System.out.println(i);
77
}
Ahora veremos otro ejemplo sencillo en cual haremos que el ciclo for también haga
sus iteraciones en sentido inverso, es decir disminuyendo el valor de la variable de
controlvamos a imprimir por pantalla una cuenta regresiva desde el número 100
hasta el 0, veamos:
Solución Ejemplo 2:
Para este caso, debido a que queremos ir de un número mayor a uno más pequeño,
por lo tanto para este ejemplo el valor inicial será 100 y el valor final será 0.
Adicional, el tamaño de paso será de 1 negativo, es decir, -1, así:
System.out.println(i);
78
{
System.out.println(i);
Para este ejemplo haremos algo un poco más complejo. El ejemplo consiste en contar
al interior de un ciclo for, cuántos números entre el 0 y el 10.000 son múltiplos del
20. Para ello haremos uso del operador % (módulo) que obtiene el residuo de una
división y también usaremos un pequeño condicional para verificar que el módulo sea
cero al dividir por 20.
Nota: El operador de módulo (%) obtiene el residuo de una división, por tanto cuando
el residuo es cero implica que la division es exacta y el dividendo es un múltiplo del
divisor. Por ejemplo 10%3 nos dará el residuto de dividir 10 entre 3, el cual es 1, si
calculamos 120%20 nos dará cero, pues 120 es múltiplo de 20 (20 * 6 = 120).
Solución Ejemplo 3:
Para este caso el valor inicial será 0 y el valor final será 10000. Adicional, el tamaño
de paso será de 1 (este es el caso más común). Al interior del ciclo, en cada iteración
verificaremos si el número en el que estamos es divisible por 20 o no y en caso
afirmativo aumentaremos el contador en una unidad así:
79
if(i % 20 == 0) //Preguntamos si el residuo es 0 (es múltiplo de 20)
System.out.println(contador);
80
//Si no es múltiplo no hacemos nada
System.out.println(contador);
Este ciclo for nos permitirá saber que existen 501 múltiplos del número 20 en los
números del 0 al 10000.
En efecto los ciclos for, son bastante útiles, sin embargo desde el punto de vista de la
eficiencia, es recomendable evitarlos en la medida de lo posible, siempre que vayas a
usar un ciclo for, deberías preguntarte primero si es totalmente necesario o si existe
una manera más efectiva de hacerlo. Evidentemente habrá situaciones en las que
será casi que imprescindible usar el ciclo for, pues por algo existen. Está entonces en
nuestra habilidad determinar cuándo usarlos y mejor aún cómo usarlos de manera
efectiva.
Muy bien! De momento es todo en esta sección; podemos entonces continuar ahora
con el siguiente contenido que son lss funciones, recuerda también dejar tus
comentarios y/o preguntas en la sección de comentarios
Vamos a ver ahora cómo es la sintaxis de un ciclo while en Java, así estaremos listos
para usarlos en nuestros programas de ahora en adelante cada vez que lo
necesitemos.
La sintaxis de un ciclo while es incluso más simple y "legible" que la del ciclo for en
Java, pues simplemente requerimos tener clara una condición de parada. En realidad,
en la mayoría de los lenguajes de alto nivel la manera de escribir un ciclo while (la
sintaxis) es incluso muy similar, así que con tan solo tener bien clara una condición de
finalización para el ciclo tendremos prácticamente todo hecho.
....
....
82
Bloque de Instrucciones....
....
....
Vamos entonces a ver línea por línea el anterior código para comprender todo y
quedar claros. Posteriormente veremos el ejemplo planteado anteriormente y su
solución.
Línea 1:
En la línea 2 tenemos una llave abriendo "{" lo cual como sabemos indica que allí
comienza un bloque de instrucciones que se ejecutaran cada vez que el ciclo de un
"giro". Esta llave no es del todo obligatoria, sin embargo, si no la ponemos solo se
ejecutara dentro de nuestro ciclo while la primera línea inmediatamente posterior a
la declaración del ciclo, de modo que si deseamos que se ejecuten varias líneas
dentro de nuestro ciclo, debemos usar las llaves
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo
de manera iterativa durante la ejecución del ciclo, este bloque podrá tener la
cantidad de líneas necesarias incluso, como veremos más adelante dentro de estas
podría haber uno o más ciclos, así que podrías tener todo un programa dentro de un
ciclo.
83
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como
seguramente ya debemos saber esta nos indica que allí termina el bloque del ciclo
while y se dará por terminada la ejecución de este para continuar ejecutando el resto
del algoritmo.
Vamos a retomar el ejemplo anterior, donde queremos hacer que nuestro programa
le pida a un usuario una serie de números cualquiera y que solo dejaremos de hacerlo
cuando el usuario ingrese un número mayor a 100, una vez mas es un ejemplo
sencillo con el que nos aseguraremos de haber comprendido bien todos los
conceptos anteriores:
Solución Ejemplo 1:
Para solucionar esto, debemos tener clara cuál va a ser la condición que se debe
cumplir para que el ciclo este pidiendo el numero contantemente, el ciclo se va a
detener solo cuando el numero ingresado sea mayor que 500, así que la condición
para que se siga ejecutando es que el numero sea menor o igual a 500, ¿Comprender
la lógica?, si para que se detenga el número debe ser mayor a 500, entonces para
seguirse ejecutando el número debe ser menor o igual a 500, veámoslo entonces
84
while(numero <= 500)
numero = sc.nextInt();
import java.util.Scanner;
numero = sc.nextInt();
85
}
Nota: Si no es clara alguna de las líneas de estos códigos, te recomiendo visitar los
contenidos anteriores (Entrada de Datos, Estructura de un Programa) o también
puedes dejar un comentario al final de la sección con tu pregunta.
En efecto los ciclos while, son bastante útiles, sin embargo, desde el punto de vista
de la eficiencia al igual que con los ciclos for, es recomendable evitarlos en la medida
de lo posible, siempre que vayas a usar un ciclo while o cualquier tipo de ciclo en
realidad, deberías preguntarte primero si es totalmente necesario o si existe una
manera más efectiva de hacerlo. Evidentemente habrá situaciones en las que será
casi que imprescindible usar el ciclo, pues por algo existen, esta entonces en nuestra
habilidad determinar cuándo usarlos y mejor aun como usarlos de manera efectiva.
Muy bien. De momento, es todo en esta sección, recuerda también dejar tus
comentarios y/o preguntas en la sección de comentarios.
86
¿Cómo funciona un Ciclo Do-While?
De nuevo, en el caso del do-while las instrucciones se ejcutan al menos una vez, lo
cual nos permitíría solicitar el número al usuario dentro del ciclo, evitando repetir la
asignación de la variable. Nuestro código queda más organizado así.
Vamos a ver ahora cómo es la sintaxis de un ciclo do-while en Java, así estaremos
listos para usarlos en nuestros programas de ahora en adelante cada vez que lo
necesitemos
La sintaxis de un ciclo do-while es un tanto más larga que la del ciclo while en Java,
sin embargo no se hace más complicado, de hecho con tan solo tener bien clara una
condición de finalización para el ciclo tendremos prácticamente todo terminado.
do
....
87
....
Bloque de Instrucciones....
....
....
Vamos entonces a ver línea por línea el anterior código para comprender todo y
quedar claros. Posteriormente veremos el ejemplo planteado anteriormente y su
solución.
Línea 1:
Esta línea es por decirlo así, la parte novedosa del ciclo do-while, esta expresión no
evalúa ninguna condición ni nada, simplemente da paso directo al bloque de
instrucción y luego permite la evaluación de la condición.
Línea 2:
En la línea 2 tenemos una llave abriendo "{" lo cual como sabemos indica que allí
comienza un bloque de instrucciones que se ejecutaran cada vez que el ciclo de un
"giro". Esta llave no es del todo obligatoria, sin embargo, si no la ponemos solo se
ejecutará dentro de nuestro ciclo la primera línea inmediatamente posterior a la
instrucción do, de modo que si deseamos que se ejecuten varias líneas dentro de
nuestro ciclo, debemos usar las llaves. En lo personal, es preferible poner siempre las
llaves sin importar cuantas líneas se vayan a ejecutar, es una buena práctica de
programación y te puede evitar dolores de cabeza
Línea 3 a 7:
En estas líneas es donde estarán todas las operaciones que queramos llevar a cabo
de manera iterativa durante la ejecución del ciclo, este bloque podrá tener la
cantidad de líneas necesarias incluso, como veremos más adelante dentro de estas
podría haber uno o más ciclos, así que podrías tener todo un programa dentro de un
ciclo.
88
Línea 8:
En esta última línea hacemos uso de la llave cerrando "}", una vez más como
seguramente ya debemos saber esta nos indica que allí termina el bloque de
instrucciones que se ejecutarán de manera cíclica y se dará por terminada la
ejecución de este para continuar ejecutando el resto del algoritmo.
Línea 9:
Vamos a retomar el ejemplo anterior, donde queremos hacer que nuestro programa
le pida a un usuario una serie de números cualquiera y que solo dejaremos de hacerlo
cuando el usuario ingrese un número mayor a 500, una vez más es un ejemplo
sencillo con el que nos aseguraremos de haber comprendido bien todos los
conceptos anteriores, vamos a ver cómo hacer lo mismo con dos tipos de ciclos
diferentes (el while y el do-while), sin embargo vamos a ver como con uno es más
directo que con el otro, mejorando la calidad de nuestro código:
Solución Ejemplo 1:
Para solucionar esto, debemos tener clara cuál va a ser la condición que se debe
cumplir para que el ciclo este pidiendo el numero constantemente. El ciclo se va a
detener solo cuando el numero ingresado sea mayor que 500, así que la condición
89
para que se siga ejecutando es que el numero sea menor a 500. Si para que se
detenga, el numero debe ser mayor a 500, entonces para seguirse ejecutando el
numero debe ser menor o igual a 500, veámoslo entonces
int numero;
do
numero = sc.nextInt();
import java.util.Scanner;
int numero;
90
do
numero = sc.nextInt();
Nota 2: Si no comprendes alguna de las líneas de estos códigos, te recomiendo visitar
los contenidos anteriores (Entrada de Datos, Salida de
Datos, Librerías, Comentarios y Estructura de un Programa) o también puedes dejar
un comentario al final de la sección con tu pregunta.
Cuando vemos por primera vez el ciclo do-while, se nos viene de inmediato la
pregunta de cuál es la diferencia entre un do-while y un while. Y no quedamos muy
seguros de poder saber cuándo usar uno u otro, así que aquí te explico.
91
Ejemplo de diferencias entre un do-while en Java y un while
Como siempre, un ejemplo puede ayudarnos mucho más a comprender cuándo usar
un do-while en lugar de un while en Java, así que vamos a implementar el siguiente
ejemplo:
Implementando el ejemplo del menú de opciones con un ciclo do-while (el recomendado)
import java.util.Scanner;
int opcion = 0;
do
92
opcion = sc.nextInt();
Como puedes ver y comprobar, es un código sencillo y mientras que el usuario del
programa no ingrese cero en la consola, el programa seguirá mostrando las diferentes
opciones.
Es importante notar que, incluso aunque la variable "opcion" se inició en cero, el ciclo
do-while mostró las opciones sin problemas y no llegó a evaluar su valor, sino
únicamente después de que el usuario la ingresó. Veamos ahora el mismo ejercicio,
pero usando un ciclo while.
Implementando el ejemplo del menú de opciones con un ciclo while (no recomendado)
import java.util.Scanner;
93
//Mostramos el menú hasta que la opción sea cero
while(opcion != 0)
opcion = sc.nextInt();
En este caso, vemos que, por supuesto, con el ciclo while también podemos
conseguir lo mismo, PERO modificando algunas cosas con relación a la opción. En
general, el mayor aspecto negativo de usar un while en este caso, en lugar de un do-
while, es que ya hemos asignado la variable opción sin siquiera habérsela solicitado al
usuario por primera vez, lo cual nos obliga a darle un valor inicial a la variable
"opcion" (un -1), para asegurarnos de que el ciclo se ejecute al menos una vez y el
usuario tenga la opción de ver el menú e ingresar la acción que desea ejecutar.
Muy bien, con eso deberíamos tener un caso claro en el que es mejor usar un do-
while que un while en Java. Veamos ahora algunas conclusiones.
En efecto, los ciclos do-while son bastante útiles. Sin embargo, como con cualquier
ciclo desde el punto de vista de la eficiencia al igual que con los ciclos for, es
recomendable evitarlos en la medida de lo posible, siempre que vayas a usar un ciclo
do-while o cualquier tipo de ciclo en realidad, deberías preguntarte primero si es
94
totalmente necesario o si existe una manera más efectiva de hacerlo. Evidentemente
habrá situaciones en las que será casi que imprescindible usar el ciclo, pues por algo
existen. Está entonces en nuestra habilidad determinar cuándo usarlos y mejor aún
cómo usarlos de manera efectiva.
Finalmente, tener claro, tal como se mostró en este artículo, cuándo usar un do-while
en lugar de cualquier otro ciclo de Java.
Muy bien, de momento, es todo en esta sección, podemos entonces continuar ahora
con el siguiente contenido. Recuerda también dejar tus comentarios y/o preguntas
en la sección de comentarios.
95