Capitulo 2. Indtroduccià N A Las Apps Java
Capitulo 2. Indtroduccià N A Las Apps Java
Capitulo 2. Indtroduccià N A Las Apps Java
2
¿Qué hay en un nombre? A eso a lo
qque llamamos rosa, si le diéramos
en Java: entrada/salida
y operadores
Objetivos
En este capítulo aprenderá a:
■ Escribir aplicaciones simples
en Java.
■ Utilizar las instrucciones
de entrada y salida.
■ Familiarizarse con los tipos
primitivos de Java.
■ Comprender los conceptos
básicos de la memoria.
■ Utilizar los operadores
aritméticos.
■ Comprender la precedencia
de los operadores aritméticos.
■ Escribir instrucciones para
tomar decisiones.
■ Utilizar los operadores
relacionales y de igualdad.
Resumen | Ejercicios de autoevaluación | Respuestas a los ejercicios de autoevaluación | Ejercicios | Marcando la diferencia
2.1 Introducción
En este capítulo le presentaremos la programación de aplicaciones en Java. Empezaremos con ejemplos de
programas que muestran (dan salida a) mensajes en la pantalla. Después veremos un programa que obtiene
(da entrada a) dos números de un usuario, calcula la suma y muestra el resultado. Usted aprenderá cómo
ordenar a la computadora que realice cálculos aritméticos y guardar sus resultados para usarlos más adelante.
El último ejemplo demuestra cómo tomar decisiones. La aplicación compara dos números y después
muestra mensajes con los resultados de la comparación. Usará las herramientas de la línea de comandos del
JDK para compilar y ejecutar los programas de este capítulo. Si prefiere usar un entorno de desarrollo in-
tegrado (IDE), también publicamos videos Dive Into® en http://www.deitel.com/books/jhtp10/ para
Eclipse, NetBeans e IntelliJ IDEA.
Fig. 2.1 ! Programa para imprimir texto (parte 2 de 2). Nota: En los códigos se han omitido los acentos para
evitar la incompatibilidad al momento de ejecutarse en distintos entornos.
El programa incluye números de línea, que incluimos para fines académicos; no son parte de un progra-
ma en Java. Este ejemplo ilustra varias características importantes de Java. Pronto veremos que la línea 9
se encarga del verdadero trabajo: mostrar la frase Bienvenido a la programacion en Java! en la pan-
talla.
empieza con //, lo cual indica que es un comentario de fin de línea, el cual termina al final de la línea en
la que aparecen los caracteres //. Un comentario de fin de línea no necesita empezar una línea; también
puede estar en medio de ella y continuar hasta el final (como en las líneas 6, 10 y 11). La línea 2
Estos comentarios comienzan y terminan con los delimitadores /* y */. El compilador ignora todo el
texto entre estos delimitadores. Java incorporó los comentarios tradicionales y los comentarios de fin de
línea de los lenguajes de programación C y C++, respectivamente. Nosotros preferimos usar los comenta-
rios con //.
Java también cuenta con un tercer tipo de comentarios: los comentarios Javadoc, que están delimi-
tados por /** y */. El compilador ignora todo el texto entre los delimitadores. Estos comentarios nos
permiten incrustar la documentación de manera directa en nuestros programas. Dichos comentarios son
el formato preferido en la industria. El programa de utilería javadoc (parte del JDK) lee esos comentarios
y los utiliza para preparar la documentación de su programa, en formato HTML. En el apéndice G en línea,
Creación de documentación con javadoc, demostramos el uso de los comentarios Javadoc y la herramien-
ta javadoc.
comienza una declaración de clasee para la clase Bienvenido1. Todo programa en Java consiste al menos de
una clase que usted (el programador) debe definir. La palabra clave class introduce una declaración
de clase, la cual debe ir seguida de inmediato por el nombre de la clasee (Bienvenido1). Las palabras clave
(también conocidas como palabras reservadas) se reservan para uso exclusivo de Java y siempre se escriben
en minúscula. En el apéndice C se muestra la lista completa de palabras clave de Java.
En los capítulos 2 al 7, todas las clases que definimos comienzan con la palabra clave public. Por
ahora, sólo recuerde que debemos usar public. En el capítulo 8 aprenderá más sobre las clases public y
las que no son public.
nombre de una clase. Java es sensible a mayúsculas y minúsculas; es decir, las letras mayúsculas y minúscu-
las son distintas, por lo que valor y Valor son distintos identificadores (pero ambos son válidos).
Cuerpo de la clase
Una llave izquierdaa (como en la línea 5), {, comienza el cuerpo de todas las declaraciones de clases. Su
correspondiente llave derechaa (en la línea 11), }, debe terminar cada declaración de una clase. Las líneas
6 a 10 tienen sangría.
Declaración de un método
La línea 6
// el método main empieza la ejecución de la aplicación en Java
es un comentario de fin de línea que indica el propósito de las líneas 7 a 10 del programa. La línea 7
public static void main(String[] args)
es el punto de inicio de toda aplicación en Java. Los paréntesis después del identificador main indican que
éste es un bloque de construcción del programa, al cual se le llama método. Las declaraciones de clases en
Java por lo general contienen uno o más métodos. En una aplicación en Java, sólo uno de esos métodos debe
llamarse main y hay que definirlo como se muestra en la línea 7; de no ser así, la Máquina Virtual de Java
(JVM) no ejecutará la aplicación. Los métodos pueden realizar tareas y devolver información una vez que
éstas hayan concluido. En la sección 3.2.5 explicaremos el propósito de la palabra clave static. La pala-
bra clave void indica que este método no devolverá ningún tipo de información. Más adelante veremos
cómo puede un método devolver información. Por ahora, sólo copie la primera línea de main en sus apli-
caciones en Java. En la línea 7, las palabras String[] args entre paréntesis son una parte requerida de la
declaración del método main; hablaremos sobre esto en el capítulo 7.
La llave izquierda en la línea 8 comienza el cuerpo de la declaración del método. Su correspondien-
te llave derecha debe terminarlo (línea 10). La línea 9 en el cuerpo del método tiene sangría entre las llaves.
indica a la computadora que realice una acción; es decir, que imprima los caracteres contenidos entre los
signos de comillas dobles (las comillas dobles no se muestran en la salida). En conjunto, las comillas dobles
y los caracteres entre ellas son una cadena, lo que también se conoce como cadena de caracteres o literal
de cadena. El compilador no ignora los caracteres de espacio en blanco dentro de las cadenas. Éstas no
pueden abarcar varias líneas de código.
System.out (que usted predefinió) se conoce como el objeto de salida estándar. Permite a una apli-
caci de Java mostrar información en la ventana de comandos desde la cual se ejecuta. En versiones
recientes de Microsoft Windows, la ventana de comandos es el Símbolo del sistema. En UNIX/Linux/
Mac OS X, la ventana de comandos se llama ventana de terminal o shell. Muchos programadores se re-
fieren a la ventana de comandos simplemente como la línea de comandos.
El método System.out.println muestra (o imprime) una línea de texto en la ventana de comandos.
La cadena dentro de los paréntesis en la línea 9 es el argumento para el método. Cuando el método System.
out.println completa su tarea, coloca el cursor de salida (la ubicación donde se mostrará el siguiente ca-
rácter) al principio de la siguiente línea de la ventana de comandos. Esto es similar a lo que ocurre cuando
un usuario oprime la tecla Intro, al escribir en un editor de texto: el cursor aparece al principio de la siguien-
te línea en el documento.
Toda la línea 9, incluyendo System.out.println, el argumento “Bienvenido a la programacion
en Java!” entre paréntesis y el punto y coma a (;), se conoce como una instrucción. Por lo general, un
método contiene una o más instrucciones que realizan su tarea. La mayoría de las instrucciones terminan
con punto y coma. Cuando se ejecuta la instrucción de la línea 9, muestra el mensaje Bienvenido a la
programacion en Java! en la ventana de comandos.
Al aprender a programar, algunas veces es conveniente “descomponer” un programa funcional, para
que de esta manera pueda familiarizarse con los mensajes de error de sintaxis del compilador. Estos men-
sajes no siempre indican el problema exacto en el código. Cuando se encuentre con un mensaje de error,
éste le dará una idea de qué fue lo que ocasionó el error [intente quitando un punto y coma o una llave en
el programa de la figura 2.1, y vuelva a compilarlo para que pueda ver los mensajes de error que se generan
debido a esta omisión].
Uso de los comentarios de fin de línea en las llaves derechas para mejorar la legibilidad
Como ayuda para los principiantes en la programación, incluimos un comentario de fin de línea después
de una llave derecha de cierre que termina la declaración de un método y después de una llave de cierre que
termina la declaración de una clase. Por ejemplo, la línea 10
indica la llave de cierre de la clase Bienvenido1. Cada comentario indica el método o la clase que termina
con esa llave derecha. Después de este capítulo omitiremos estos comentarios finales.
http://www.deitel.com/books/jhtp10
Para compilar el programa, abra una ventana de comandos y cambie al directorio en donde está guar-
dado el programa. La mayoría de los sistemas operativos utilizan el comando cd para cambiar directorios.
Por ejemplo, en Windows el comando
cd c:\ejemplos\cap02\fig02_01
cd ~/ejemplos/cap02/fig02_01
javac Bienvenido1.java
Si el programa no contiene errores de compilación, este comando crea un nuevo archivo llamado Bienve-
nido1.class (conocido como el archivo de clase para Bienvenido1), el cual contiene los códigos de bytes
de Java, independientes de la plataforma, que representan nuestra aplicación. Cuando utilicemos el co-
mando java para ejecutar la aplicación en una plataforma específica, la JVM traducirá estos códigos de
bytes en instrucciones que el sistema operativo y el hardware subyacentes puedan comprender.
Cada mensaje de error de sintaxis contiene el nombre de archivo y el número de línea en donde ocurrió
el error. Por ejemplo, Bienvenido1.java:6 indica que ocurrió un error en la línea 6 del archivo Bienve-
nido1.java. El resto del mensaje proporciona información acerca del error de sintaxis.
java Bienvenido1
y oprima Intro. Este comando inicia la JVM, la cual carga el archivo Bienvenido1.class. El comando
omite la extensión .class del nombre de archivo; de lo contrario, la JVM no ejecutará el programa. La JVM
llama al método main de Bienvenido1. A continuación, la instrucción de la línea 9 de main muestra
“Bienvenido a la programacion en Java!”. La figura 2.2 muestra el programa ejecutándose en una
ventana de Símbolo del sistema de Microsoft Windows [nota: muchos entornos muestran los símbolos
del sistema con fondos negros y texto blanco. En nuestro entorno ajustamos esta configuración para que
nuestras capturas de pantalla fueran más legibles].
es un comentario de fin de línea que describe el propósito de este programa. La línea 4 comienza la decla-
ración de la clase Bienvenido2. Las líneas 9 y 10 del método main
System.out.print(“Bienvenido a ”);
System.out.println(“la programacion en Java!”);
muestran una línea de texto. La primera instrucción utiliza el método print de System.out para mostrar una
cadena. Cada instrucción print o println continúa mostrando caracteres a partir de donde la última ins-
trucción print o println dejó de mostrarlos. A diferencia de println, después de mostrar su argumento,
print no o posiciona el cursor de salida al inicio de la siguiente línea en la ventana de comandos; el siguiente
carácter que muestra el programa aparecerá justo después del último carácter que muestre print. Por lo tanto,
la línea 10 coloca el primer carácter de su argumento (la letra “l”) inmediatamente después del último carác-
ter que muestra la línea 9 (el carácter de espacioo antes del carácter de comilla doble de cierre de la cadena).
Fig. 2.4 ! Imprimir varias líneas de texto con una sola instrucción (parte 1 de 2).
Bienvenido
a
la programacion
en Java!
Fig. 2.4 ! Imprimir varias líneas de texto con una sola instrucción (parte 2 de 2).
La línea 9
muestra cuatro líneas de texto en la ventana de comandos. Por lo general, los caracteres en una cadena
se muestran justo como aparecen en las comillas dobles. Sin embargo, observe que los dos caracteres \ y
n (que se repiten tres veces en la instrucción) no aparecen en la pantalla. La barra diagonal inversa
a ( \)
se conoce como carácter de escape, el cual tiene un significado especial para los métodos print y
println de System.out. Cuando aparece una barra diagonal inversa en una cadena de caracteres, Java
la combina con el siguiente carácter para formar una secuencia de escape. La secuencia de escape \n
representa el carácter de nueva línea. Cuando aparece un carácter de nueva línea en una cadena que se
va a imprimir con System.out, el carácter de nueva línea hace que el cursor de salida de la pantalla
se desplace al inicio de la siguiente línea en la ventana de comandos.
En la figura 2.5 se listan varias secuencias de escape comunes, con descripciones de cómo afectan la
manera de mostrar caracteres en la ventana de comandos. Para obtener una lista completa de secuencias de
escape, visite
http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.6.
Secuencia
de escape Descripción
\n Nueva línea. Coloca el cursor de la pantalla al inicio de la siguientee línea.
\t Tabulador horizontal. Desplaza el cursor de la pantalla hasta la siguiente posición
de tabulación.
\r Retorno de carro. Coloca el cursor de la pantalla al inicio de la línea actual;l no avanza a la
siguiente línea. Cualquier carácter que se imprima después del retorno de carro sobrescribe
los caracteres previamente impresos en esa línea.
\\ Barra diagonal inversa. Se usa para imprimir un carácter de barra diagonal inversa.
\” Doble comilla. Se usa para imprimir un carácter de doble comilla. Por ejemplo,
System.out.println(“\”entre comillas\””);
muestra “entre comillas”.
Bienvenido a
la programacion en Java!
Las líneas 9 y 10
System.out.printf(“%s%n%s%n”,
“Bienvenido a”, “la programacion en Java!”);
llaman al método System.out.println para mostrar la salida del programa. La llamada al método especi-
fica tres argumentos. Cuando un método requiere varios argumentos, éstos se colocan en una lista sepa-
rada por comas. Al proceso de llamar a un método también se le conoce como invocarr un método.
Las líneas 9 y 10 representan sólo una instrucción. Java permite dividir instrucciones extensas en varias
líneas. Aplicamos sangría a la línea 10 para indicar que es la continuación de la línea 9.
El primer argumento del método printf es una cadena de formato que puede consistir en texto fijo
y especificadores de formato. El método printf imprime el texto fijo de igual forma que print o println.
Cada especificador de formato es un receptáculo para un valor y especifica el tipo de datoss a desplegar. Los
especificadores de formato también pueden incluir información de formato opcional.
Los especificadores de formato empiezan con un signo porcentual (%) y van seguidos de un carácter
que representa el tipo de datos. Por ejemplo, el especificador de formato %s es un receptáculo para una ca-
dena. La cadena de formato en la línea 9 especifica que printf debe desplegar dos cadenas, y que a cada
cadena le debe seguir un carácter de nueva línea. En la posición del primer especificador de formato, printf
sustituye el valor del primer argumento después de la cadena de formato. En cada posición posterior del
especificador de formato, printf sustituye el valor del siguiente argumento. Así, este ejemplo sustituye
“Bienvenido a” por el primer %s y “la programacion en Java!” por el segundo %s. La salida muestra que
se despliegan dos líneas de texto en pantalla.
Cabe mencionar que, en vez de usar la secuencia de escape \n, usamos el especificador de formato %n,
el cual es un separador de línea portable entre distintos sistemas operativos. No puede usar %n en el argu-
mento para System.out.print o System.out.println; sin embargo, el separador de línea que produce
System.out.println después de mostrar su argumento, es portable entre distintos sistemas operativos. El
apéndice I en línea presenta más detalles sobre cómo dar formato a la salida con printf.
es una declaración import que ayuda al compilador a localizar una clase que se utiliza en este programa.
Indica que este ejemplo utiliza la clase Scanner predefinida de Java (que veremos en breve) del paquete
java.util. Así, el compilador se asegura de que utilice la clase en forma correcta.
empieza la declaración de la clase Suma. El nombre de archivo para esta clase public debe ser Suma.java.
Recuerde que el cuerpo de cada declaración de clase empieza con una llave izquierda de apertura (línea 6)
y termina con una llave derecha de cierre (línea 27).
La aplicación empieza a ejecutarse con el método main (líneas 8 a la 26). La llave izquierda (línea 9)
marca el inicio del cuerpo de main, y la correspondiente llave derecha (línea 26) marca su final. Al método
main se le aplica un nivel de sangría en el cuerpo de la clase Suma, y al código en el cuerpo de main se le
aplica otro nivel para mejorar la legibilidad.
nombre de una variable puede ser cualquier identificador válido; de nuevo, una serie de caracteres com-
puestos por letras, dígitos, guiones bajos (_) y signos de moneda ($) que no comiencen con un dígito y no
contengan espacios. El tipo de una variable especifica el tipo de información que se guarda en esa ubicación
de memoria. Al igual que las demás instrucciones, las instrucciones de declaración terminan con punto y
coma (;).
La línea 11
es una instrucción de declaración de variable que especifica el nombree (entrada) y tipo (Scanner) de una
variable que se utiliza en este programa. Un objeto Scanner permite a un programa leer datos (por ejemplo:
números y cadenas) para usarlos en un programa. Los datos pueden provenir de muchas fuentes, como un
archivo en disco o desde el teclado de un usuario. Antes de usar un objeto Scanner, hay que crearlo y espe-
cificar el origen de los datos.
El signo = en la línea 11 indica que es necesario inicializarr la variable entrada tipo Scanner (es decir,
hay que prepararla para usarla en el programa) en su declaración con el resultado de la expresión a la dere-
cha del signo igual: new Scanner(System.in). Esta expresión usa la palabra clave new para crear un objeto
Scanner que lee los datos escritos por el usuario mediante el teclado. El objeto de entrada estándar, Sys-
tem.in, permite a las aplicaciones leer los bytes de datos escritos por el usuario. El objeto Scanner traduce
estos bytes en tipos (como int) que se pueden usar en un programa.
declaran que las variables numero1, numero2 y suma contienen datos de tipo int; estas variables pueden
contener valores enteross (números completos, como 72, -1127 y 0). Estas variables no se han inicializado
todavía. El rango de valores para un int es de -2,147,483,648 a +2,147,483,647 [nota: los valores int que
use en un programa tal vez no contengan comas].
Hay otros tipos de datos como float y double, para guardar números reales, y el tipo char, para
guardar datos de caracteres. Los números reales son números que contienen puntos decimales, como 3.4,
0.0 y -11.19. Las variables de tipo char representan caracteres individuales, como una letra en mayúscula
(Vg. A), un dígito (Vg. 7), un carácter especial (Vg. * o %) o una secuencia de escape (como el carácter de ta-
bulación, \t). Los tipos tales como int, float, double y char se conocen como tipos primitivos. Los
nombres de los tipos primitivos son palabras clave y deben aparecer completamente en minúsculas.
El apéndice D sintetiza las características de los ocho tipos primitivos (boolean, byte, char, short, int,
long, float y double).
Es posible declarar varias variables del mismo tipo en una sola declaración, separando con comas los
nombres de las variables (es decir, una lista de nombres de variables separados por comas). Por ejemplo, las
líneas 13 a la 15 se pueden escribir también así:
int numero1, // primer número a sumar
numero2, // segundo número a sumar
suma; // suma de numero1 y numero2
utiliza System.out.print para mostrar el mensaje “Escriba el primer entero: ”. Este mensaje se cono-
ce como indicador, ya que indica al usuario que debe realizar una acción específica. En este ejemplo utili-
zamos el método print en vez de println para que la entrada del usuario aparezca en la misma línea que
la del indicador. En la sección 2.2 vimos que, por lo general, los identificadores que empiezan con letras
mayúsculas representan nombres de clases. La clase System forma parte del paquete java.lang. Cabe
mencionar que la clase System no se importa con una declaración import al principio del programa.
utiliza el método nextInt del objeto entrada de la clase Scanner para obtener un entero del usuario me-
diante el teclado. En este punto, el programa esperaa a que el usuario escriba el número y oprima Intro para
enviar el número al programa.
Nuestro programa asume que el usuario escribirá un valor de entero válido. De no ser así, se produci-
rá un error lógico en tiempo de ejecución y el programa terminará. El capítulo 11, Manejo de excepciones:
un análisis más detallado, habla sobre cómo hacer sus programas más robustos al permitirles manejar di-
chos errores. Esto también se conoce como hacer que su programa sea tolerante a fallas.
En la línea 18, colocamos el resultado de la llamada al método nextInt (un valor int) en la variable
numero1 mediante el uso del operador de asignación, =. La instrucción se lee como “numero1 obtienee el
valor de entrada.nextInt()”. Al operador = se le llama operador binario, ya que tiene dos operandos:
numero1 y el resultado de la llamada al método entrada.nextInt(). Esta instrucción se llama instrucción
de asignación, ya que asignaa un valor a una variable. Todo lo que está a la derechaa del operador de asignación
(=) se evalúa siempre antess de realizar la asignación.
suma = numero1 + numero2; // suma los números, después almacena el total en suma
es una instrucción de asignación que calcula la suma de las variables numero1 y numero2, y asigna el resul-
tado a la variable suma mediante el uso del operador de asignación, =. La instrucción se lee como “suma
obtienee el valor de numero1 + numero2”. Cuando el programa encuentra la operación de suma, utiliza los
valores almacenados en las variables numero1 y numero2 para realizar el cálculo. En la instrucción anterior,
el operador de suma es un operador binario; sus doss operandos son las variables numero1 y numero2. Las
partes de las instrucciones que contienen cálculos se llaman expresiones. De hecho, una expresión es cual-
quier parte de una instrucción que tiene un valorr asociado. Por ejemplo, el valor de la expresión numero1
+ numero2 es la suma de los números. De manera similar, el valor de la expresión entrada.nextInt() es el
entero escrito por el usuario.
Los paréntesis alrededor de la expresión numero1 + numero2 son opcionales; se incluyen para enfatizar que
el valor de toda la expresión se imprime en la posición del especificador de formato %d. Se dice que dichos
paréntesis son redundantes.
http://docs.oracle.com/javase/7/docs/api/index.html
También puede descargar esta documentación de la sección Additional Resources (Recursos adicionales) en
http://www.oracle.com/technetwork/java/javase/downloads/index.html
el número escrito por el usuario se coloca en una ubicación de memoria que corresponde al nombre nume-
ro1. Suponga que el usuario escribe 45. La computadora coloca ese valor entero en la ubicación numero1
(figura 2.8) y sustituye al valor anterior en esa ubicación (si había uno). El valor anterior se pierde, por lo
que se dice que este proceso es destructivo.
numero1 45
Fig. 2.8 ! Ubicación de memoria que muestra el nombre y el valor de la variable numero1.
suponga que el usuario escribe 72. La computadora coloca ese valor entero en la ubicación numero2. La
memoria ahora aparece como se muestra en la figura 2.9.
numero1 45
numero2 72
Fig. 2.9 ! Ubicaciones de memoria, después de almacenar valores para numero1 y numero2.
Una vez que el programa de la figura 2.7 obtiene valores para numero1 y numero2, los suma y coloca el
total en la variable suma. La instrucción (línea 23)
suma = numero1 + numero2; // suma los números, después almacena el total en suma
realiza la suma y después sustituye el valor anterior de suma. Una vez que se calcula suma, la memoria
aparece como se muestra en la figura 2.10. Los valores de numero1 y numero2 aparecen exactamente
como antes de usarlos en el cálculo de suma. Estos valores se utilizaron, pero no se destruyeron, cuando
la computadora realizó el cálculo. Por ende, cuando se lee un valor de una ubicación de memoria, el
proceso es no destructivo.
numero1
numero2 72
suma 117
2.7 Aritmética
La mayoría de los programas realizan cálculos aritméticos. Los operadores aritméticos se sintetizan en la
figura 2.11. Observe el uso de varios símbolos especiales que no se utilizan en álgebra. El asterisco (*) in-
dica la multiplicación, y el signo de porcentaje (%) es el operador residuo, el cual describiremos en breve.
Los operadores aritméticos en la figura 2.11 son operadores binarios, ya que funcionan con doss operandos.
Por ejemplo, la expresión f + 7 contiene el operador binario + junto con los dos operandos f y 7.
Suma + f+7 f + 7
Resta – p–c p - c
Multiplicación * bm b * m
División / x /y o x o x ÷ y x / y
y
Residuo % r mod s r % s
La división de enteros produce un cociente entero. Por ejemplo, la expresión 7 / 4 da como resulta-
do 1, y la expresión 17 / 5 da como resultado 3. Cualquier parte fraccionaria en una división de enteros
simplemente se descartaa (es decir, se trunca); no ocurre un redondeo. Java proporciona el operador residuo, %,
el cual produce el residuo después de la división. La expresión x % y produce el residuo después de que
x se divide entre y. Por lo tanto, 7 % 4 produce 3, y 17 % 5 produce 2. Este operador se utiliza más común-
mente con operandos enteros, pero también puede usarse con otros tipos aritméticos. En los ejercicios de
este capítulo y de capítulos posteriores, consideramos muchas aplicaciones interesantes del operador resi-
duo, como la de determinar si un número es múltiplo de otro.
a
b
a * (b + c)
((a + b) * c)
Estas reglas permiten a Java aplicar los operadores en el orden correcto.1 Cuando decimos que los ope-
radores se aplican de izquierda a derecha, nos referimos a su asociatividad. Algunos operadores se asocian
de derecha a izquierda. La figura 2.12 sintetiza estas reglas de precedencia de operadores. En el apéndice A
se incluye una tabla de precedencias completa.
1 Utilizamos ejemplos simples para explicar el orden de evaluación de las expresiones. Existen situaciones sutiles que se
presentan en las expresiones más complejas que veremos más adelante en el libro. Para obtener más información sobre
el orden de evaluación, vea el capítulo 15 de The Java aTM Language Specification (http://docs.oracle.com/
javase/specs/jls/se7/html/index.html).
a+ b+ c+ d+ e
Álgebra: m =
5
Java: m = (a + b + c + d + e) / 5;
Los paréntesis son obligatorios, ya que la división tiene una mayor precedencia que la suma. La cantidad
completa (a + b + c + d + e) va a dividirse entre 5. Si por error se omiten los paréntesis, obtenemos
a + b + c + d + e / 5, lo cual da como resultado
e
a + b + c + d + 5
Álgebra: y = mxx + b
Java: y = m * x + b;
6 1 2 4 3 5
Los números dentro de los círculos bajo la instrucción indican el orden en el que Java aplica los operadores.
Las operaciones *, % y / se evalúan primero, en orden de izquierda a derechaa (es decir, se asocian de izquierda
a derecha), ya que tienen mayor precedencia que + y -. Las operaciones + y - se evalúan a continuación.
Estas operaciones también se aplican de izquierda a derecha. El operador de asignación (=) se evalúa al último.
y = a * x * x + b * x + c;
6 1 2 4 3 5
Las operaciones de multiplicación se evalúan primero en orden de izquierda a derecha (es decir, se asocian
de izquierda a derecha), ya que tienen mayor precedencia que la suma (como Java no tiene operador arit-
mético para los exponentes, x2 se representa como x * x. La sección 5.4 muestra una alternativa para los
exponentes). A continuación, se evalúan las operaciones de suma, de izquierda a derecha. Suponga que a,
b, c y x se inicializan (reciben valores) como sigue: a = 2, b = 3, c = 7 y x = 5. La figura 2.13 muestra el
orden en el que se aplican los operadores.
Podemos usar paréntesis redundantes (paréntesis innecesarios) para hacer que una expresión sea más clara.
Por ejemplo, la instrucción de asignación anterior podría colocarse entre paréntesis, de la siguiente manera:
y = (a * x * x) + (b * x) + c;
Operador de
Operador estándar igualdad o Ejemplo
algebraico de igualdad relacional de condición Significado de la
o relacional de Java en Java condición en Java
= == x == y x es igual que y
≠ != x != y x no es igual que y
Operador de
Operador estándar igualdad o Ejemplo
algebraico de igualdad relacional de condición Significado de la
o relacional de Java en Java condición en Java
Operadores relacionales
> > x > y x es mayor que y
< < x < y x es menor que y
≥ >= x >= y x es mayor o igual que y
≤ <= x <= y x es menor o igual que y
Fig. 2.15 ! Comparación de enteros mediante instrucciones if, operadores de igualdad y relacionales
(parte 1 de 2).
31
32 if (numero1 > numero2)
33 System.out.printf(“%d > %d%n”, numero1, numero2);
34
35 if (numero1 <= numero2)
36 System.out.printf(“%d <= %d%n”, numero1, numero2);
37
38 if (numero1 >= numero2)
39 System.out.printf(“%d >= %d%n”, numero1, numero2);
40 } // fin del método main
41 } // fin de la clase Comparacion
Fig. 2.15 ! Comparación de enteros mediante instrucciones if, operadores de igualdad y relacionales
(parte 2 de 2).
El método main de la clase (líneas 9 a 40) empieza la ejecución del programa. La línea 12
declara la variable entrada de la clase Scanner y le asigna un objeto Scanner que recibe datos de la entradaa
estándar (es decir, del teclado).
Las líneas 14 y 15
declaran las variables int que se utilizan para almacenar los valores introducidos por el usuario.
Las líneas 17-18
piden al usuario que introduzca el primer entero y el valor, respectivamente. El valor de entrada se almace-
na en la variable numero1.
Las líneas 20-21
System.out.print(“Escriba el segundo entero: ”); // indicador
numero2 = entrada.nextInt(); // lee el segundo número del usuario
piden al usuario que introduzca el segundo entero y el valor, respectivamente. El valor de entrada se alma-
cena en la variable numero2.
Las líneas 23-24
if (numero1 == numero2)
System.out.printf(“%d == %d%n”, numero1, numero2);
comparaa los valores de las variables numero1 y numero2, para determinar si son iguales o no. Una instrucción
if siempre empieza con la palabra clave if, seguida de una condición entre paréntesis. Una instrucción if
espera una instrucción en su cuerpo, pero puede contener varias instrucciones si se encierran entre un
conjunto de llaves ({}). La sangría de la instrucción del cuerpo que se muestra aquí no es obligatoria, pero
mejora la legibilidad del programa al enfatizar que la instrucción en la línea 24 forma parte dee la instrucción if
que empieza en la línea 23. La línea 24 sólo se ejecuta si los números almacenados en las variables numero1
y numero2 son iguales (es decir, si la condición es verdadera). Las instrucciones if en las líneas 26-27, 29-
30, 32-33, 35-36 y 38-39 comparan a numero1 y numero2 usando los operadores !=, <, >, <= y >=, respec-
tivamente. Si la condición en una o más de las instrucciones if es verdadera, se ejecuta la instrucción del
cuerpo correspondiente.
No hay punto y coma (;) al final de la primera línea de cada instrucción if. Dicho punto y coma
produciría un error lógico en tiempo de ejecución. Por ejemplo,
if (numero1 == numero2)
; // instrucción vacía
System.out.printf(“%d == %d%n”, numero1, numero2);
donde el punto y coma que aparece por sí solo en una línea (que se conoce como instrucción vacía) a es la
instrucción que se va a ejecutar si la condición en la instrucción if es verdadera. Al ejecutarse la instrucción
vacía, no se lleva a cabo ninguna tarea. Después el programa continúa con la instrucción de salida, que
siempree se ejecutaría, sin importarr que la condición sea verdadera o falsa, ya que la instrucción de salida no
forma parte de la instrucción if.
Espacio en blanco
Observe el uso del espacio en blanco en la figura 2.15. Recuerde que el compilador casi siempre ignora los
caracteres de espacio en blanco. Por lo tanto, las instrucciones pueden dividirse en varias líneas y pueden
espaciarse de acuerdo con las preferencias del programador, sin afectar el significado de un programa. Es
incorrecto dividir identificadores y cadenas. Idealmente las instrucciones deben mantenerse lo más redu-
cidas que sea posible, pero no siempre se puede hacer esto.
2.9 Conclusión
En este capítulo aprendió sobre muchas características importantes de Java, como mostrar datos en la
pantalla en un Símbolo del sistema, introducir datos mediante el teclado, realizar cálculos y tomar de-
cisiones. Mediante las aplicaciones que vimos en este capítulo, le presentamos muchos conceptos básicos
de programación. Como veremos en el capítulo 3, por lo general las aplicaciones de Java contienen sólo
unas cuantas líneas de código en el método main, ya que casi siempre estas instrucciones crean los objetos
que realizan el trabajo de la aplicación. En el capítulo 3 aprenderá a implementar sus propias clases y a usar
objetos de esas clases en las aplicaciones.