Introducción A La Programacion Con Java
Introducción A La Programacion Con Java
a Java
Por Nacho Cabanes,
Versin 0.40 de Julio de 2015
Tabla de contenido
1. Introduccin: por qu Java? ...................................................................................... 5
1.1. Qu es Java?.................................................................................................................. 5
1.2. Por qu usar Java? ....................................................................................................... 5
1.3. Cundo no usar Java? .................................................................................................. 5
1.4. Qu ms aporta Java?.................................................................................................. 6
1.5. Qu hace falta para usar un programa creado en Java?......................................... 6
1.6. Qu hace falta para crear un programa en Java? .................................................... 6
como
Eclipse
(http://www.eclipse.org/downloads/)
NetBeans.
Ya estaramos listos para empezar a crear nuestro primer programa en Java, pero
eso queda para la siguiente leccin...
Al igual que ocurre con NetBeans, existen versiones de Eclipse para crear
programas en distintos lenguajes o incluso con diferentes versiones de Java. Lo
razonable ser usar "Eclipse for Java Developers" (no la versin de Java EE,
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 16
De paso, podemos aprovechar para instalar Eclipse, que tambin se suele poder
escoger desde el gestor de paquetes de la mayora de distribuciones de Linux:
En ambos casos, se nos avisar de que esos paquetes dependen de otros que
tambin habr que instalar:
(Los detalles de cmo empezar a programar con Eclipse los veremos en el prximo
tema)
Y, al igual que hemos visto que ocurra con el JDK y con Eclipse, se nos avisar en
caso de que sea necesario instalar algn paquete extra:
Tambin se puede usar Geany en otros sistemas operativos, como Windows, pero
en este caso, el manejo puede no ser tan sencillo: tendremos que instalar primero
el JDK, luego Geany, y quiz aun as no podamos compilar y lanzar directamente
los programas desde Geany, sino que obtengamos un mensaje de error que nos
diga que no encuentra Java. Para solucionarlo, habra que cambiar la configuracin
de Geany o incluir Java en el "Path" de Windows, pero son tareas que quiz no
estn al alcance de un principiante, as que las esquivaremos por ahora...
El contenido de cada bloque del programa se debe detallar entre llaves. Por eso, la
lnea "print" aparece despus de "main" y rodeada por llaves:
primer
programa
de
ejemplo,
el
fichero
debera
llamarse
"HolaMundo.java".
3.2.5. Comentarios
Las dos primeras lneas del programa son:
// HolaMundo.java
// Aplicacin HolaMundo de ejemplo
Estas lneas, que comienzan con una doble barra inclinada (//) son comentarios.
Nos sirven a nosotros de aclaracin, pero nuestro ordenador las ignora, como si
no hubisemos escrito nada.
Si queremos que un comentario ocupe varias lneas, o slo un trozo de una lnea,
en vez de llegar hasta el final de la lnea, podemos preceder cada lnea con una
doble barra, como en el ejemplo anterior, o bien indicar dnde queremos empezar
con "/*" (una barra seguida de un asterisco) y dnde queremos terminar con "*/"
(un asterisco seguido de una barra), as:
/* Esta es la
Aplicacin HolaMundo
de ejemplo */
}
}
Si nuestro programa contiene algn error, se nos mostrar un mensaje que dir la
lnea y columna en la que se ha detectado. Si no es as, obtendremos un fichero
ejecutable llamado "HolaMundo.class", que podremos poner en funcionamiento
tecleando:
java HolaMundo
En Windows, si todo va bien (cosa que no siempre ocurre), los pasos seran los
mismos, pero el editor que viene preinstalado es el bloc de notas (notepad), luego
comenzaramos por teclear:
notepad HolaMundo.java
Si hacemos clic en el botn de Ejecutar (el que muestra una punta de flecha de
color verde), nuestro programa se pondr en marcha (si no tiene ningn error), y
su resultado se mostrar en la parte inferior derecha de la pantalla de trabajo de
NetBeans:
Y ahora deberemos aadir 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):
Pero esto no es lo habitual: normalmente los datos que maneje nuestro programa
sern el resultado de alguna operacin matemtica o de cualquier otro tipo, a
partir de datos introducidos por el usuario, ledos de un fichero, obtenidos de
Internet... Por eso, necesitaremos un espacio en el que ir almacenando valores
temporales y resultados de las operaciones.
En casi cualquier lenguaje de programacin podremos reservar esos "espacios", y
asignarles un nombre con el que acceder a ellos. Esto es lo que se conoce como
"variables".
Por ejemplo, si queremos que el usuario introduzca dos nmeros y el ordenador
calcule la suma de ambos nmeros y la muestre en pantalla, necesitaramos el
espacio para almacenar al menos esos dos nmeros iniciales. No sera
imprescindible reservar espacio tambin para la suma, porque podemos mostrarla
en pantalla en el mismo instante en que la calculamos. Los pasos a dar seran los
siguientes:
Avisar al usuario de que deseamos que introduzca un nmero.
Mostrar
en
pantalla
el
resultado
de
sumar
"primerNumero"
"segundoNumero".
Pues bien, en este programa estaramos empleando dos variables llamadas
"primerNumero" y "segundoNumero". Cada una de ellas se usara para acceder a
un espacio de memoria, que ser capaz de almacenar un nmero.
Para no desperdiciar memoria de nuestro ordenador, el espacio de memoria que
hace falta "reservar" se podr optimizar segn lo grande que pueda llegar a ser
dicho nmero (la cantidad de cifras), o segn la precisin que necesitemos para
ese nmero (cantidad de decimales). Por eso, tenemos disponibles diferentes
"tipos de variables".
Por ejemplo, si vamos a manejar nmeros sin decimales ("nmeros enteros") de
como mximo 9 cifras, nos interesara el tipo de datos llamado "int" (esa palabra
es la abreviatura de "integer", "entero" en ingls). Este tipo de datos consume un
espacio de memoria de 4 bytes. Si no necesitamos guardar datos tan grandes (por
ejemplo, si nuestros datos va a ser nmeros inferiores a 10.000), podemos
emplear el tipo de datos llamado "short" (entero "corto"), que ocupa la mitad de
espacio.
Con eso, vamos a ver un programa sume dos nmeros enteros (de no ms de 9
cifras) prefijados y muestre en pantalla el resultado:
// Suma2.java
// Ejemplo de suma con variables
// Introduccin a Java, Nacho Cabanes
class Suma2 {
public static void main( String args[] ) {
int primerNumero = 56; // Dos enteros con valores prefijados
int segundoNumero = 23;
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 operacin
}
}
Resta
Multiplicacin
Divisin
Resto de la divisin
Hemos visto un ejemplo de cmo calcular la suma de dos nmeros; las otras
operaciones se emplearan de forma similar. La nica operacin "menos habitual"
es el resto de la divisin. Por ejemplo, si dividimos 14 entre 3, obtenemos 4 como
cociente y 2 como resto, de modo que el resultado de 14 % 3 sera 2.
Ejercicio propuesto 4.2.1: Crea un programa que muestre la divisin de dos
nmeros prefijados.
Ejercicio propuesto 4.2.2: Crea un programa que muestre el resto de dividir
100 entre 30.
Vamos a usar una caracterstica que no es algo bsico del lenguaje. Por eso
le decimos que deseamos "importar" nuevas funcionalidades. En nuestro
caso, se trata de un tal "Scanner", que nos permitir analizar textos: import
java.util.Scanner;
Son varias novedades, pero tampoco debera resultar difcil. Este programa
escribir algo como (dependiendo de los datos que introduzca el usuario):
Introduzca el primer nmero: 34
Introduzca el segundo nmero: 56
Su suma es: 90
Es habitual declarar las variables al principio del programa, antes de que comience
la lgica real que resuelve el problema. Si varias variables van a guardar datos del
mismo tipo, se pueden declarar todas ellas a la vez, separadas por comas, como
en el siguiente ejemplo:
// Suma3b.java
// Dos variables declaradas a la vez
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 41
Como la forma de asimilar todo esto es probndolo, aqu tienes varios ejercicios
propuestos:
Ejercicio propuesto 4.3.1: Crea un programa que calcule y muestre el
producto de dos nmeros enteros que introduzca el usuario.
Ejercicio propuesto 4.3.2: Crea un programa que calcule y muestre la divisin
de dos nmeros enteros que introduzca el usuario.
Ejercicio propuesto 4.3.3: Crea un programa que calcule y muestre el resto
de la divisin de dos nmeros enteros que introduzca el usuario.
Ejercicio propuesto 4.3.4: Crea un programa que pida al usuario una longitud
en millas (por ejemplo, 3) y calcule su equivalencia en metros (1 milla = 1609
m).
Ejercicio propuesto 4.3.5: Crea un programa que pida al usuario una
temperatura en grados centgrados y calcule (y muestre) a cuntos grados
Fahrenheit equivalen (F = 9*C/5 + 32).
Ejercicio propuesto 4.3.6: Crea un programa que pregunte al usuario la base
y la altura de un tringulo y muestre su superficie (S = B*A/2).
Por ejemplo, para sumar 2 a una variable "a", la forma "normal" de conseguirlo
sera:
a = a + 2;
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++;
Admite
decimales?
Valor mn.
Valor mx.
Precisin Ocupa
byte
no
-128
127
short
no
-32.768
32.767
int
no
-2.147.483.648
2.147.483.647
long
no
float
double s
9.223.372.036.854.775.808
9..223.372.036.854.775.807 -
1.401298E-45
3.402823E38
4.94065645841247E-324
1.79769313486232E308
1
byte
2
bytes
4
bytes
8
bytes
6-7
cifras
bytes
14-15
cifras
bytes
Los datos de tipo byte, short, int y long sirven para almacenar nmeros enteros,
de mayor o menor tamao. Si se desborda ese tamao, el programa se
interrumpir con un error, como en este ejemplo:
// DesbordarByte.java
// Ejemplo de desbordamiento de una variable
// Introduccin 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 mostrara:
El dato inicialmente es: 100
Si sumamos 100, el dato ahora es: -56
Por su parte, los datos float y double permiten almacenar nmeros reales (con
cifras decimales), que pueden almacenar los nmeros de forma incorrecta si
tienen ms cifras que la permitida por ese tipo de datos, como en este ejemplo:
// PrecisionFloat.java
// Ejemplo de lmite de precisin de un dato float
// Introduccin 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 escribira:
El dato inicialmente es: 1.2345679
Si sumamos 1000, el dato ahora es: 1001.23456
Para pedir datos de estos tipos, podemos usar un "Scanner" con ".nextByte",
".nextShort", ".nextLong", ".nextFloat" o ".nextDouble"
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 45
Por ejemplo, se podra sumar dos nmeros reales de forma similar a como hemos
visto para dos nmeros enteros:
// SumaFloat.java
// Sumar dos nmeros reales
// Introduccin a Java, Nacho Cabanes
import java.util.Scanner;
class SumaFloat {
public static void main( String args[] ) {
Scanner teclado;
float primerNumero, segundoNumero;
teclado = new Scanner(System.in);
System.out.print( "Introduzca el primer nmero real: " );
primerNumero = teclado.nextFloat();
System.out.print( "Introduzca el segundo nmero real: " );
segundoNumero = teclado.nextFloa.t();
System.out.print( "Su suma es: " );
System.out.println( primerNumero+segundoNumero );
}
}
5. Comprobacin de condiciones
5.1. if
En cualquier lenguaje de programacin es habitual tener que comprobar si se
cumple una cierta condicin. La forma ms simple de conseguirlo es empleando
una construccin que recuerda a:
SI condicin ENTONCES rdenes
En Java, la forma exacta ser empleando if (si, en ingls), seguido por la condicin
entre parntesis, e indicando finalmente entre llaves los pasos que queremos dar
si se cumple la condicin, as :
if (condicin)
{ rdenes }
Por ejemplo,
// If1.java
// Comprobacin de condiciones con "if" 1: mayor que
// Introduccin a Java, Nacho Cabanes
class If1 {
public static void main( String args[] ) {
int x = 10;
if (x > 5) {
System.out.println( "x es mayor que 5" );
}
}
}
Nota: Las llaves slo sern imprescindibles cuando haya que hacer varias cosas. Si
slo queremos dar un paso en caso de que se cumpla la condicin, no es
necesario emplear llaves (aunque puede ser recomendable usar siempre las llaves,
para no olvidarlas si ms adelante ampliamos ese fragmento del programa):
// If2.java
// Comprobacin de condiciones con "if" 2: sin llaves
// Introduccin a Java, Nacho Cabanes
class If2 {
public static void main( String args[] ) {
int x = 10;
if (x > 5)
System.out.println( "x es mayor que 5" );
}
}
{ rdenes1 }
else
{ rdenes2 }
Por ejemplo,
// If3.java
// Comprobacin de condiciones con "if" 3: else
// Introduccin a Java, Nacho Cabanes
class If3 {
public static void main( String args[] ) {
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" );
}
}
}
Smbolo
Mayor que
>
>=
Menor que
<
<=
Igual que
Distinto de
!=
As, por ejemplo, para ver si el valor de una variable "b" es distinto de 5,
escribiramos:
// If4.java
// Comprobacin de condiciones con "if" 4: distinto de
// Introduccin a Java, Nacho Cabanes
class If4 {
public static void main( String args[] ) {
int x = 10;
if (x != 5) {
System.out.println( "x no vale 5" );
}
else {
System.out.println( "x vale 5" );
}
}
}
Es muy importante recordar esta diferencia: para asignar un valor a una variable
se emplea un nico signo de igual, mientras que para comparar si una variable es
igual a otra (o a un cierto valor) se emplean dos signos de igual.
Ejercicio propuesto 5.3.1: Crea un programa que pida al usuario que
introduzca el nmero 12. Despus debe decirle si lo ha hecho correctamente o
no.
Ejercicio propuesto 5.3.2: Crea un programa que pida un nmero entero al
usuario y diga si es positivo (mayor que cero), si es negativo (menor que cero)
o si, por el contrario, es exactamente 0 (necesitars enlazar 2 "if" uno tras
otro).
Ejercicio propuesto 5.3.3: Crea un programa que pida dos nmeros reales
(con decimales) al usuario y diga cul es el mayor de ellos.
Ejercicio propuesto 5.3.4: Crea un programa que pida al usuario y diga si ese
nmero es mltiplo de 3 (pista: puedes utilizar la operacin "mdulo", el "resto
de la divisin": %)
Ejercicio propuesto 5.3.5: Crea un programa que diga si el nmero
introducido por el usuario es impar o no lo es.
&&
||
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" sera:
// If6.java
// Comprobacin de condiciones con "if" 6: varias condiciones
// Introduccin a Java, Nacho Cabanes
class If6 {
public static void main( String args[] ) {
int a = 7;
int b = 1;
if ( ((a == 3) || ( b > 5))
|| ((a == 7) && ! (b < 4)) ) {
System.out.println( "Se cumple la condicin" );
}
else {
System.out.println( "No se cumple la condicin" );
}
}
}
(el primero O el
segundo).
Ejercicio propuesto 5.4.3: Crea un programa que pida al usuario dos nmeros
enteros y cuntos de ellos son pares.
Ejercicio propuesto 5.3.5: Crea un programa que pida tres nmeros enteros
largos al usuario y diga cul es el mayor de los tres.
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
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 51
forma ms elegante de elegir entre distintos valores posibles que tome una cierta
expresin. Su formato es ste:
switch (expresion) {
case valor1: sentencias1; break;
case valor2: sentencias2; break;
case valor3: sentencias3; break;
// ... Puede haber ms valores
}
// Switch2.java
// Comprobacin de condiciones con "switch" 2: default
// Introduccin a Java, Nacho Cabanes
class Switch2 {
public static void main( String args[] ) {
int mes = 4;
switch(mes) {
case 1: System.out.println( "El mes
case 2: System.out.println( "El mes
case 3: System.out.println( "El mes
default: System.out.println( "No es
}
es Enero" ); break;
es Febrero" ); break;
es Marzo" ); break;
entre Enero y Marzo" ); break;
}
}
Podemos conseguir que se den los mismos pasos en varios casos, simplemente
eliminando la orden "break" de algunos de ellos. Un ejemplo podra ser:
// Switch3.java
// Comprobacin de condiciones con "switch" 3: casos en cascada
// Introduccin a Java, Nacho Cabanes
class Switch3 {
public static void main( String args[] ) {
int x = 5;
switch ( x ) {
case 1:
case 2:
case 3:
System.out.println(
break;
case 4:
case 5:
System.out.println(
break;
case 6:
System.out.println(
int valorTemporal =
System.out.println(
break;
default:
System.out.println(
break;
}
}
}
A partir de Java 7, se puede usar la orden "switch" tambin para comprobar los
valores de cadenas de texto:
//
//
//
//
Switch4.java
Comprobacin de condiciones con "switch" 4: cadenas de texto
(Para Java 7 o superior)
Introduccin a Java, Nacho Cabanes
class Switch4 {
public static void main( String args[] ) {
String nombre = "yo";
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;
}
}
}
Es decir, se indica la condicin seguida por una interrogacin, despus el valor que
hay que devolver si se cumple la condicin, a continuacin un smbolo de "dos
puntos" y finalmente el resultado que hay que devolver si no se cumple la
condicin.
Es frecuente emplearlo en asignaciones (aunque algunos autores desaconsejan su
uso porque puede resultar menos legible que un "if"), como en este ejemplo:
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 tambin se podra haber escrito de la siguiente
forma, ms larga pero ms legible:
if (a == 10)
x = b*2;
else
x = a;
1 : 0;
6.1. while
La orden "while" hace que una parte del programa se repita mientras se cumpla
una cierta condicin. Su formato ser:
while (condicin)
sentencia;
Estas estructuras repetitivas se pueden usar tambin para hacer "contadores". Por
ejemplo, un programa que contase del 1 al 5 (y escribiese todos esos nmeros)
podra ser:
// Contar1a5.java
// Contar del 1 al 5 con "while"
// Introduccin a Java, Nacho Cabanes
class Contar1a5 {
public static void main( String args[] ) {
int x = 1;
while (x <= 5) {
System.out.println( x );
x++;
}
}
}
Ejercicio propuesto 6.1.1: Crea un programa que muestre los nmeros del 1
al 10, usando "while"
Ejercicio propuesto 6.1.2: Crea un programa que muestre los nmeros pares
del 20 al 2, decreciendo, usando "while"
Ejercicio propuesto 6.1.3: Crea un programa que muestre la "tabla de
multiplicar del 5", usando "while"
Ejercicio propuesto 6.1.4: Crea un programa que pida al usuario un nmero
entero y muestre su cuadrado. Se repetir mientras el usuario introduzca un
nmero distinto de cero.
Ejercicio propuesto 6.1.5: Crea un programa que pida al usuario su login (un
nmero entero) y su contrasea (otro nmero entero). Se repetir mientras el
usuario introduzca un login distinto de "1809" o una contrasea distinta de
"1234".
Ejercicio propuesto 6.1.6: Crea un programa que pida al usuario su login (un
nmero entero) y su contrasea (otro nmero entero). Se repetir mientras el
usuario introduzca un login distinto de "1809" o una contrasea distinta de
"1234", hasta un mximo de tres veces. Tras tres fallos, se mostrar un
mensaje avisando al usuario de que se le deniega el acceso.
Ejercicio propuesto 6.1.7: Crea un programa que escriba en pantalla tantos
asteriscos como el usuario indique, todos ellos en la misma lnea.
6.2. do-while
Existe una variante de "while", que permite comprobar la condicin al final de la
parte repetitiva, en vez de hacerlo antes de comenzar. Es el conjunto do..while,
cuyo formato es:
do {
sentencia;
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 57
} while (condicin)
Con "while", si la condicin era falsa desde un principio, los pasos que se indicaban
a continuacin de "while" no llegaban a darse ni una sola vez; con do-while, las
"sentencias" intermedias se realizarn al menos una vez.
Un ejemplo tpico de esta construccin "do..while" es cuando queremos que el
usuario introduzca una contrasea que le permitir acceder a una cierta
informacin:
// DoWhile1.java
// Comprobacin repetitiva de condiciones con "do-while"
// Introduccin a Java, Nacho Cabanes
import java.util.Scanner;
class DoWhile1 {
public static void main( String args[] ) {
int password;
Scanner teclado = new Scanner(System.in);
do {
System.out.print( "Introduzca su password numrica: " );
password = teclado.nextInt();
if (password != 1234)
System.out.println( "No es vlida." );
}
while (password != 1234);
}
}
import java.util.Scanner;
class Contar1a5b {
int x = 1;
do {
System.out.println( x );
x++;
}
while (x <= 5);
}
}
Ejercicio propuesto 6.2.1: Crea un programa que muestre los nmeros del 1
al 10, usando "do-while"
Ejercicio propuesto 6.2.2: Crea un programa que muestre los nmeros pares
del 20 al 2, decreciendo, usando "do-while"
Ejercicio propuesto 6.2.3: Crea un programa que muestre la "tabla de
multiplicar del 5", usando "do-while"
Ejercicio propuesto 6.2.4: Crea un programa que pida al usuario dos nmeros
enteros y muestre su suma. Se repetir hasta que los dos sean 0. Emplea dowhile.
Ejercicio propuesto 6.2.5: Crea un programa que pida al usuario su login (un
nmero entero) y su contrasea (otro nmero entero). Se repetir hasta que el
usuario introduzca como login "1809" y como contrasea "1234". En esta
ocasin, hazlo con do-while.
Ejercicio propuesto 6.2.6: Crea un programa que pida un nmero de tipo byte
al usuario y escriba en pantalla un cuadrado formado por asteriscos, que
tendr como alto y ancho la cantidad introducida por el usuario.
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 nmero
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 ms enrevesada:
La primera orden dar el valor inicial a una variable que sirva de control.
(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),
De forma similar, podramos hacer un contador de 1 a 5, como los que hemos
creado con "while" y con "do-while":
// Contar1a5c.java
// Repeticin con "for" 2: contar de 1 a 5
// Introduccin a Java, Nacho Cabanes
class Contar1a5c {
public static void main( String args[] ) {
int x;
for ( x=1 ; x<=5 ; x++ ) {
System.out.println( x );
}
}
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 60
Nota: se puede observar una equivalencia casi inmediata entre la orden "for" y la
orden "while". As, el ejemplo anterior se podra reescribir empleando "while", de
esta manera:
//
//
//
//
Contar10a0b.java
Repeticin con "while": descontar de 10 a 0, de 2 en 2
Programa equivalente a "For2.java"
Introduccin a Java, Nacho Cabanes
class Contar10a0b {
public static void main( String args[] ) {
int i;
i=10 ;
while ( i>=0 ) {
System.out.println( i );
i-=2;
}
}
}
// ForVariable.java
// Variable declarada dentro de un "for"
// Introduccin a Java, Nacho Cabanes
class ForVariable {
public static void main( String args[] ) {
for (int i=10 ; i>=0 ; i-=2 ) {
System.out.println( i );
}
}
}
Esto tiene la ventaja de que no podemos reutilizar por error esa variable "i"
despus de salir del "for", porque "se destruye" automticamente y obtendramos
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.
Ejercicio propuesto 6.3.1: Crea un programa que muestre los nmeros del 1
al 15, usando "for"
Ejercicio propuesto 6.3.2: Crea un programa que muestre los nmeros pares
del 20 al 2, decreciendo, usando "for"
Ejercicio propuesto 6.3.3: Crea un programa que muestre la "tabla de
multiplicar del 5", usando "for"
Ejercicio propuesto 6.3.4: Crea un programa que muestre los nmeros
enteros del 0 al 100 que son mltiplos de 6 (el resto al dividir por 6 sea 0).
Ejercicio propuesto 6.3.5: Crea un programa que muestre los nmeros
enteros entre 0 y el que introduzca el usuario que sean mltiplos de 3 (el resto
al dividir por 3 es 0) y a la vez mltiplos de 7 (dem).
Ejercicio propuesto 6.3.6: Crea un programa que pida dos nmeros de tipo
byte al usuario y escriba en pantalla un rectngulo formado por asteriscos, que
tendr como alto el primer nmero y como ancho el segundo nmero.
Ejercicio propuesto 6.3.7: Crea un programa que pida un nmero de tipo byte
al usuario y escriba en pantalla un cuadrado hueco de ese ancho, que tendr
un borde formado por asteriscos y su interior sern espacios en blanco. Por
ejemplo, para un tamao de 4 sera:
****
* *
* *
****
Precaucin 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 condicin de salida, nuestro programa se puede quedar
"colgado", repitiendo sin fin los mismos pasos (dentro de un "bucle sin fin").
En este caso, no se mostrara el texto "Terminada esta vuelta" para la pasada con
i=8, ni se daran las pasadas de i=9 e i=10, porque ya se ha abandonado el bucle.
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 iteracin (la
siguiente "vuelta" o "pasada"). Como ejemplo:
// Continue1.java
// Ejemplo de uso de "continue"
// Introduccin a Java, Nacho Cabanes
class Continue1 {
public static void main( String args[] ) {
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" );
}
}
En este caso, no se mostrara el texto "Terminada esta vuelta" para la pasada con
i=8, pero s se daran la pasada de i=9 y la de i=10.
Ejercicio propuesto 6.4.1: Crea un programa que muestre los nmeros del 1
al 20, excepto el 15, usando "for" y "continue"
Ejercicio propuesto 6.4.2: Crea un programa que muestre los nmeros del 1
al 10, usando "for" que vaya del 1 al 20 y "break"
6.5. Etiquetas
Tambin existe la posibilidad de usar una "etiqueta" para indicar dnde se quiere
saltar con break o continue. Slo se debera 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
// Introduccin a Java, Nacho Cabanes
class BreakEtiqueta {
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 64
Ejercicio propuesto 6.5.1: Crea un programa que muestre los nmeros del 1
al 10, usando "for" que vaya del 1 al 20 y un "break" con etiqueta.
No es necesario usar un "if" para darles valores, sino que se puede hacer
directamente asignndoles el valor de una condicin, as:
// Booleano2.java
// Segundo ejemplo de variables "bool"
// Introduccin a Java, Nacho Cabanes
import java.util.Scanner;
class Booleano2 {
public static void main( String args[] ) {
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 vlido!");
}
while ( ! todoCorrecto );
System.out.println("Terminado!");
}
}
Ejercicio propuesto 7.1.1: Crea un programa que pida al usuario un nmero
entero y, si es par, d el valor "true" a una variable booleana llamada "esPar";
es caso contrario, le dar el valor "false".
7.2. Caracteres
El tipo de datos char lo usaremos para almacenar una letra del alfabeto, o un
dgito numrico, o un smbolo de puntuacin, o cualquier otro carcter. Ocupa 2
bytes. Sigue un estndar llamado Unicode (que a su vez engloba a otro estndar
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 sera
// Char1.java
// Segundo ejemplo de variables "bool"
// Introduccin a Java, Nacho Cabanes
class Char1 {
public static void main( String args[] ) {
char letra1, letra2;
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 67
letra1 = 'a';
letra2 = 'b';
System.out.print("La primera letra es : ");
System.out.println(letra1);
System.out.print("La segunda letra es : ");
System.out.println(letra2);
}
}
Java no permite usar un "Scanner" para leer desde teclado letra a letra, as que la
mayora de operaciones con letras las haremos dentro de poco, cuando sepamos
manejar cadenas de texto.
poder
almacenar
palabras
frases.
Realmente
en
Java
hay dos
"variantes" de las cadenas de texto: existe un tipo de datos llamado "String" (con
la primera letra en maysculas, al contrario que los tipos de datos que habamos
visto hasta ahora) y otro tipo de datos llamado "StringBuilder". Un "String" ser
una cadena de caracteres constante, que no se podr modificar (podremos leer su
valor, extraer parte de l, etc.; pero para cualquier modificacin, deberemos volcar
los datos a una nueva cadena), mientras que un "StringBuilder" se podr
modificar "con ms facilidad" (podremos insertar letras, dar la vuelta a su
contenido, etc) a cambio de ser ligeramente menos eficiente (ms lento).
7.3.1. String
Las cadenas se declaran con la palabra "String" (cuidado: la primera letra debe
estar en maysculas) y su valor se asigna entre dobles comillas:
// String1.java
// Primer contacto con los String (cadenas de texto)
// Introduccin a Java, Nacho Cabanes
class String1 {
public static void main( String args[] ) {
String saludo = "Hola";
System.out.print( "El saludo es... " );
System.out.println( saludo );
}
}
Podemos "concatenar" cadenas (juntar dos cadenas para dar lugar a una nueva)
con el signo +, el mismo que usamos para sumar nmeros. Es frecuente utilizarlo
para escribir varias cosas en una misma frase:
// String2.java
// Primer contacto con los String: concatenacin
// Introduccin a Java, Nacho Cabanes
class String2 {
public static void main( String args[] ) {
String saludo = "Hola " + "t";
System.out.println( "El saludo es... " + saludo );
}
}
Para comprobar si una cadena de texto tiene un cierto valor o no, podemos
emplear los smbolos "==" y "!=", igual que con los nmeros:
// String3.java
// Tercer contacto con los String: comparacin
// Introduccin a Java, Nacho Cabanes
class String3 {
public static void main( String args[] ) {
String saludo = "Hola";
if (saludo == "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" (tambin llamadas
"mtodos") que podemos aplicar a una cadena. Vamos a ver un ejemplo de
algunas de las ms frecuentes y luego detallaremos un poco:
// String4.java
// Ejemplo ms detallado de uso de String
// Introduccin a Java, Nacho Cabanes
import java.util.Scanner;
class String4 {
public static void main( String args[] ) {
// Forma "sencilla" de dar un valor
String texto1 = "Hola";
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 69
resultado);
String texto1 = "Hola"; es la forma normal de dar valor a una variable que
vaya a guardar cadenas de texto.
resultado = texto1 + 5 + " " + 23.5 + '.'; Si uno de los datos es numrico, se
convertir a la expresin de cadena equivalente para poderlo concatenar.
Una lista un poco ms detallada de los "mtodos" (operaciones con nombre) que
se pueden aplicar sobre una cadena podra ser::
Mtodo
Cometido
length()
toLowerCase()
toUpperCase()
substring(int desde,
int cuantos)
dada
replace(char antiguo,
char nuevo)
trim()
startsWith(String
subcadena)
endsWith(String
subcadena)
indexOf(String
subcadena,
[int desde])
lastIndexOf(String
valueOf( objeto )
concat(String cadena)
equals(String cadena)
Mira si las dos cadenas son iguales (lo mismo que "= =")
equals-IgnoreCase(
String cadena)
compareTo(String
cadena2)
si es "mayor").
7.3.2. StringBuilder
Por su parte, los mtodos bsicos de un StringBuilder, que representa una
cadena de texto modificable, son:
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 73
Mtodo
Cometido
length()
setLength()
toString()
reverse()
append( objeto )
Para definir la variable podemos usar dos formatos: "double a[]" (que es la
sintaxis habitual en C y C++, no recomendada en Java) o bien "double[] a" (que es
la sintaxis recomendada en Java, y posiblemente es una forma ms "razonable" de
escribir "la variable a es un array de doubles").
Lo habitual no ser conocer los valores en el momento de teclear el programa,
como hemos hecho esta vez. Ser mucho ms frecuente que los datos los teclee el
usuario o bien que los leamos de algn fichero, los calculemos, etc. En este caso,
tendremos que reservar el espacio, y los valores los almacenaremos a medida que
vayamos conocindolos.
Para ello, primero declararamos que vamos a utilizar un array, as:
double[] datos;
y daramos los valores de una forma similar a la que hemos visto en el ejemplo
anterior:
datos[25] = 100 ; datos[0] = i*5 ; datos[j+1] = (j+5)*2;
Vamos a ver un ejemplo algo ms completo, con tres arrays de nmeros 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
// Aplicacin de ejemplo con Arrays
// Introduccin a Java, Nacho Cabanes
class Array2 {
public static void main( String args[] ) {
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 76
Y si queremos que sea el usuario el que introduzca los valores y luego mostrar
esos valores, lo podramos conseguir de esta manera:
// Array3.java
// Leer de teclado y mostrar datos de un array
// Introduccin a Java, Nacho Cabanes
import java.util.Scanner;
class Array3 {
public static void main( String args[] ) {
Scanner teclado = new Scanner(System.in);
int[] datos = new int[5];
for (int i=0; i<5; i++)
{
System.out.print( "Deme el dato "+i+": " );
datos[i] = teclado.nextInt();
}
for (int i=4; i>=0; i--)
{
System.out.println( "El dato "+ i +" vale " + datos[i] );
}
}
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 77
Como se ve en ese ejemplo, para indicar que un dato ser constante usaremos la
palabra
"final"
existe
el
convenio
de
usar
nombres
totalmente
el programa le responder cuntos das tiene ese mes. Se repetir hasta que el
usuario introduzca un mes menor que 1 o mayor que 12.
Ejercicio propuesto 7.4.4: Crea un programa que prepare un array que
contenga el nombre de cada mes del ao. El usuario introducir un nmero de
mes (por ejemplo, 4 para abril) y el programa le dir el nombre de ese mes.
Ejercicio propuesto 7.4.5: Si has estudiado estadstica, crea un programa que
pida al usuario 10 nmeros reales de doble precisin, los guarde en un array y
luego muestre su media aritmtica, varianza y desviacin tpica.
Ejercicio propuesto 7.4.6: Crea un programa que pida al usuario 10 nmeros
enteros largos, los guarde en un array y despus pregunte qu nmero quiere
buscar y le contestar si ese nmero forma parte de los 10 iniciales o no.
Volver a preguntar qu nmero desea buscar, hasta que el usuario
introduzca "-1" para indicar que no quiere seguir buscando.
Ejercicio propuesto 7.4.7: Crea un programa que prepare un array de hasta
1000 nmeros enteros. El usuario podr elegir aadir un nuevo dato (tendrs
que llevar la cuenta la cantidad de datos que ya hay introducidos), buscar para
comprobar si aparece un cierto dato, o salir del programa.
Ejercicio propuesto 7.4.8: Si has estudiado lo que es un vector, crea un dos
arrays de tres elementos, cada uno de los cuales representar un vector de
tres dimensiones. Pide al usuario los datos para ambos vectores, luego
mustralos en la forma "(5, 7, -2)", despus calcula (y muestra) su producto
escalar y su producto vectorial.
Si no necesitamos una nica serie de datos sino varias, podemos usar un array
bidimensional. Por ejemplo, podramos crear un array con dos filas de dos
elementos cada una, as:
// ArrayBi.java
// Ejemplo de array bidimensional
// Introduccin a Java, Nacho Cabanes
class ArrayBi {
public static void main( String args[] ) {
int[][] datos
datos[0][0] =
datos[0][1] =
datos[1][0] =
datos[1][1] =
= new int[2][2];
5;
1;
-2;
3;
}
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.
Ejercicio propuesto 7.4.10: Crea un programa que cree un array de 5x5
caracteres, lo rellene con puntos, excepto la segunda fila, que estar rellena de
letras "A" y luego muestra el contenido del array en pantalla. Deber aparecer
algo como:
.....
AAAAA
.....
.....
.....
Ejercicio propuesto 7.4.11: Crea un programa que cree un array de 5x5
caracteres, lo rellene con puntos en todas las posiciones excepto aquellas en
las que el nmero de fila es igual al nmero de columna, en las que pondr un
X. Luego muestra su contenido en pantalla, que deber ser algo como:
X....
.X...
..X..
...X.
....X
Significado
abs()
Valor absoluto
acos()
Arcocoseno
asin()
Arcoseno
atan()
atan2( , )
ceil()
cos(double)
Coseno
exp()
Exponencial
floor()
log()
max( , )
min( , )
pow( , )
random()
rint(double)
Entero ms prximo
round()
sin(double)
sin(double)
sqrt()
Raz cuadrada
tan(double)
Tangente
// Matem.java
// Ejemplo de matemticas desde Java
// Introduccin a Java, Nacho Cabanes
class Matem {
public static void main( String args[] ) {
System.out.print( "2+3 es ");
System.out.println( 2+3 );
System.out.print( "2*3 es ");
System.out.println( 2*3 );
System.out.print( "2-3 es ");
System.out.println( 2-3 );
System.out.print( "3/2 es ");
System.out.println( 3/2 );
System.out.print( "3,0/2 es ");
System.out.println( 3.0/2 );
System.out.print( "El resto de dividir 13 entre 4 es ");
System.out.println( 13%4 );
System.out.print( "Un nmero al azar entre 0 y 1: ");
System.out.println( Math.random() );
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 82
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 nmero al azar entre 0 y 1: 0.9775498588615054
Un nmero al azar entre 50 y 150: 71
Una letra minscula al azar: u
Coseno de PI radianes: -1.0
Seno de 45 grados: 0.7071067811865475
Arco cuya tangente es 1: 45.0
Raz cuadrada de 36: 6.0
Cinco elevado al cubo: 125.0
Exponencial de 2: 7.38905609893065
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 83
Su resultado sera
La longitud de la circunferencia de radio 4 es 25.13
Y desde "main" (el cuerpo del programa) usaramos esa funcin tantas veces como
quisiramos:
public static void main( String args[] ) {
escribirLongCircunf(4);
escribirLongCircunf(6);
...
Por ahora, hasta que sepamos un poco ms, daremos por sentado que todas las
funciones tendrn que ser "public" y "static".
Ejercicio propuesto 9.1.1: Crea una funcin llamada "borrarPantalla", que
borre la pantalla dibujando 25 lneas en blanco. No debe devolver ningn
valor. Crea tambin un "main" que permita probarla.
Ejercicio propuesto 9.1.2: Crea una funcin llamada "dibujarCuadrado3x3",
que dibuje un cuadrado formato por 3 filas con 3 asteriscos cada una. Crea
tambin un "main" para comprobar que funciona correctamente.
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 87
9.2. Parmetros
Nuestra funcin "escribirLongCircunf" reciba un dato entre parntesis, el radio de
la circunferencia. Estos datos adicionales se llaman "parmetros", y pueden ser
varios, cada uno indicado con su tipo de datos y su nombre.
Ejercicio propuesto 9.2.1: Crea una funcin que dibuje en pantalla un
cuadrado del ancho (y alto) que se indique como parmetro. Completa el
programa con un "main" que permita probarla.
Ejercicio propuesto 9.2.2: Crea una funcin que dibuje en pantalla un
rectngulo del ancho y alto que se indiquen como parmetros. Completa el
programa con un "main" que permita probarla.
Por el contrario, las funciones matemticas suelen dar una serie de pasos y
devolver un resultado, por lo que no sern "void", sino "int", "double" o del tipo
que corresponda al dato que devuelven. Por ejemplo, podramos calcular la
superficie de un crculo as:
public static double superfCirculo( int radio ) {
double superf = 3.1415926535 * radio * radio;
double superfConDosDecimales =
Math.round(superf * 100) / 100.0;
return superfConDosDecimales;
}
double longConDosDecimales =
Math.round(longitud * 100) / 100.0;
return longConDosDecimales;
}
Ejercicio propuesto 9.3.1: Crea una funcin que calcule el cubo de un nmero
real (float) que se indique como parmetro. El resultado deber ser otro
nmero real. Prubala para calcular el cubo de 3.2 y el de 5.
Ejercicio propuesto 9.3.2: Crea una funcin que calcule el menor de dos
nmeros enteros que recibir como parmetros. El resultado ser otro
nmero entero.
Ejercicio propuesto 9.3.3: Crea una funcin que devuelva la primera letra de
una cadena de texto. Prueba esta funcin para calcular la primera letra de la
frase "Hola".
Ejercicio propuesto 9.3.4: Crea una funcin que devuelva la ltima letra de
una cadena de texto. Prubala para calcular la ltima letra de la frase "Hola".
Ejercicio propuesto 9.3.5: Crea una funcin "esPrimo", que reciba un nmero
y devuelva el valor booleano "true" si es un nmero primo o "false" en caso
contrario.
podran ser de tres tipos distintos, pero no afinaremos tanto por ahora) y
un "Ovni".
Tanto la "Nave" como las "Torres", los "Enemigos" y el "Ovni" son tipos
concretos de "Sprite" (esa relacin entre un objeto ms genrico y uno ms
especfico se indica con las puntas de flecha, que sealan al objeto ms
genrico).
general, lo ms correcto ser definir cada clase en un fichero. Aun as, vamos a
ver primero un ejemplo que contenga dos clases en un solo fichero
//
//
//
//
//
DosClases.java
Primer ejemplo de una clase nuestra
que accede a otra tambin nuestra,
ambas definidas en el mismo fichero
Introduccin a Java, Nacho Cabanes
class Principal {
public static void main( String args[] ) {
Secundaria s = new Secundaria();
s.saluda(); // Saludo de "Secundaria"
saluda(); // Saludo de "Principal"
}
public static void saluda() {
System.out.println( "Saludando desde " );
}
}
// ---------------------------------------------------class Secundaria {
public void saluda() {
System.out.println( "Saludando desde " );
}
}
En este fuente hay dos clases, una llamada "Principal" y otra llamada
"Secundaria".
Y en pantalla se mostrara:
Saludando desde <Principal>
Saludando desde <Secundaria>
Si usamos Geany como editor, nos interesar que el propio programa se llame
Principal.java, igual que la que va a ser la clase que habr que ejecutar
posteriormente; de lo contrario, cuando pidamos lanzar el programa, se buscara
un fichero DosClases.class (porque nuestro fuente era DosClases.java), pero ese
fichero no existe...
Ahora vamos a ver un ejemplo en el que las dos clases estn en dos ficheros
distintos. Tendremos una clase "sumador" que sea capaz de sumar dos nmeros
(no es gran cosa, sabemos hacerlo sin necesidad de crear "clases a propsito",
pero nos servir como ejemplo) y tendremos tambin un programa principal que
la utilice.
//
//
accede a "Sumador.java"
class UsaSumador {
recibiramos como respuesta un mensaje de error que nos dira que no existe la
clase Sumador:
UsaSumador.java:13: Class Sumador not found.
Sumador suma = new Sumador();
^
UsaSumador.java:13: Class Sumador not found.
Sumador suma = new Sumador();
^
2 errors
10.3. Herencia
Hemos comentado que unas clases podan "heredar" atributos y mtodos de otras
clases. Vamos a ver cmo se refleja eso en un programa. Crearemos un "escritor
de textos" y despus lo mejoraremos creando un segundo escritor que sea capaz
adems de "adornar" los textos poniendo asteriscos antes y despus de ellos.
Finalmente, crearemos un tipo de escritor que slo escriba en maysculas...
// Herencia.java
// Primer ejemplo de herencia entre clases,
//
todas definidas en el mismo fichero
// Introduccin a Java, Nacho Cabanes
class Escritor {
public static void escribe(String texto) {
System.out.println( texto );
}
}
Despus creamos una clase que ampla las posibilidades de sta. Se llama
"EscritorAmpliado", y se basa (extends) en Escritor. Como "hereda" las
caractersticas de un Escritor, tambin "sabr escribir" usando el mtodo
"escribe", sin necesidad de que se lo volvamos a decir.
Despus creamos una tercera clase, que en vez de ampliar las posibilidades
de "Escritor" lo que hace es basarse (extends) en ella pero cambiando el
comportamiento (slo escribir en maysculas). En este caso, no aadimos
nada, sino que reescribimos el mtodo "escribe", para indicarle que debe
hacer cosas distintas (esto es lo que se conoce como polimorfismo: el
mismo nombre para dos elementos distintos -en este caso dos funciones-,
cuyos comportamientos no son iguales). Para rizar el rizo, en el nuevo
mtodo "escribe" no usamos el tpico "System.out.println" (lo podamos
haber hecho perfectamente), sino que nos apoyamos en el mtodo
"escribe" que acabbamos de definir para la clase "Escritor".
Ejercicio
propuesto
10.3.1: Crea
una
nueva
clase
Privado (private), para lo que no deba ser accesible desde otras clases,
como los atributos o algunas funciones auxiliares.
Un ejemplo sera
//
//
//
//
//
Getters.java
Segundo ejemplo de herencia entre clases,
todas definidas en el mismo fichero
Incluye getters y setters
Introduccin a Java, Nacho Cabanes
class Escritor {
public static void escribe(String texto) {
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 100
System.out.println( texto );
}
}
// ---------------------------------------------------class Getters {
public static void main( String args[] ) {
Escritor e = new Escritor();
EscritorMargen e2 = new EscritorMargen();
e.escribe("El primer escritor sabe escribir");
e2.setMargen( 5 );
e2.escribe("El segundo escritor tambin, con margen");
}
}
Ejercicio propuesto 10.4.1: Crea una nueva clase "EscritorDosMargenes" que
se base en "EscritorMargen", aadindole un margen derecho. Si el texto
supera el margen derecho (suponiendo 80 columnas de anchura de pantalla),
deber continuar en la lnea siguiente.
Getters2.java
Segundo ejemplo de herencia entre clases,
todas definidas en el mismo fichero
Incluye getters y setters
Versin sin "static"
Introduccin a Java, Nacho Cabanes
class Escritor {
public void escribe(String texto) {
System.out.println( texto );
}
}
// ---------------------------------------------------class Getters2 {
public static void main( String args[] ) {
Escritor e = new Escritor();
EscritorMargen e2 = new EscritorMargen();
e.escribe("El primer escritor sabe escribir");
e2.setMargen( 5 );
e2.escribe("El segundo escritor tambin, con margen");
}
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 102
Ejercicio propuesto 10.5.1: Crea una versin del ejercicio 10.4.1, que no
utilice "static".
10.6. Constructores
Nos puede interesar dar valores iniciales a los atributos de una clase. Una forma
de hacerlo es crear un mtodo (una funcin) 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 mayora de lenguajes de programacin actuales: podremos
crear "constructores", que se lanzarn automticamente al crear el objeto. La
forma de definirlos es con una funcin que se llamar igual que la clase, que no
tendr ningn tipo devuelto (ni siquiera "void") y que puede recibir parmetros. De
hecho, podemos incluso crear varios constructores alternativos, con distinto
nmero o tipo de parmetros:
// Constructores.java
// Ejemplo de clases con constructores
// Introduccin a Java, Nacho Cabanes
class Escritor {
protected String texto;
public Escritor(String nuevoTexto) {
texto = nuevoTexto;
}
public Escritor() {
texto = "";
}
public String getTexto() {
return texto;
}
public void setTexto(String nuevoTexto) {
texto = nuevoTexto;
}
public void escribe() {
System.out.println( texto );
}
}
// ---------------------------------------------------class Constructores {
public static void main( String args[] ) {
Escritor e = new Escritor("Primer escritor");
EscritorMargen e2 =
new EscritorMargen("Segundo escritor");
e.escribe();
e2.setMargen( 5 );
e2.escribe();
}
}
propuesto
10.6.1: Crea
una
nueva
versin
de
la
clase
11. Ficheros
11.1. Por qu usar ficheros?
Con frecuencia tendremos que guardar los datos de nuestro programa para
poderlos recuperar ms adelante. Hay varias formas de hacerlo. Una de ellas son
los ficheros, que son relativamente sencillos. Otra forma ms eficiente cuando es
un volumen de datos muy elevado es usar una base de datos, que veremos ms
adelante.
Abrir el fichero
Cerrar el fichero
Hay que recordar siempre esos tres pasos: si no guardamos o leemos datos, no
hemos hecho nada til; si no abrimos fichero, obtendremos un mensaje de error
al intentar acceder a su contenido; si no cerramos el fichero (un error frecuente),
puede que realmente no se llegue a guardar ningn dato, porque no se vace el
"buffer" (la memoria intermedia en que se quedan los datos preparados hasta el
momento de volcarlos a disco).
En el caso de un fichero de texto, no escribiremos con "println", como hacamos en
pantalla, sino con "write". Cuando queramos avanzar a la lnea siguiente,
deberemos usar "newLine()":
ficheroSalida.write("Hola");
ficheroSalida.newLine();
Por otra parte, para cerrar el fichero (lo ms fcil, pero lo que ms 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
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 105
Como se ve en este ejemplo, todo el bloque que accede al fichero deber estar
encerrado tambin en un bloque try-catch, para interceptar errores.
// FicheroTextoLeer.java
// Ejemplo de lectura desde un fichero de texto
// Introduccin a Java, Nacho Cabanes
import java.io.*;
class FicheroTextoLeer
{
public
{
//
//
//
if (! (new File("fichero.txt")).exists() )
{
System.out.println("No he encontrado fichero.txt");
return;
}
System.out.println("Leyendo fichero de texto...");
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() );
}
}
}
Este ejemplo cuenta la cantidad de letras "a" que contiene un fichero de cualquier
tipo, ya sea de texto, ejecutable, documento creado con un procesador de textos o
cualquier otro fichero.
Ejercicio propuesto 11.4.1: Crea un programa que lea el contenido de un
fichero binario, mostrando en pantalla todo lo que sean caracteres
imprimibles (basta con que sean desde la A hasta la Z, junto con el espacio en
blanco).
Ejercicio propuesto 11.4.2: Crea un programa que extraiga el contenido de un
fichero binario, volcando a un fichero de texto todo lo que sean caracteres
imprimibles (basta con que sean desde la A hasta la Z, junto con el espacio en
blanco).
Ejercicio propuesto 11.5.1: Crea un programa que lea los primeros 54 bytes
de un fichero BMP (su cabecera) y compruebe si los dos primeros bytes de
esos 54 corresponden a las letras B y M. Si no es as, mostrar el mensaje "No
es un BMP vlido"; si lo son, escribir el mensaje "Parece un BMP vlido"
Ejercicio propuesto 11.5.2: Crea una versin del ejercicio 11.4.2, leyendo a un
array: un programa que extraiga el contenido de un fichero binario, volcando a
un fichero de texto todo lo que sean caracteres imprimibles (basta con que
sean desde la A hasta la Z, junto con el espacio en blanco).
Cambios en el curso
0.13, de 21 de octubre de 2006: Tema 12, toma de contacto con los Applets.
0.19, de 26 de junio de 2011: Revisin del tema 9, para incluir los detalles de
cmo crear un proyecto de varios fuentes con NetBeans y para aadir un
ejercicio propuesto. Ligera revisin del tema 10, que tambin incluye un
ejercicio propuesto.
Introduccin a Java 0.40, por Nacho Cabanes - Pgina 111