Programación en Java
Programación en Java
Curso: Programación en Java
Java
1. Introducción: ¿Por Qué Java?
1.1. ¿Qué es Java?
Java es un lenguaje de programación de ordenadores, desarrollado por Sun
Microsystems en 1995 (compañía que fue posteriormente absorbida
por Oracle, en 2010).
Hay varias hipótesis sobre su origen, aunque la más difundida dice que se
creó para ser utilizado en la programación de pequeños dispositivos, como
aparatos electrodomésticos (desde microondas hasta televisores
interactivos). Se pretendía crear un lenguaje con algunas de las
características básicas de C++, pero que necesitara menos recursos y que
fuera menos propenso a errores de programación.
De ahí evolucionó (hay quien dice que porque el proyecto inicial no acabó
de funcionar) hasta convertirse en un lenguaje muy aplicable a Internet y
programación de sistemas distribuidos en general.
Curso: Programación en Java
www.oracle.com/technetwork/java/javase/downloads
Pero el kit de desarrollo (JDK) no incluye ningún editor con el que crear nuestros
programas. Podríamos instalar un "editor genérico", porque tenemos muchos
gratuitos y de calidad, como Notepad++. Aun así, si nuestro equipo es
razonablemente moderno, puede ser preferible instalar un entorno integrado,
como NetBeans, que encontraremos en
netbeans.org
Si hacemos clic en "Download", se nos llevará a la página de descargas, en la que
tenemos varias versiones para elegir. Lo razonable "para un novato" es descargar
la versión para "Java SE" (Standard Edition; las alternativas son otros lenguajes,
como PHP o C++, versiones profesionales como Java EE -Enterprise Edition-, o
una versión que engloba todas estas posibilidades).
Es posible (que también podamos escoger el Español como idioma, en vez del
inglés (sólo en algunas versiones).
La instalación no se podrá completar si no hemos instalado Java antes, pero si lo
hemos hecho, debería ser simple y razonablemente rápida:
Y al final quizá se nos pregunte si queremos permitir que se recopile estadísticas
sobre nuestro uso:
Todo listo. Tendremos un nuevo programa en nuestro menú de Inicio. Podemos
hacer doble clic para comprobar que se ha instalado correctamente, y debería
aparecer la pantalla de carga:
Y después de un instante, la pantalla "normal" de NetBeans:
Ya estaríamos listos para empezar a crear nuestro primer programa en Java, pero
eso queda para la siguiente lección...
: Linux)
De paso, podemos aprovechar para instalar Eclipse, que también se suele poder
escoger desde el gestor de paquetes de la mayoría de distribuciones de Linux:
En ambos casos, se nos avisará de que esos paquetes dependen de otros que
también habrá que instalar:
Cuando hagamos clic en el botón "Aplicar", se descargarán todos los paquetes
(casi 200 Mb en total) y se instalarán (debería ocupar algo más de 300 Mb de
disco). A partir de entonces, en nuestro menú, en el apartado de Programación (o
Desarrollo), tendremos un acceso a Eclipse. Si entramos, deberíamos ver algo
parecido a esto:
(Los detalles de cómo empezar a programar con Eclipse los veremos en el
próximo tema)
Curso: Programación en Java
Java
3. Nuestro Primer Programa
3.1. Un programa que escribe "Hola Mundo"
Comenzaremos por crear un pequeño programa en modo texto. Este primer
programa se limitará a escribir el texto "Hola Mundo!" en la pantalla. En primer
lugar, veremos cómo es este programa, luego comentaremos un poco (todavía
con poco detalle) las órdenes que lo forman y finalmente veremos cómo probar
ese programa con distintos entornos.
// HolaMundo.java
// Aplicación HolaMundo de ejemplo
class HolaMundo {
public static void main( String args[] ) {
System.out.print( "Hola Mundo!" );
}
}
Puede parecer complicado para ser un primer programa. Es cierto, lo es. Si Java es tu
primer lenguaje de programación, tienes que asumirlo: Java es así, no pretende que lo
simple sea simple, sino que lo complicado no sea terrible. Por eso, los grandes proyectos
serán más fáciles de mantener y menos propensos a errores que con otros lenguajes más
antiguos como BASIC o C, pero los programas básicos parecerán innecesariamente
complejos.
Dentro de poco veremos cómo teclearlo. Será importante respetar las mayúsculas y
minúsculas exactamente como están en el ejemplo. El hecho de escribir "system" en vez
de "System" hará que obtengamos un error de compilación.
El contenido de cada bloque del programa se debe detallar entre llaves. Por eso,
la línea "print" aparece después de "main" y rodeada por llaves:
class HolaMundo {
public static void main( String args[] ) {
System.out.print( "Hola Mundo!" );
}
}
3.2.5. Comentarios
Las dos primeras líneas del programa son:
// HolaMundo.java
// Aplicación HolaMundo de ejemplo
Estas líneas, que comienzan con una doble barra inclinada (//) son comentarios.
Nos sirven a nosotros de aclaración, pero nuestro ordenador las ignora, como si
no hubiésemos escrito nada.
Si queremos que un comentario ocupe varias líneas, o sólo un trozo de una línea,
en vez de llegar hasta el final de la línea, podemos preceder cada línea con una
doble barra, como en el ejemplo anterior, o bien indicar dónde queremos empezar
con "/*" (una barra seguida de un asterisco) y dónde queremos terminar con "*/"
(un asterisco seguido de una barra), así:
/* Esta es la
Aplicación HolaMundo
de ejemplo */
```java
```java
// HolaMundo2.java
// Segunda aplicación HolaMundo de ejemplo
class HolaMundo2 {
public static void main( String args[] ) {
System.out.print( "Hola" );
System.out.print( " " );
System.out.print( "Mundo!" );
}
}
// HolaMundo3.java
// Tercera aplicación HolaMundo de ejemplo
class HolaMundo3 {
public static void main( String args[] ) {
System.out.println( "Hola..." );
System.out.println( "Mundo!" );
}
}
Curso: Programación en Java
Java
3.3. Compilar y lanzar el programa desde línea de
comandos
Si quieres aprender a programar, deberías no tener miedo a la "línea de
comandos", esa pantalla que típicamente tiene fondo negro y letras blancas, y en
la que se teclean las órdenes en vez de hacer clic. En Linux normalmente se le
llama "Terminal" y en Windows puede aparecer como "Símbolo del sistema".
Si has instalado el JDK pero ningún entorno de desarrollo, podrías abrir esa línea
de comandos, lanzar desde ella un editor, después compilar el programa y
finalmente, si todo ha ido bien, lanzar el programa ejecutable resultante.
gedit HolaMundo.java
javac HolaMundo.java
Si nuestro programa contiene algún error, se nos mostrará un mensaje que dirá la
línea y columna en la que se ha detectado. Si no es así, podremos poner el
programa en funcionamiento tecleando:
java HolaMundo
En Windows, si todo va bien (cosa que no siempre ocurre), los pasos serían los
mismos, pero el editor que viene preinstalado es el bloc de notas (notepad), luego
comenzaríamos por teclear:
notepad HolaMundo.java
Java
3.5. Manejo básico de NetBeans
Vamos a ver qué pasos dar en NetBeans para crear un programa como ese.
// HolaMundoNetBeans.java
// Aplicación HolaMundo de ejemplo, para compilar con NetBeans
package prueba01;
Para crear nuestro proyecto con Eclipse, deberemos entrar al menú "File"
(Archivo), y en la opción "New" (Nuevo) tendremos "Java Project":
Se nos pedirá un nombre para el proyecto, y que confirmemos si se trata de un
nuevo proyecto (como es nuestro caso) o si queremos partir de otros fuentes que
ya existen (no por ahora):
Aparecerá nuestro proyecto vacío:
Y ahora deberemos añadir una clase a nuestro proyecto (File / New / Class):
Se nos preguntará el nombre para la clase (junto con otros datos que por ahora no
necesitamos cambiar):
Y nos aparecerá un esqueleto de clase (algo más vacío que en el caso de
NetBeans):
Sobre ese esqueleto, escribiremos (o copiaremos y pegaremos) los detalles de
nuestro fuente:
Y si pulsamos el botón "Run", el programa se compilará y se pondrá en marcha, y
su resultado se mostrará en la parte inferior de la pantalla, en la pestaña
"Console":
Ejercicio propuesto 3.6.1: Crea un programa en Java, usando Eclipse, que te
salude en pantalla por tu nombre (por ejemplo, "Hola, Nacho").
4. Variables. Operaciones
matemáticas básicas. Pedir datos al
usuario
Por: Nacho Cabanes
Curso: Programación en Java
Java
4. Variables. Operaciones Matemáticas
Básicas. Pedir Datos Al Usuario
4.1. Las variables.
Curso de Java,por Nacho Cabanes
// Suma1.java
// Ejemplo de suma con datos prefijados
// Introducción a Java, Nacho Cabanes
class Suma1 {
Con eso, vamos a ver un programa sume dos números enteros (de no más
de 9 cifras) prefijados y muestre en pantalla el resultado:
// Suma2.java
// Ejemplo de suma con variables
// Introducción a Java, Nacho Cabanes
class Suma2 {
System.out.println(
"La suma de 56 y 23 es:" ); // Muestro un mensaje de aviso
System.out.println(
primerNumero+segundoNumero ); // y el resultado de la operación
}
}
Operación matemática
Símbolo correspondiente
Suma
Resta
Multiplicación
División
Resto de la división
%
Hemos visto un ejemplo de cómo calcular la suma de dos números; las
otras operaciones se emplearían de forma similar. La única operación
"menos habitual" es el resto de la división. Por ejemplo, si dividimos 14
entre 3, obtenemos 4 como cociente y 2 como resto, de modo que el
resultado de 14 % 3 sería 2.
// Suma3.java
// Ejemplo a las variables introducidas por el usuario
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class Suma3 {
Son varias novedades, pero tampoco debería resultar difícil. Este programa
escribirá algo como (dependiendo de los datos que introduzca el usuario):
// Suma3b.java
// Dos variables declaradas a la vez
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class Suma3b {
public static void main( String args[] ) {
Scanner teclado;
int primerNumero, segundoNumero;
a = a + 2;
a += 2;
b *= 10;
a = a+1;
a += 1;
a++;
Pero hay una diferencia si ese valor se asigna a otra variable "al mismo
tiempo" que se incrementa/decrementa:
int c = 5;
int b = c++;
int c = 5;
int b = ++c;
a = 5;
a++;
a*=2;
a-=3;
a%=5;
a=a+7;
4.5. Otros tipos de datos numéricos
No sólo se puede almacenar números enteros de hasta 9 cifras. Java nos
permite usar también otros tipos de datos numéricos:
-8bytes
8 bytes
Los datos de tipo byte, short, int y long sirven para almacenar
números enteros, de mayor o menor tamaño. Si se desborda ese tamaño,
el programa se interrumpirá con un error, como en este ejemplo:
// DesbordarByte.java
// Ejemplo de desbordamiento de una variable
// Introducción a Java, Nacho Cabanes
class DesbordarByte {
public static void main( String args[] ) {
byte dato = 100;
System.out.print( "El dato inicialmente es: " );
System.out.println( dato );
dato += 100;
System.out.print( "Si sumamos 100, el dato ahora es: " );
System.out.println( dato );
}
}
Que mostraría:
Por su parte, los datos float y double permiten almacenar números reales
(con cifras decimales), que pueden almacenar los números de forma
incorrecta si tienen más cifras que la permitida por ese tipo de datos, como
en este ejemplo:
// PrecisionFloat.java
// Ejemplo de límite de precisión de un dato float
// Introducción a Java, Nacho Cabanes
class PrecisionFloat {
public static void main( String args[] ) {
float dato = 1.23456789f;
System.out.print( "El dato inicialmente es: " );
System.out.println( dato );
dato += 1000;
System.out.print( "Si sumamos 1000, el dato ahora es: " );
System.out.println( dato );
}
}
Que escribiría:
Por ejemplo, se podría sumar dos números reales de forma similar a como
hemos visto para dos números enteros:
// SumaFloat.java
// Sumar dos números reales
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class SumaFloat {
Scanner teclado;
float primerNumero, segundoNumero;
5. Comprobación de condiciones
Por: Nacho Cabanes
Curso: Programación en Java
Java
5. Comprobación De Condiciones
5.1. if
En cualquier lenguaje de programación es habitual tener que comprobar si
se cumple una cierta condición. La forma más simple de conseguirlo es
empleando una construcción que recuerda a:
if (condición) { órdenes }
Por ejemplo,
// If1.java
// Comprobación de condiciones con "if" 1: mayor que
// Introducción a Java, Nacho Cabanes
class If1 {
int x = 10;
if (x > 5) {
System.out.println( "x es mayor que 5" );
}
}
}
Nota: Las llaves sólo serán imprescindibles cuando haya que hacer varias
cosas. Si sólo queremos dar un paso en caso de que se cumpla la
condición, no es necesario emplear llaves (aunque puede ser recomendable
usar siempre las llaves, para no olvidarlas si más adelante ampliamos ese
fragmento del programa):
// If2.java
// Comprobación de condiciones con "if" 2: sin llaves
// Introducción a Java, Nacho Cabanes
class If2 {
int x = 10;
if (x > 5)
System.out.println( "x es mayor que 5" );
}
}
Por ejemplo,
// If3.java
// Comprobación de condiciones con "if" 3: else
// Introducción a Java, Nacho Cabanes
class If3 {
int x = 10;
if (x > 5) {
System.out.println( "x es mayor que 5" );
}
else {
System.out.println( "x es menor o igual que 5" );
}
}
}
Operado
Operación
r
== Igual a
Así, por ejemplo, para ver si el valor de una variable "x" es distinto de 5,
escribiríamos:
// If4.java
// Comprobación de condiciones con "if" 4: distinto de
// Introducción a Java, Nacho Cabanes
class If4 {
int x = 10;
if (x != 5) {
System.out.println( "x no vale 5" );
}
else {
System.out.println( "x vale 5" );
}
}
}
// If5.java
// Comprobación de condiciones con "if" 5: igual a
// Introducción a Java, Nacho Cabanes
class If5 {
int x = 10;
if (x == 70) {
System.out.println( "x vale 70" );
}
else {
System.out.println( "x no vale 70" );
}
}
}
Operado
Significado
r
&& Y
|| O
! No
Por ejemplo, la forma de decir "si a vale 3 y b es mayor que 5, o bien a vale
7 y b no es menor que 4" sería:
// If6.java
// Comprobación de condiciones con "if" 6: varias condiciones
// Introducción a Java, Nacho Cabanes
class If6 {
int a = 7;
int b = 1;
5.5. switch
Si queremos comprobar varios posibles valores para una misma
variable, podemos utilizar varios if - else - if - else - if encadenados, pero
tenemos una forma más elegante de elegir entre distintos valores posibles
que tome una cierta expresión. Su formato es éste:
switch (expresion) {
case valor1: sentencias1; break;
case valor2: sentencias2; break;
case valor3: sentencias3; break;
// ... Puede haber más valores
}
Un ejemplo sería:
// Switch1.java
// Comprobación de condiciones con "switch" 1: ejemplo básico
// Introducción a Java, Nacho Cabanes
class Switch1 {
int mes = 2;
switch(mes) {
case 1: System.out.println( "El mes es Enero" ); break;
case 2: System.out.println( "El mes es Febrero" ); break;
case 3: System.out.println( "El mes es Marzo" ); break;
}
}
}
// Switch2.java
// Comprobación de condiciones con "switch" 2: default
// Introducción a Java, Nacho Cabanes
class Switch2 {
int mes = 4;
switch(mes) {
case 1: System.out.println( "El mes es Enero" ); break;
case 2: System.out.println( "El mes es Febrero" ); break;
case 3: System.out.println( "El mes es Marzo" ); break;
default: System.out.println( "No es entre Enero y Marzo" ); break;
}
}
}
// Switch3.java
// Comprobación de condiciones con "switch" 3: casos en cascada
// Introducción a Java, Nacho Cabanes
class Switch3 {
int x = 5;
switch ( x ) {
case 1:
case 2:
case 3:
System.out.println( "El valor de x estaba entre 1 y 3" );
break;
case 4:
case 5:
System.out.println( "El valor de x era 4 o 5" );
break;
case 6:
System.out.println( "El valor de x era 6" );
int valorTemporal = 10;
System.out.println( "Operaciones auxiliares completadas" );
break;
default:
System.out.println( "El valor de x no estaba entre 1 y 6" );
break;
}
}
}
// Switch4.java
// Comprobación de condiciones con "switch" 4: cadenas de texto
// (Para Java 7 o superior)
// Introducción a Java, Nacho Cabanes
class Switch4 {
switch(nombre) {
case "uno": System.out.println( "Hola, uno" ); break;
case "yo": System.out.println( "Hola, tú" ); break;
case "otro": System.out.println( "Bienvenido, otro" ); break;
default: System.out.println( "Nombre desconocido" ); break;
}
}
}
x = (a == 10) ? b*2 : a ;
En este caso, si "a" vale 10, la variable "x" tomará el valor de b*2, y en caso
contrario tomará el valor de a. Esto también se podría haber escrito de la
siguiente forma, más larga pero más legible:
if (a == 10)
x = b*2;
else
x = a;
// Condicional1.java
// Ejemplo de "operador condicional" (o ternario)
// Introducción a Java, Nacho Cabanes
class Condicional1 {
int n = 4;
int par;
par = n % 2 == 0 ? 1 : 0;
System.out.print( "\\"par\\" vale... " );
System.out.println( par );
}
}
Curso: Programación en Java
Java
6. Bucles: Partes Del Programa Que Se
Repiten
Con frecuencia tendremos que hacer que una parte de nuestro programa se
repita, bien sea mientras se cumpla una condición o bien un cierto número
prefijado de veces. Es lo que llamaremos un "bucle".
6.1. while
La orden "while" que una parte del programa se repita mientras se cumpla
una cierta condición. Su formato será:
while (condición)
sentencia;
// While1.java
// Comprobación repetitiva de condiciones con "while"
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class While1 {
// Contar1a5.java
// Contar del 1 al 5 con "while"
// Introducción a Java, Nacho Cabanes
class Contar1a5 {
int x = 1;
while (x <= 5) {
System.out.println( x );
x++;
}
}
}
6.2. do-while
Existe una variante de "while", que permite comprobar la condición al final
de la parte repetitiva, en vez de hacerlo antes de comenzar. Es el
conjunto do..while, cuyo formato es:
do {
sentencia;
} while (condición)
Con "while", si la condición era falsa desde un principio, los pasos que se
indicaban a continuación de "while" no llegaban a darse ni una sola vez; con
do-while, las "sentencias" intermedias se realizarán al menos una vez.
import java.util.Scanner;
class DoWhile1 {
int password;
do {
if (password != 1234)
System.out.println( "No es válida." );
}
while (password != 1234);
}
}
// Contar1a5b.java
// Contador con "do-while"
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class Contar1a5b {
int x = 1;
do {
System.out.println( x );
x++;
}
while (x <= 5);
}
}
6.3. for
Una tercera forma de conseguir que parte de nuestro programa se repita es
mediante la orden "for". La emplearemos sobre todo para conseguir un
número concreto de repeticiones. En lenguajes como BASIC su formato es
muy simple: "FOR x = 1 TO 10" irá recorriendo todos los valores de x, desde
uno hasta 10. En Java y otros lenguajes que derivan de C, su sintaxis es
más enrevesada:
// For1.java
// Repetición con "for" 1: escribir 10 veces
// Introducción a Java, Nacho Cabanes
class For1 {
public static void main( String args[] ) {
int i;
(inicialmente i vale 1, hay que repetir mientras sea menor o igual que 10, y
en cada paso hay que aumentar su valor una unidad),
// Contar1a5c.java
// Repetición con "for" 2: contar de 1 a 5
// Introducción a Java, Nacho Cabanes
class Contar1a5c {
int x;
class Contar10a0 {
int i;
}
}
// Contar10a0b.java
// Repetición con "while": descontar de 10 a 0, de 2 en 2
// Programa equivalente a "For2.java"
// Introducción a Java, Nacho Cabanes
class Contar10a0b {
int i;
i=10 ;
while ( i>=0 ) {
System.out.println( i );
i-=2;
}
}
}
// ForVariable.java
// Variable declarada dentro de un "for"
// Introducción a Java, Nacho Cabanes
class ForVariable {
}
}
Esto tiene la ventaja de que no podemos reutilizar por error esa variable "i"
después de salir del "for", porque "se destruye" automáticamente y
obtendríamos un mensaje de error si tratamos de usarla. Así evitamos
efectos indeseados de que cambios en una parte del programa afecten a
otra parte del programa porque estemos reusando una variable sin darnos
cuenta.
****
* *
* *
****
Precaución con los bucles: Casi siempre, nos interesará que una parte de
nuestro programa se repita varias veces (o muchas veces), pero no
indefinidamente. Si planteamos mal la condición de salida, nuestro
programa se puede quedar "colgado", repitiendo sin fin los mismos pasos
(dentro de un "bucle sin fin").
La sentencia "break" hace que se salten las instrucciones del bucle que
quedan por realizar, y se salga del bucle inmediatamente. Como ejemplo:
// Break1.java
// Ejemplo de uso de "break"
// Introducción a Java, Nacho Cabanes
class Break1 {
int i;
System.out.println( "Empezamos..." );
for ( i=1 ; i<=10 ; i++ ) {
System.out.println( "Comenzada la vuelta" );
System.out.println( i );
if (i==8)
break;
System.out.println( "Terminada esta vuelta" );
}
System.out.println( "Terminado" );
}
}
La sentencia "continue" hace que se salten las instrucciones del bucle que
quedan por realizar, pero no se sale del bucle sino que se pasa a la
siguiente iteración (la siguiente "vuelta" o "pasada"). Como ejemplo:
// Continue1.java
// Ejemplo de uso de "continue"
// Introducción a Java, Nacho Cabanes
class Continue1 {
int i;
System.out.println( "Empezamos..." );
for ( i=1 ; i<=10 ; i++ ) {
System.out.println( "Comenzada la vuelta" );
System.out.println( i );
if (i==8)
continue;
System.out.println( "Terminada esta vuelta" );
}
System.out.println( "Terminado" );
}
}
6.5. Etiquetas
También existe la posibilidad de usar una "etiqueta" para indicar dónde se
quiere saltar con break o continue. Sólo se debería utilizar cuando
tengamos un bucle que a su vez está dentro de otro bucle, y queramos salir
de golpe de ambos. Es ese caso (muy poco frecuente), deberemos crear
una etiqueta justo antes de la orden que queremos que se interrumpa, y
luego usar "break" seguido del nombre de esa etiqueta, así
// BreakEtiqueta.java
// Ejemplo de uso de "break" con etiqueta de salto
// Introducción a Java, Nacho Cabanes
class BreakEtiqueta {
public static void main( String args[] ) {
int i;
bucleAInterrumpir:
for ( i=1 ; i<=10 ; i++ ) {
System.out.println( "Comenzada la vuelta" );
System.out.println( i );
if (i==8) break bucleAInterrumpir;
System.out.println( "Terminada esta vuelta" );
}
System.out.println( "Terminado" );
}
}
Curso: Programación en Java
Java
7. Booleanos, Caracteres, Cadenas De
Texto Y Arrays
Hemos visto cómo manejar datos numéricos, tanto enteros como reales, y
con mayor o menor precisión, pero para muchos problemas reales
necesitaremos datos de otros tipos: textos, datos estructurados e incluso
otros datos simples que aún no hemos tratado, como letras individuales y
valores lógicos "verdadero" o "falso".
import java.util.Scanner;
class Booleano1 {
int dato;
boolean todoCorrecto;
Scanner teclado = new Scanner(System.in);
do
{
System.out.print("Introduce un dato del 0 al 10: ");
dato = teclado.nextInt();
todoCorrecto = true;
if (dato < 0)
todoCorrecto = false;
if ( ! todoCorrecto )
System.out.println("No es válido!");
}
while ( ! todoCorrecto );
System.out.println("Terminado!");
}
}
No es necesario usar un "if" para darles valores, sino que se puede hacer
directamente asignándoles el valor de una condición, así:
// Booleano2.java
// Segundo ejemplo de variables "bool"
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class Booleano2 {
int dato;
boolean todoCorrecto;
Scanner teclado = new Scanner(System.in);
do
{
System.out.print("Introduce un dato del 0 al 10: ");
dato = teclado.nextInt();
todoCorrecto = (dato >= 0) && (dato <= 10);
if ( ! todoCorrecto )
System.out.println("No es válido!");
}
while ( ! todoCorrecto );
System.out.println("Terminado!");
}
}
7.2. Caracteres
El tipo de datos char lo usaremos para almacenar una letra del alfabeto, o
un dígito numérico, o un símbolo de puntuación, o cualquier otro carácter.
Ocupa 2 bytes. Sigue un estándar llamado Unicode (que a su vez engloba a
otro estándar anterior llamado ASCII). Sus valores se deben indicar entre
comillas simples: char inicial = 'n';
Por ejemplo, un programa que prefije dos datos de tipos "char" y los
muestre sería
// Char1.java
// Segundo ejemplo de variables "bool"
// Introducción a Java, Nacho Cabanes
class Char1 {
Java no permite usar un "Scanner" para leer desde teclado letra a letra, así
que la mayoría de operaciones con letras las haremos dentro de poco,
cuando sepamos manejar cadenas de texto.
7.3.1. String
Las cadenas se declaran con la palabra "String" (cuidado: la primera letra
debe estar en mayúsculas) y su valor se asigna entre dobles comillas:
// String1.java
// Primer contacto con los String (cadenas de texto)
// Introducción a Java, Nacho Cabanes
class String1 {
public static void main( String args[] ) {
}
}
Podemos "concatenar" cadenas (juntar dos cadenas para dar lugar a una
nueva) con el signo +, el mismo que usamos para sumar números. Es
frecuente utilizarlo para escribir varias cosas en una misma frase:
// String2.java
// Primer contacto con los String: concatenación
// Introducción a Java, Nacho Cabanes
class String2 {
public static void main( String args[] ) {
}
}
// String3.java
// Tercer contacto con los String: comparación
// Introducción a Java, Nacho Cabanes
class String3 {
public static void main( String args[] ) {
if (saludo.equals("Hola"))
System.out.println( "El saludo es Hola" );
else
System.out.println( "El saludo no es Hola" );
}
}
Por otra parte, existe una serie de "operaciones con nombre" (también
llamadas "métodos") que podemos aplicar a una cadena. Vamos a ver un
ejemplo de algunas de las más frecuentes y luego detallaremos un poco:
// String4.java
// Ejemplo más detallado de uso de String
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class String4 {
public static void main( String args[] ) {
// Manipulaciones básicas
System.out.print( "La primera cadena de texto es: " );
System.out.println( texto1 );
}
}
Una lista un poco más detallada de los "métodos" (operaciones con nombre)
que se pueden aplicar sobre una cadena podría ser::
Método Cometido
charAt (int pos) Devuelve el carácter que hay en una cierta posición
substring(int desde, int Devuelve una sub-cadena: varias letras a partir de una posición
cuantos) dada
replace(char antiguo, char Devuelve una cadena con un carácter reemplazado por otro
Método Cometido
nuevo)
startsWith(String
Indica si la cadena empieza con una cierta sub-cadena
subcadena)
equalsIgnoreCase( String Comprueba si dos cadenas son iguales, pero despreciando las
cadena) diferencias entre mayúsculas y minúsculas
N
Na
Nac
Nach
Nacho
7.3.2. StringBuilder
Por su parte, los métodos básicos de un StringBuilder, que representa una
cadena de texto modificable, son:
Método Cometido
charAt (int pos) Devuelve el carácter que hay en una cierta posición
insert(int pos, objeto) Añade otra cadena, un número, etc. en una cierta posición
// EjemploStringBuilder.java
// Aplicación de ejemplo con StringBuilder
// Introducción a Java, Nacho Cabanes
class EjemploStringBuilder {
public static void main( String args[] ) {
texto3.append(" mas");
System.out.println( "Texto 3 es: " + texto3 );
texto3.insert(2, "1");
System.out.println( "Y ahora es: " + texto3 );
texto3.reverse();
System.out.println( "Y ahora: " + texto3 );
Curso: Programación en Java
Java
7.4. Los arrays
Imaginemos que tenemos que realizar cálculos estadísticos con 10 números que
introduzca el usuario. Parece evidente que tiene que haber una solución más
cómoda que definir 10 variables distintas y escribir 10 veces las instrucciones de
avisar al usuario, leer los datos que teclee, y almacenar esos datos. Si
necesitamos manejar 100, 1.000 o 10.000 datos, resulta todavía más claro que no
es eficiente utilizar una variable para cada uno de esos datos.
Por eso se emplean los arrays (que en ocasiones también se llaman "matrices" o
"vectores", por similitud con estas estructuras matemáticas, y que algunos autores
traducen como "arreglos"). Un array es una variable que puede contener varios
datos del mismo tipo. Para acceder a cada uno de esos datos, indicaremos su
posición entre corchetes. Por ejemplo, si definimos una variable llamada "m" que
contenga 10 números enteros, accederemos al primero de estos números como
m[0], el último como m[9] y el quinto como m[4] (se empieza a numerar a desde 0
y se termina en n-1). Veamos un ejemplo que halla la media de cinco números
(con decimales, "double"):
// Array1.java
// Aplicación de ejemplo con Arrays
// Introducción a Java, Nacho Cabanes
class Array1 {
public static void main( String args[] ) {
double[] a = { 10, 23.5, 15, 7, 8.9 };
double total = 0;
int i;
double[] datos;
Vamos a ver un ejemplo algo más completo, con tres arrays de números enteros,
llamados a, b y c. A uno de ellos (a) le daremos valores al definirlo, otro lo
definiremos en dos pasos (b) y le daremos fijos, y el otro lo definiremos en un paso
y le daremos valores calculados a partir de ciertas operaciones:
// Array2.java
// Aplicación de ejemplo con Arrays
// Introducción a Java, Nacho Cabanes
class Array2 {
public static void main( String args[] ) {
Y si queremos que sea el usuario el que introduzca los valores y luego mostrar
esos valores, lo podríamos conseguir de esta manera:
// Array3.java
// Leer de teclado y mostrar datos de un array
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class Array3 {
public static void main( String args[] ) {
// Array4.java
// Leer y mostrar datos de un array, usando constantes
// Introducción a Java, Nacho Cabanes
import java.util.Scanner;
class Array4 {
public static void main( String args[] ) {
Como se ve en ese ejemplo, para indicar que un dato será constante usaremos la
palabra "final" y existe el convenio de usar nombres totalmente
en mayúsculas para las constantes.
Si no necesitamos una única serie de datos sino varias, podemos usar un array
bidimensional. Por ejemplo, podríamos crear un array con dos filas de dos
elementos cada una, así:
// ArrayBi.java
// Ejemplo de array bidimensional
// Introducción a Java, Nacho Cabanes
class ArrayBi {
public static void main( String args[] ) {
Ejercicio propuesto 7.4.9: Si has estudiado lo que es una matriz, crea un array
de 3x3 elementos, pide al usuario los datos de esas 9 posiciones y luego calcula el
determinante de esa matriz bidimensional.
.....
AAAAA
.....
.....
.....
X....
.X...
..X..
...X.
....X
Curso: Programación en Java
Java
8. Las Matemáticas Y Java.
Ya habíamos visto las operaciones matemáticas básicas: suma, resta,
división, multiplicación. También alguna menos habitual, como el resto de
una división.
Pero existen otras operaciones matemáticas que son muy habituales: raíces
cuadradas, potencias, logaritmos, funciones trigonométricas (seno, coseno,
tangente), generación de números al azar... Todas estas posibilidades están
accesibles a través de la clase java.lang.Math. Vamos a comentar
alfabéticamente las más importantes y luego veremos un ejemplo de su uso:
Función Significado
acos() Arcocoseno
asin() Arcoseno
cos(double) Coseno
exp() Exponencial
sin(double) sin(double)
tan(double) Tangente
// Matem.java
// Ejemplo de matemáticas desde Java
// Introducción a Java, Nacho Cabanes
class Matem {
Su resultado es:
2+3 es 5
2*3 es 6
2-3 es -1
3/2 es 1
3,0/2 es 1.5
El resto de dividir 13 entre 4 es 1
Un número al azar entre 0 y 1: 0.9775498588615054
Un número al azar entre 50 y 150: 71
Una letra minúscula al azar: u
Coseno de PI radianes: -1.0
Seno de 45 grados: 0.7071067811865475
Arco cuya tangente es 1: 45.0
Raíz cuadrada de 36: 6.0
Cinco elevado al cubo: 125.0Exponencial de 2: 7.38905609893065
Logaritmo de 2,71828: 0.999999327347282
Mayor valor entre 2 y 3: 3
Valor absoluto de -4,5: 4.5
Menor entero más cercano a -4,5: -5.0
Mayor entero más cercano a -4,5: -4.0
Redondeando -4,5 con ROUND: -4
Redondeando 4,5 con ROUND: 5
Redondeando -4,6 con RINT: -5.0
Redondeando -4,5 con RINT: 4.0
..O..
.....
.....
.O...
O....
Curso: Programación en Java
Java
8. Las Matemáticas Y Java.
Ya habíamos visto las operaciones matemáticas básicas: suma, resta,
división, multiplicación. También alguna menos habitual, como el resto de
una división.
Pero existen otras operaciones matemáticas que son muy habituales: raíces
cuadradas, potencias, logaritmos, funciones trigonométricas (seno, coseno,
tangente), generación de números al azar... Todas estas posibilidades están
accesibles a través de la clase java.lang.Math. Vamos a comentar
alfabéticamente las más importantes y luego veremos un ejemplo de su uso:
Función Significado
acos() Arcocoseno
asin() Arcoseno
cos(double) Coseno
exp() Exponencial
sin(double) Seno
tan(double) Tangente
toDegrees(double
Pasa de radianes a grados (a partir de Java 2)
)
// Matem.java
// Ejemplo de matemáticas desde Java
// Introducción a Java, Nacho Cabanes
class Matem {
Su resultado es:
2+3 es 5
2*3 es 6
2-3 es -1
3/2 es 1
3,0/2 es 1.5
El resto de dividir 13 entre 4 es 1
Un número al azar entre 0 y 1: 0.9775498588615054
Un número al azar entre 50 y 150: 71
Una letra minúscula al azar: u
Coseno de PI radianes: -1.0
Seno de 45 grados: 0.7071067811865475
Arco cuya tangente es 1: 45.0
Raíz cuadrada de 36: 6.0
Cinco elevado al cubo: 125.0
Exponencial de 2: 7.38905609893065
Logaritmo de 2,71828: 0.999999327347282
Mayor valor entre 2 y 3: 3
Valor absoluto de -4,5: 4.5
Menor entero más cercano a -4,5: -5.0
Mayor entero más cercano a -4,5: -4.0
Redondeando -4,5 con ROUND: -4
Redondeando 4,5 con ROUND: 5
Redondeando -4,6 con RINT: -5.0
Redondeando -4,5 con RINT: 4.0
..O..
.....
.....
.O...
O....
Curso: Programación en Java
Java
10. Clases En Java.
Cuando tenemos que realizar un proyecto grande, será necesario
descomponerlo en varios subprogramas, de forma que podamos repartir el
trabajo entre varias personas (pero la descomposición no debe ser
arbitraria: por ejemplo, será deseable que cada bloque tenga unas
responsabilidades claras).
La forma más recomendable de descomponer un proyecto será tratar de
verlo como una serie de "objetos" que colaboran entre ellos, cada uno de
los cuales tiene unas ciertas responsabilidades.
Parámetros y argumentos
Estos dos términos; parámetros y argumentos, son a menudo
intercambiados incorrectamente en su uso. El contexto ayuda a
diferenciar su significado. El término parámetro, se usa a menudo para
referirse a la variable en la declaración del método, mientras
que argumento, se refiere al valor que se envia. Para evitar
confusiones, es común ver a un parámetro como una variable y un
argumento como un valor.
return valorRetorno;
El tipo de dato del valor de retorno deberá coincidir con el tipo de
retorno de la declaración del método. No se puede retornar un
valor integer, a un método en el que en su declaración aparece como
valor de retorno, un boolean
// DosClases.java
// Primer ejemplo de una clase nuestra
// que accede a otra también nuestra,
// ambas definidas en el mismo fichero
// Introducción a Java, Nacho Cabanes
class Principal {
javac DosClases.java
Principal.class
Secundaria.class
que podríamos probar tecleando
java Principal
Ahora vamos a ver un ejemplo en el que las dos clases están en dos
ficheros distintos. Tendremos una clase "sumador" que sea capaz de
sumar dos números (no es gran cosa, sabemos hacerlo sin necesidad de
crear "clases a propósito", pero nos servirá como ejemplo) y tendremos
también un programa principal que la utilice.
class Sumador {
// UsaSumador.java
// Segundo ejemplo de una clase nuestra
// que accede a otra tambi?n nuestra.
// Esta es la clase principal, que
// accede a "Sumador.java"
// Introducci?n a Java, Nacho Cabanes
class UsaSumador {
}
Para compilar estos dos fuentes desde línea de comandos, si tecleamos
directamente
javac usaSumador.java
javac Sumador.java
javac UsaSumador.java
java UsaSumador
La suma de 30 y 55 es
85
Curso: Programación en Java
Java
10.3. Herencia
Hemos comentado que unas clases podían "heredar" atributos y métodos
de otras clases. Vamos a ver cómo se refleja eso en un programa.
Crearemos un "escritor de textos" y después lo mejoraremos creando un
segundo escritor que sea capaz además de "adornar" los textos poniendo
asteriscos antes y después de ellos. Finalmente, crearemos un tipo de
escritor que sólo escriba en mayúsculas...
// Herencia.java
// Primer ejemplo de herencia entre clases,
// todas definidas en el mismo fichero
// Introducción a Java, Nacho Cabanes
class Escritor {
public static void escribe(String texto) {
System.out.println( texto );
}
}
// ----------------------------------------------------
class Herencia {
public static void main( String args[] ) {
Esta forma de trabajar tiene como ventaja que podremos cambiar los
detalles internos de nuestra clase (para hacerla más rápida o que ocupe
menos memoria, por ejemplo) sin que afecte a los usuarios de nuestra
clase, que la seguirán manejando "como siempre", porque su parte visible
sigue siendo la misma.
Un ejemplo sería
// Getters.java
// Segundo ejemplo de herencia entre clases,
/ todas definidas en el mismo fichero
// Incluye getters y setters
// Introducción a Java, Nacho Cabanes
class Escritor {
public static void escribe(String texto) {
System.out.println( texto );
}
}
// ----------------------------------------------------
class Getters {
// Getters2.java
// Segundo ejemplo de herencia entre clases,
// todas definidas en el mismo fichero
// Incluye getters y setters
// Versión sin "static"
// Introducción a Java, Nacho Cabanes
class Escritor {
public void escribe(String texto) {
System.out.println( texto );
}
}
// ----------------------------------------------------
class Getters2 {
10.6. Constructores
Nos puede interesar dar valores iniciales a los atributos de una clase. Una
forma de hacerlo es crear un método (una función) llamado "Inicializar", que
sea llamado cada vez que creamos un objeto de esa clase. Pero esto es
algo tan habitual que ya está previsto en la mayoría de lenguajes de
programación actuales: podremos crear "constructores", que se lanzarán
automáticamente al crear el objeto. La forma de definirlos es con una
función que se llamará igual que la clase, que no tendrá ningún tipo
devuelto (ni siquiera "void") y que puede recibir parámetros. De hecho,
podemos incluso crear varios constructores alternativos, con distinto número
o tipo de parámetros:
// Constructores.java
// Ejemplo de clases con constructores
// Introducción a Java, Nacho Cabanes
class Escritor {
protected String texto;
public Escritor() {
texto = "";
}
// ----------------------------------------------------
class Constructores {
11. Ficheros
Por: Nacho Cabanes
Curso: Programación en Java
Java
11. Ficheros
11.1. ¿Por qué usar ficheros?
Con frecuencia tendremos que guardar los datos de nuestro programa para
poderlos recuperar más adelante. Hay varias formas de hacerlo. Una de
ellas son los ficheros, que son relativamente sencillos. Otra forma más
eficiente cuando es un volumen de datos muy elevado es usar una base de
datos, que veremos más adelante.
Abrir el fichero
Guardar datos o leer datos
Cerrar el fichero
ficheroSalida.write("Hola");
ficheroSalida.newLine();
Por otra parte, para cerrar el fichero (lo más fácil, pero lo que más se suele
olvidar), usaremos "close", mientras que para abrir usaremos un
BufferedWriter, que se apoya en un FileWriter, que a su vez usa un "File" al
que se le indica el nombre del fichero. Es menos complicado de lo que
parece:
// FicheroTextoEscribir.java
// Ejemplo de escritura en un fichero de texto
// Introducción a Java, Nacho Cabanes
import java.io.*;
class FicheroTextoEscribir
{
try
{
BufferedWriter ficheroSalida = new BufferedWriter(
new FileWriter(new File("fichero.txt")));
ficheroSalida.write("Hola");
ficheroSalida.newLine();
ficheroSalida.write("Este es");
ficheroSalida.write(" un fichero de texto");
ficheroSalida.newLine();
ficheroSalida.close();
}
catch (IOException errorDeFichero)
{
System.out.println(
"Ha habido problemas: " +
errorDeFichero.getMessage() );
}
}
}
// FicheroTextoLeer.java
// Ejemplo de lectura desde un fichero de texto
// Introducción a Java, Nacho Cabanes
import java.io.*;
class FicheroTextoLeer
{
if (! (new File("fichero.txt")).exists() )
{
System.out.println("No he encontrado fichero.txt");
return;
}
try
{
BufferedReader ficheroEntrada = new BufferedReader(
new FileReader(new File("fichero.txt")));
String linea=null;
while ((linea=ficheroEntrada.readLine()) != null) {
System.out.println(linea);
}
ficheroEntrada.close();
}
catch (IOException errorDeFichero)
{
System.out.println(
"Ha habido problemas: " +
errorDeFichero.getMessage() );
}
}
}
Ejercicio propuesto 11.3.1: Crea un programa que muestre el contenido
de un fichero de texto, cuyo nombre deberá introducir el usuario. Debe
avisar si el fichero no existe.
// FicheroBinarioLeer.java
// Ejemplo de lectura desde un fichero de texto
// Introducción a Java, Nacho Cabanes
import java.io.*;
class FicheroBinarioLeer
{
System.out.println("Contando \\"a\\"...");
int contador = 0;
try
{
FileInputStream ficheroEntrada2 =
new FileInputStream(new File("fichero.bin"));
int dato;
// FicheroBinarioEscribir.java
// Ejemplo de escritura en un fichero binario
// Introducción a Java, Nacho Cabanes
import java.io.*;
class FicheroBinarioEscribir
{
try
{
InputStream ficheroEntrada3 = new FileInputStream(
new File("fichero.in"));
OutputStream ficheroSalida3 = new FileOutputStream(
new File("fichero2.out"));
System.out.println("Terminado!");
}
}