1DAM PROG U02 Primeros Pasos en Java
1DAM PROG U02 Primeros Pasos en Java
PRIMEROS PASOS
EN
JAVA
PROGRAMACIÓN
IES Serra Perenxisa
1DAM
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
BIBLIOGRAFÍA:
- Java, Cómo Programar (10ª Ed.).
Pearson. Paul Deitel (2016).
- Introduction to Programming Using Java (7ªEd).
David J. Eck (2014)
- Documentación oficial de Java, Oracle.
2/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
3/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
EN MICROSOFT WINDOWS
Desde la página de descarga, se elige la versión deseada del JDK. Una vez
descargado el programa de instalación basta con ejecutarlo.
Hay que prestar atención al directorio en el que se ha instalado. La razón
es que a veces debemos modificar 3 variables del sistema (variables que
4/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
utiliza Windows) para ejecutar desde el sistema (al margen de un IDE) los
programas. Aunque algunas veces los instalables utilizan el registro de
Windows en lugar de las variables de entorno, no está mal dejarlas
configuradas. Estas 3 variables son:
PATH
Contiene rutas por defecto donde el SO busca programas que se piden
ejecutar. Hay que incluir donde están los programas del JDK porque si
queremos usar por ejemplo javac (el compilador de java) debe estar
disponible desde cualquier carpeta. Ese programa y el resto de programas
del JDK están en la carpeta bin, dentro de la carpeta donde se haya
instalado el JDK.
Si por ejemplo, al instalar el JDK SE 12, decido
instalarlo en d:\java\jdk12, debo añadir a lo
que tenía antes en la variable PATH la ruta: d:\
java\jdk12\bin. Ejemplo de cambio del
contenido de la variable path:
(1) Escribir en la caja de búsqueda variables
de entorno, aparece una opción en el
menú Editar las variables de entorno del
sistema. Al hacer clic aparece la ventana
siguiente.
(1)
(2) Pulsar el botón Variables de entorno.
(2)
5/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
(3)
(4)
(4) Ahora creas/modificas la entrada y si hay una anterior la subes o
borras para que tenga efecto la última.
(4) (4)
(4)
6/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
JAVA_HOME
Variable utilizada por la mayoría de aplicaciones basadas en Java que
contiene la ruta a la carpeta en la que se instaló el SDK. Por ejemplo,
debería contener el valor d:\java\jdk12\ en este ejemplo.
CLASSPATH
Es una variable similar al PATH que sirve para indicar rutas a las carpetas
en las que debe buscar clases que use un programa Java. Debería contener
como mínimo la carpeta raíz del SDK y la carpeta actual que se expresa
mediante el carácter punto (.).
7/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
EN GNU/LINUX
Para conocer si hay una versión instalada habría que ejecutar el comando
java –-version. Si deseamos instalar Java o actualizarlo, hay varias
opciones.
• La primera es utilizar el gestor de paquetes para descargar la
última versión del paquete jdk. O también podemos instalar desde
la línea de comandos, sería algo como:
sudo apt-get update
sudo apt-get install default-jdk
sudo apt-get install default-jre
# Si queremos una versión concreta, por ejemplo la 19:
sudo apt-get install openjdk-19-jdk
8/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Para probar que todo ha ido bien, tanto en Windows (ejecutar cmd) como
en GNU/Linux (ejecutar teminal) puedes abrir una consola (ventana de
9/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
10/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
11/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
12/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
La JVM ejecuta las sentencias que tenga este método en el orden en que
estén escritas. Una clase para poder ejecutarse (ser una aplicación) debe
ser pública y contener este método main() que sirve para saber por donde
comenzar a ejecutar.
13/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
14/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Las clases "package" (las que no son "public") son accesibles solo al
usarlas desde su propio package, no desde fuera.
También hay otras implicaciones: si la clase es public, el fichero debe
llamarse como ella (por tanto, como consecuencia, solo puede haber una
clase pública en cada fichero .java).
Nota: el nombre de la clase pública del programa y el nombre del fichero
donde se almacena deben coincidir, de lo contrario, dará error al compilar
cuando tengamos aplicaciones formadas por más de una clase.
Resumiendo: haz coincidir el nombre del archivo .java y el nombre de la
clase pública que contiene, tanto en mayúsculas como en minúsculas.
15/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
16/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
17/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
18/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
19/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
20/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Los comentarios javadoc hay que colocarlos en tres sitios distintos dentro
del código java de la aplicación:
• Al principio de una clase/interface. En esta zona se colocan
comentarios que describen la clase o interface. Se suelen utilizar las
etiquetas: @author, @version, @see, @since y @deprecated
• Delante de cada método. Los métodos describen las cosas que
puede realizar una clase. Delante de cada método los comentarios
se usan para describir al método en concreto. Además de los
comentarios, en esta zona se pueden incluir las etiquetas: @see,
@param, @exception, @return, @since y @deprecated
• Delante de cada atributo/dato global. Se describe para qué sirve
cada dato en cada clase. Pueden contener las etiquetas: @serial,
@serialData, @serialfield, @value, @deprecated
EJEMPLO 4: Añade al
programa Ejemplo203 los
comentarios javadoc
resaltados en amarillo y
luego usa la herramienta
para generar la
documentación. Luego abre
el documento index.html
generado.
Aparece como resultado la
página web de la página
siguiente.
21/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Si necesitamos trabajar con fechas, podemos utilizar la clase Date que está
definida en el paquete java.util. Es necesario escribir una instrucción que
permita incorporar el código de la clase Date cuando compilemos nuestro
22/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Esto significa que se va a incluir en el código todas las clases que están
dentro del paquete java.util. En realidad no es obligatorio escribir la
palabra import para utilizar una clase, pero sin ella hay que escribir el
nombre completo de la clase. Es decir, no podríamos utilizar el nombre
Date, sino java.util.Date cada vez que queramos usar una fecha.
23/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
24/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
25/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
26/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
27/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
CONSTANTES SIMBÓLICAS
Una constante es una variable de sólo lectura. Dicho de otro modo más
correcto, es un dato que no puede cambiar de valor (por lo tanto no es una
variable) o puede cambiar una sola vez (el primer valor que guardes no
cambia). La forma de declarar constantes es la misma que la de declarar
variables, sólo que hay que anteponer la palabra reservada final (un
modificador) que es la que indica que estamos declarando una constante
y por tanto no podremos cambiar su primer valor inicial:
final double PI = 3.141591;
PI = 4; //Error, no podemos cambiar el valor de PI una segunda vez
28/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
otro modo, no se puede utilizar una variable más allá del bloque en el que
ha sido definida. Ejemplo:
{
{
int x= 9;
}
int y = x; // error, ya no existe x -> fuera de su ámbito
}
29/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
30/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Booleanos: boolean
Cadenas de texto:
String, StringBuilder,
StringBuffer
TIPOS
Números: BigInteger,
DE Datos: BigDecimal, Number…
DATOS
Tiempo: Date, Calendar,
EN Biblioteca
LocalDate, LocalTime, …
JAVA estándar
Otros: …
Colecciones de Datos: List,
CLASES Set, Map…
Pueden tener datos
primitivos, permiten Otros: Scanner, Thread, …
fabricar Objetos que
Son algo Array: vectores y tablas. No tienen métodos!!
complejo (tienen
datos y código), hay Wrappers: Byte, Short, Integer,
Long, Float, Double,
que crearlos con Character, Boolean
new, usan
referencias… Definidas por los programadores
31/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
32/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
NÚMEROS ENTEROS
Los tipos byte, short, int y long sirven para almacenar datos numéricos
enteros (sin decimales) tanto positivos como negativos. Se pueden utilizar
constantes literales enteras escritas en decimal, o bien en binario o en octal
o en hexadecimal. Los valores binarios se prefijan con un cero y una b (0b
ó 0B), los octales se indican anteponiendo un cero a la izquierda del
número (012), los hexadecimales anteponiendo un cero a la izquierda y
una letra equis (0x). Ejemplos:
int numero = 16; // 16 en decimal
numero = 0b10000; // 16 en binario
numero = 020; // 16 en octal
numero = 0x10; // 16 en hexadecimal
33/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Por último, decir que se puede usar el carácter subrallado para separar
grupos de dígitos en los valores numéricos y hacerlos más entendibles:
int numero = 0b1000_0011; // 130 en binario
numero = 700_000; // setecientos mil +fácil leer que 700000
34/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
A un valor literal (como 1.5 por ejemplo), se le puede indicar con una f al
final del número que es float (1.5f por ejemplo) o una d para indicar que es
double. Si no se indica nada, un número literal con decimales siempre se
entiende que es double, por lo que al usar tipos float hay que convertir los
literales. Se pueden representar en notación científica:
significaría 1,345 x 103 o lo que es lo mismo 1345. Lógicamente no
1.345E+3
podemos asignar valores decimales a tipos de datos enteros:
int x = 9.5; // error. Sí podremos mediante un casting
int x = (int) 9.5; // pero perdemos los decimales (x vale 9)
CARACTERES
Los valores de tipo carácter sirven para almacenar símbolos de escritura
(en Java se puede almacenar cualquier código Unicode). Los valores
35/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Unicode son los que Java utiliza para los caracteres. Ejemplo:
char letra;
letra = 'C'; // Los valores char van entre comillas, pero son int
letra = 67; // El código Unicode de la C es el 67. Hace lo mismo
También hay una serie de caracteres especiales que van precedidos por el
símbolo contrabarra (barra a la izquierda: \), que sirve para escapar del
significado normal de la letra que le sigue. Son los que aparecen en esta
tabla:
36/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
double u = 8.0;
double w = x; // Para poder guardarlo, transforma 4 en 4.0
double z = x + y; // Para sumar transforma 4 (valor de x) en 4.0
37/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
b = a;
En el siguiente ejemplo:
byte n1 = 100, n2 = 100, n3;
n3 = n1 * n2 / 100;
Los castings también se usan con clases, pero deben de realizarse entre
clases compatibles. Es una forma de utilizar el polimorfismo de la
orientación a objetos. Por ejemplo:
String s = (String)(new StringBuilder("Hola"));// Ok, compatibles
Date f = (Date) new BigDecimal("2"); // Error:clases incompatibles
38/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
39/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
OPERADORES ARITMÉTICOS
Son operaciones matemáticas que trabajan con datos numéricos:
El operador módulo (%) sirve para calcular el resto de una división entera.
Ejemplo:
int resultado, i1 = 14, i2 = 5;
resultado = i1 % i2; // El resultado será 4
40/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
41/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Operadores de incremento/decremento
Los operadores “++” (incremento) y “--“ (decremento) aumentan y
disminuyen respectivamente el valor de una variable numérica en 1
unidad. Ejemplos:
x++; // esto es como x = x + 1;
x--; // esto es como x = x - 1;
42/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Ejemplo:
paga = edad > 18 ? 6_000 : 3_000;
En este caso si la variable edad es mayor de 18, la paga será de 6000, si no,
será de 3000. Se evalúa una condición y según es cierta o no se devuelve
un valor u otro. Observa que las expresiones de este operador han de
acabar siendo un valor del mismo tipo (booleano?dato1:dato2) y no es
adecuado usar una sentencia sino una expresión (acaba siendo un dato).
Es decir, no funcionaría:
edad > 18 ? paga = 6000 : paga = 3000; // ERROR!!!!
43/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
PRECEDENCIA DE OPERADORES
A veces hay expresiones con operadores que resultan confusas. Por
ejemplo en:
resultado = 8 + 4 / 2;
44/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
45/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
/* Hacer cálculos */
principal = 17000;
ratio = 2.7 / 100; // Se puede usar tb. 0.027
intereses = principal * ratio; // Calcular interes anual
principal = principal + interes; // Dinero después de un año
// (Nota: el nuevo valor reemplaza al anterior)
/* Mostrar resultados */
System.out.print("El interés ganado en €: ");
System.out.println(intereses);
System.out.print("Capital después de un año en €: ");
System.out.println(principal);
} // final de main()
} // final de la clase Interes
46/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
47/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Cuando una clase tiene variables o métodos estáticos que queremos usar
desde el exterior de la clase, el nombre de la clase es parte del nombre
completo de la variable o método. Por ejemplo, la clase System contiene un
método estático llamado exit(int aviso). Para usarlo en tus programas,
debes llamarlo escribiendo el nombre de la clase (no lo contiene un objeto,
lo contiene una clase al ser estático). Este método hace que un programa
acabe su ejecución y devuelva al sistema operativo un valor entero que
puede servir de indicador o de "chivato" del motivo por el que ha
finalizado. Además, la máquina virtual que lo ejecuta también acaba:
System.exit(0); // El programa ha acabado de forma correcta
System.exit(1); // El programa acaba por la causa 1
Clase System
La clase System tiene información (property) sobre el sistema que puedes
consultar con System.getProperty(String clave) y cambiar algunas:
Clave Descripción
java.version Versión del JRE
java.version.date Fecha del JRE
java.vendor Fabricante del JRE
java.vendor.url URL del fabricante del JRE
java.vendor.version Versión del fabricante
java.home Directorio de instalación de Java
java.vm.specification.version Versión de la Java Virtual Machine
48/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Clave Descripción
java.vm.specification.vendor Vendedor de la JVM
java.vm.specification.name Nombre de la JVM
java.vm.version Versión de la JVM
java.vm.vendor Fabricante de la JVM
java.vm.name Nombre de la JVM
java.specification.version Versión del JRE
java.specification.vendor Fabricante del JRE
java.specification.name Jnombre del JRE
java.class.version Número de versión de la clase
Java class path consulta
java.class.path
ClassLoader.getSystemClassLoader()
Lista de rutas de búsqueda para cargar
java.library.path
librerías de código
java.io.tmpdir Ruta por defecto a la carpeta temporal
java.compiler Número del compilador JIT
os.name Nombre del sistema operativo
os.arch Arquitectura del sistema operativo
os.version Versión del sistema operativo
file.separator Separador de ficheros ("/" en UNIX)
path.separator Separador de rutas (":" en UNIX)
line.separator Separador de líneas ("\n" en UNIX)
user.name Nombre del usuario que ejecuta
user.home Carpeta personal del usuario
user.dir Carpeta de trabajo actual del usuario
native.encoding Nombre del charset
49/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
50/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
51/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
52/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
MÉTODO DESCRIPCIÓN
char charAt(int i) carácter que está en la posición i
int compareTo(String s) Compara las dos cadenas. Devuelve un valor
menor que cero si la cadena s es mayor que la
original, 0 si son iguales y devuelve un valor
mayor que cero si s es menor que la original
int compareToIgnoreCase(String s) Compara dos cadenas, pero no tiene en cuenta si
el texto es mayúsculas o no.
String concat(String s) Añade la cadena s a la cadena original.
53/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
MÉTODO DESCRIPCIÓN
String copyValueOf(char[] c) Produce String igual al array de caracteres c.
boolean endsWith(s) true si la cadena termina con el texto s.
boolean equals(s) Compara ambas cadenas, true si son iguales.
boolean equalsIgnoreCase(s) Compara ambas cadenas sin tener en cuenta
mayúsculas y minúsculas.
byte[] getBytes() Devuelve array de bytes de los códigos de cada
carácter del String
void getBytes(int si, int sf, Almacena contenido de la cadena en el array de
char[] d, int di); caracteres d. Toma los caracteres desde la posición
si hasta la posición sf y los copia en el array desde
la posición di
int indexOf(s) Devuelve la posición en la cadena del texto s.
int indexOf(s, pos) Devuelve la posición en la cadena del texto
s, empezando a buscar desde posición pos
int lastIndexOf(s) Devuelve la última posición en la cadena
del texto s
int lastIndexOf(s, pos) última posición en la cadena del texto s,
empezando a buscar desde la posición pos
boolean contain(String s) Si el String contiene al argumento s devuelve true
int length() longitud de la cadena
boolean matches(er) verdadero si el String cumple la expresión regular
String replace(ca, cn) cadena idéntica al original pero que ha cambiando
los caracteres iguales a ca por cn
String replaceFirst(s1, s2) Cambia la primera aparición de la cadena s1 por
la cadena s2
String replaceAll(s1, s2) Cambia la todas las apariciones de la cadena s1
por la cadena s2
String startsWith(s) true si la cadena comienza con el texto s.
String substring(p1, p2) texto que va desde posiciones p1 a p2-1.
char[] toCharArray() array de caracteres a partir de la cadena dada
54/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
MÉTODO DESCRIPCIÓN
String toLowerCase() Convierte la cadena a minúsculas
String toLowerCase(Locale loc) Lo mismo pero siguiendo las instrucciones del
argumento local
String toUpperCase() Convierte la cadena a mayúsculas
String toUpperCase(Locale loc) Lo mismo pero siguiendo las instrucciones del
argumento local
String trim() Elimina los blancos que tenga la cadena tanto por
delante como por detrás
static String valueOf(e) Devuelve la cadena que representa el valor e. Si e
es booleano, por ejemplo, devolvería una cadena
con el valor "true" o "false".
Hay una operación muy básica y que por influencia de otros lenguajes de
programación suele provocar muchos errores en los que comienzan a
programar en Java. Esta operación es comparar dos cadenas para saber si
son iguales: hay que usar s1.equals(s2) que devuelve true si las letras
de s1 y s2 son las mismas (en cantidad y posición) y false en otro caso.
55/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
usar el operador suma (+) que sirve para concatenar (unir o pegar)
cadenas de texto. Por ejemplo: "Hola" + "Mundo" genera "HolaMundo".
Observa que si quieres que quede un espacio entre las dos palabras, el
espacio debe formar parte de una de las cadenas de texto. Por ejemplo:
"Hola " + "Mundo" se evalúa a "Hola Mundo".
56/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Algunas cosas que debes tener en cuenta con los métodos de la clase Date
y que veremos en el ejemplo 6:
• El parámetro year debe ser year – 1900.
• El parámetro mes va de 0 a 11: 0 es enero, ..., 11 es diciembre.
• El día usa valores de 1 a 31 (sin problemas).
• Las horas van de 0 a 23.
57/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Define una serie de constantes que debes utilizar para obtener y cambiar
la información. Lo mejor es consultar la ayuda de la API de Java cuando
58/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
59/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
60/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
61/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
62/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
63/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
64/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
65/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
ahora.format(fL));
66/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
67/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
68/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Una vez que el tipo de dato se ha declarado, puedes usarlo para crear
variables de ese tipo de dato, igual que usas los tipos int, boolean o String.
Por ejemplo:
Estaciones vacaciones; // vacaciones es variable de tipo Estaciones
69/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
70/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Otras operaciones que pueden aplicarse a los tipos enumerados porque las
heredan de java.lang.Enum:
• name(): String con nombre de la constante. Ej: libre = Dia.DOM;
libre.name();
• toString(): String con nombre de la constante. Ej: libre.toString();
• ordinal(): entero con la posición del enum según está declarada.
Ej: libre.Ordinal(); // si es Dia.DOM vale 0
• compareTo(Enum otro): compara el enum con otro según el orden en
el que están declarados. Ej: libre.compareTo(Dia.LUN); // < 0
• values(): devuelve un array que contiene todos los enum. Ej:
Dia.values()[2]; // el valor es Dia.MAR
System.out.print(x) y System.out.println(x)
Ambas muestran x por pantalla (por defecto), con la diferencia de
quedarse en la misma línea o saltar una línea después de imprimir. De
forma que System.out.println(x) equivale a:
System.out.print(x); System.out.print( x + "\n" );
System.out.println(); o bien a:
System.out.printf( "formato", lista_de_valores )
71/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Algunos formatos típicos son: %d, %12d, %10s, %1.2f, %15.8e y %1.8g
Cada campo comienza con el porcentaje (%) y acaba con una letra
indicando el tipo de dato y entre medias hay indicadores del formato.
-
% indicadores tipo % 12 d
Por ejemplo %d y %12d, donde la letra “d” indica que se escribe un número
entero en decimal y la cantidad "12" del formato %12d indica la cantidad
mínima de espacios que ocupa la salida (el ancho). Si el valor mostrado
ocupa menos, se rellena con blancos los espacios que faltan hasta llegar a
12. Se dice que la salida está justificada a la derecha porque los espacios de
relleno se ponen a la izquierda. Si el valor tiene más de 12 dígitos, se
imprimen todos. Un formato %d equivale a %1d. Puedes usar también una
“x” para imprimir el número en hexadecimal.
La letra “s” al final de un formato indica String. Un número como en %20s,
72/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
73/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
74/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
75/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Letra Descripción
'H' Horas
'M' minutos
'S' segundos
76/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Letra Descripción
'L' Milisegundos
'N' nanosegundos
letra Descripción
'c' Fecha y hora. Como "%ta %tb %td %tT %tZ %tY". Ej:
"Sun Jul 20 16:17:00 EDT 1969"
Flags
La siguiente tabla resume flags y con qué categorías se pueden usar.
c I
G Fl
a n
e oa
r t
n ti
á e tie
Flag e ng Descripción
c g mpo
r Po
t r
a in
e a
l t
r l
77/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
import java.util.Scanner;
78/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
defecto.
Por ejemplo, la función sc.nextInt() lee un valor de tipo int y lo
devuelve. Si el valor tecleado por el usuario no es un entero correcto, el
programa lanza una excepción. El valor tecleado debe estar seguido de un
espacio en blanco o un final de línea.
Hay dos grupos principales de sentencias: las que leen del origen al que
conectas el Scanner (de nombres nextX() donde X pueden ser varios tipos
de datos) y otras que antes de leer comprueban si lo que hay es lo que
pides (comienzan por hasNextX()) Algunas funciones del objeto de tipo
Scanner, primero las que leen y luego las que comprueban:
• sc.nextInt() y sc.hasNextInt() comentada antes.
• sc.nextByte() y sc.hasNextByte() lee un byte.
• sc.nextShort() y sc.hasNextShort() lee un entero short.
• sc.nextLong() y sc.hasNextLong() lee un entero long.
• sc.nextBigInteger() y sc.hasNextBigInteger() lee entero
grande.
• sc.nextBigDecimal() y sc.hasNextBigDecimal() lee decimal
grande.
• sc.nextFloat() y sc.hasNextFloat() lee un float.
• sc.nextDouble() y sc.hasNextDouble() lee un double.
• sc.nextBoolean() y sc.hasNextBoolean() lee true o false.
• sc.nextLine() y sc.hasNextLine() lee String incluido el salto de
línea y se posiciona en la siguiente línea.
• sc.next() y sc.hasNext() lee una palabra (hasta el primer
espacio/salto).
Tiene muchos más: reset() para volver a empezar a leer desde el inicio,
skip() para saltar algún elemento, useDelimiter() para cambiar caracteres
que se considerarn separadores, etc. Pero los básicos son los comentados.
EJEMPLO 11: Un programa que lee datos de un fichero:
import java.util.Scanner; // Poder usar la clase Scanner
79/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
80/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
81/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
82/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
BLOQUES DE SENTENCIAS
El bloque de sentencias es la sentencia compuesta más simple. Su
propósito simplemente es agrupar varias sentencias para que funcionen
como una única sentencia. La sintaxis de un bloque es:
{
sentencia_o_sentencias;
}
El bloque comienza por una llave quebrada { y acaba en otra llave
quebrada }. Dentro puede no haber nada (bloque vacío) o puede tener una
o varias sentencias separadas por puntos y coma u otros bloques de
sentencias dentro (anidados).
Hay un lugar donde es obligatoria la existencia de un bloque: como
puedes imaginar, el método main() debe tener obligatoriamente un bloque
de sentencias. Dos ejemplos de bloques:
{
System.out.print("La respuesta es ");
System.out.println(respuesta);
}
{ // Este bloque intercambia los valores de x e y
83/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
84/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
if (condición) {
instrucciones_si_cierta;
} else {
instrucciones_si_falsa;
}
Como en el caso anterior, las llaves son necesarias sólo si se ejecuta más de
una sentencia.
EJEMPLO 13: de sentencia if-else:
if( nota >= 5 ) {
System.out.println("Aprobado");
aprobados++;
}
else {
System.out.println("Suspenso");
suspensos++;
}
ANIDACIÓN DE SENTENCIAS
Dentro de una sentencia if se puede escribir otra sentencia if. A esto se le
llama anidación y permite crear programas donde se contemplan
escenarios que tengan más de dos posibilidades. La nueva sentencia
puede ir tanto en la parte if como en la parte else o en ambas partes. Las
anidaciones se utilizan mucho. Sólo hay que tener en cuenta que siempre
se debe cerrar primero el último if que se abrió. Es muy importante
también indentar (tabular) el código correctamente para que las
anidaciones sean legibles. El código podría ser:
if(x == 1) {
instrucciones …
if(y > 4) {
instrucciones …
}
} else {
if( x == 2) {
instrucciones …
} else {
if(x == 3) {
instrucciones …
85/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
}
}
}
ENCADENAR SENTENCIAS IF
En un solo if puedes como máximo abarcar dos posibilidades (si la
exprexión es cierta, las sentencias del if y en caso contrario las del else).
Pero si tienes un escenario en el que tu programa debe abarcar 3 ó más
posibilidades excluyentes, debes anidar setencias if hasta abarcar todas las
posibilidades.
Una forma de hacerlo es: en la parte if contemplas una y en el else el resto
de las posibilidades que quedan pendientes de controlar:
if (x == 1) {
instrucciones …
} else {
if( x == 2) {
instrucciones …
} else {
86/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
if(x == 3) {
instrucciones …
}
}
}
Una forma más legible de escribir ese mismo código sería no anidar las
sentencias, si no encadenarlas (que la sentencia del último else sea otro if):
if (x==1) {
instrucciones…
} else if (x==2) {
instrucciones…
} else if (x==3) {
instrucciones…
}
87/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Este enfoque funciona bien incluso si algunos de los valores son iguales.
Nota: observa que en las expresiones lógicas no podemos escribir n1 < n2
and n3 (n1 menor que n2 y n3) porque el operador "menor que" necesita
dos valores a comparar, y el operador "and" necesita dos valores true/false
a mezclar. Pero n3 en este caso es un número entero, no un booleano. En
Java esta expresión da un error sintáctico. En otros lenguajes como C++,
no da error, pero se interpreta distinto a como se debe escribir de forma
correcta: n1 < n2 and n1 < n3.
Hay más enfoques alternativos.
import java.util.Scanner;
88/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
89/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
} // Fin de la clase
Este programa, usa otro algoritmo. Pasamos a una unidad y de esa unidad
convertimos al resto:
/**
* Convierte unidades de longitud: pulgadas, pies, yardas, millas,
* y metros
* El usuario teclea: número unidad
* El programa muestra la equivalencia con el resto de unidades.
*/
package ejer32;
import java.util.Scanner;
public class ConversorLongitud {
public static void main(String[] args) {
Scanner teclado = new Scanner( System.in );
double valor; // cantidad numérica
String unidad; // unidad de medida
double pulgadas, pies, yardas, millas, metros; // valores
boolean correcta= true; // indica si unidad es Ok
System.out.print("Telee (valor unidad): ");
valor = teclado.nextDouble();
90/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
Ejecución en Eclipse:
91/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
case 2: dia="Martes";
break;
case 3: dia="Miércoles";
break;
case 4: dia="Jueves";
break;
case 5: dia="Viernes";
break;
case 6: dia="Sábado";
break;
case 7: dia="Domingo";
break;
default: dia="?";
}
// Equivale con if-else-if a:
EJEMPLO 17: if(diaSemana == 1 ||
diaSemana == 2 ||
switch (diaSemana) { diaSemana == 3 ||
case 1: diaSemana == 4 ||
case 2: diaSemana == 5)
case 3: laborable= true;
case 4: else if(diaSemana == 6 || diaSemana == 7)
case 5: laborable=true; laborable= false;
break;
case 6:
case 7: laborable=false;
}
93/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
System.out.println(" 3. Yardas");
System.out.println(" 4. Millas");
System.out.println(" 5. Metros");
System.out.println();
System.out.println("Escoja la opción (1-5): ");
opcion = teclado.nextInt();
/* Convertir a pulgadas */
switch ( opcion ) {
case 1: System.out.println("Teclee el número de pulgadas: ");
valor = teclado.nextDouble();
pulgadas = valor;
break;
case 2: System.out.println("Teclee el número de pies: ");
valor = teclado.nextDouble();
pulgadas = valor * 12;
break;
case 3: System.out.println("Teclee el número de yardas: ");
valor = teclado.nextDouble();
pulgadas = valor * 36;
break;
case 4: System.out.println("Teclee el número de millas: ");
valor = teclado.nextDouble();
pulgadas = valor * 12 * 5280;
break;
case 5: System.out.println("Teclee el número de metros: ");
valor = teclado.nextDouble();
pulgadas = valor * 39.37;
break;
default: System.out.println("Error! Número de opción incorrecta");
System.exit(1);
} // fin switch
94/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
unidad = teclado.nextln().toLowerCase();
/* Leer valor y convertir */
System.out.print("Teclee el número de " + unidad + ": ");
valor = teclado.nextDouble();
switch ( unidad ) {
case "pulgadas": pulgadas = valor;
break;
case "pies": pulgadas = valor * 12;
break;
case "yardas": pulgadas = valor * 36;
break;
case "millas": pulgadas = valor * 12 * 5280;
break;
case "metros": pulgadas = valor * 39.37;
break;
default: System.out.println("Unidad de medida incorrecta!");
System.exit(1);
} // fin switch
95/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
default.
String computador;
switch ( (int)(3*Math.random()) ) {
case 0: computador = "Piedra";
break;
case 1: computador = "Papel";
break;
case 2: computador = "Tijeras";
break;
default: computador= "Piedra"; // Nunca se ejecuta pero no lo sabe
}
System.out.println("El ordenador saca " + computador); // OK!
2.8. EJERCICIOS.
E1. TEST
1. Explica brevemente la diferencia entre la sintaxis y la semántica de un
lenguaje de programación o piensa en un ejemplo que lo muestre.
2. ¿Qué efectos tiene ejecutar una sentencia de declaración de variables
en el ordenador? Da un ejemplo.
3. ¿Qué es un tipo de dato en un lenguaje de programación?
4. Uno de los tipos primitivos de Java es boolean. ¿Qué es el tipo
boolean? ¿Qué valores usa?
5. Indica para qué se utilizan estos operadores de Java:
a) ++ b) && c) != d) % e) ^ f) new g) >> h) | i) = j) ? k) .
6. Explica los efectos de una sentencia de asignación y pon un ejemplo.
¿Cuántas sentencias de asignación conoces?
7. ¿Qué indica la precedencia de operadores? ¿Cómo se calculan las
expresiones? ¿Cómo se cambia este comportamiento?
8. ¿Qué es un literal en un programa?
9. En Java, las clases tienen dos propósitos fundamentales ¿Cuáles son?
96/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
12. Indica el tipo de dato del valor obtenido al evaluar estas expresiones.
a)1/2 d)0x9F + 0x3D g)(int)(5 + 5.0) j)5>=2 || 1<3
b)6.0 % 9 e)1.0 * 1/1 h)9 + (double)4 k)5 >> 1 | 2
c) 1.5f + 3 f)(int)5.0 + 5.0 i)(double)5+"6" l)9F+3D
97/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
99/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
tira de una carga, el ángulo (en grados) y la distancia (d) recorrida por la
carga en metros, y muestre el trabajo realizado (T) con 6 decimales:
Teclee Fuerza (Newtons): 10.5
Teclee distancia (metros): 2.1
T = F x d x cos(angulo) Teclee ángulo (grados): 45
Trabajo = 15,59170453 julios
100/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
E11. Escribe un programa que pregunte por un DNI (8 dígitos del 0-9) y
saque el mensaje "Correcto" si es correcto o "Incorrecto" si no lo es.
a) Leyendo un valor entero. Piensa en una desventaja.
b) Leyendo una cadena de texto. Sin usar expresiones regulares en
el método matches() de los objetos String, ni sentencias if-else, for,
while, do-while..
c) Leyendo una cadena de texto. Usando una expresión regular en
el método matches() de los objetos String, pero no sentencias de
control: if-else, while...
Teclee DNI (8 dígitos): 12345 Teclee DNI (8 dígitos): 12345ABC
Incorrecto Incorrecto
E12. Lee dos números enteros e imprime el mayor sin usar sentencias de
control.
E13. Lee dos números enteros e imprime si el mayor es el primero, si lo es
el segundo o si son iguales sin usar sentencias de control.
E14. Lee un CIF (8 dígitos y una letra como 12345678A) e indica:
• Si tiene la longitud correcta (9): true/false.
• Si hay 8 dígitos y una letra: true/false.
101/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
102/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
E21. Crea un programa que pida por teclado un número decimal llamado
x e imprima por consola |x| (su valor absoluto, es decir si es menor que
cero imprime -x, y en otro caso x).
a) Usando una sentencia if.
b) Usando el operador ternario.
E22. Crea un programa que pida por teclado el tamaño de un tornillo y
muestre por pantalla el texto correspondiente al tamaño, según la
siguiente tabla:
de 1 cm (incluido) hasta 3 cm (no incluido) → pequeño
de 3 cm (incluido) hasta 5 cm (no incluido) → mediano
de 5 cm (incluido) hasta 6.5 cm (no incluido) → grande
de 6.5 cm (incluido) hasta 8.5 cm (no incluido) → muy grande
E23. Crea un programa que pida una fecha formada por tres valores
enteros (día, mes y año), y determine si la fecha corresponde a un valor
válido. Pista: se debe tener presente el valor de los días en función de los
meses y de los años. Es decir:
– Los meses 1, 3, 5, 7, 8, 10 y 12 tienen 31 días.
– Los meses 4, 6, 9 y 11 tienen 30 días.
– El mes 2 tiene 28 días, excepto cuando el año es bisiesto.
E24. Crea un programa que pida los coeficientes a y b de una ecuación de
primer grado y (ax+b=0) y calcule la solución y la imprima con 4
decimales de precisión. Ten en cuenta que existen tres posibles soluciones:
• Cuando a ≠ 0 existe la solución única x = -b/a.
• Cuando a = 0 y b ≠ 0 no existe solución.
• Cuando a = 0 y b = 0 existen infinitas soluciones.
E25. Crea un programa que lea un valor entero que representa el día de la
semana (1 = lunes, 2 = martes, … 7 = domingo). Haz que si el valor está
entre 1 y 7 escriba por pantalla su nombre o “día incorrecto” en caso de
103/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
104/105
1DAM PROG. UNIDAD 2. Primeros Pasos en Java.
105/105