Вы находитесь на странице: 1из 14

Mxico Distrito Federal a 08 de Marzo de 2014 Autor: Pablo Galeana Bailey Cualquier duda y/o comentario quedo a sus

rdenes para alguna asesora o recomendacin para mejorar el presente material. Email: knoppixpgb@gmail.com

Captulo 4 - Operadores 1. Objetivo de Certificacin 7.6 - Operadores Java Escribir cdigo que aplique correctamente los operadores incluyendo los de asignacin (limitados a: =, += y -=), aritmticos (limitados a: +, -, *, /, %, ++ y --), relacionales (limitados a: <, <=, >, >=, == y !=), el operador instanceof, operadores lgicos (limitados a: &, |, ^, !, && y ||) y el operador condicional (? :) para producir el resultado deseado. Escribe cdigo que determina la igualdad de dos objetos o dos tipos primitivos. Los operadores Java producen nuevos valores a partir de uno o ms operandos. El resultado suele ser un booleano o un valor numrico. Existen unos cuantos operadores que viene sobrecargados:

El operador + puede usarse para sumar dos nmeros primitivos o para realizar una concatenacin si los operandos son String. Los operadores &, | y ^ pueden usarse de dos formas, aunque para el examen, las capacidades de manejo de bits no se probarn.

Los Operadores suele ser la seccin del examen donde los candidatos obtienen sus peores resultados. Adems, los operadores y las asignaciones son parte de muchas preguntas en otros temas. 1.1. Operadores de Asignacin Para resumir: Cuando asignamos un valor a un primitivo, el tamao es importante. Debemos asegurarnos de cuando ocurre un carting implcito, cuando es necesario uno explcito y cuando podra ocurrir un truncamiento. Recuerda que una variable de referencia no es un objeto sino una forma de obtener un objeto. Cuando asignamos el valor a una variable de referencia, el tipo es importante. Recuerda las reglas para los supertipos, subtipos y arrays. Operadores de Asignacin Compuestos Existen 11 o ms operadores de asignacin compuestos, pero slo los cuatro ms usados (+=, -=, *=, and /=) los veremos en el examen. Ejemplos:

Las dos ltimas asignaciones dan el mismo resultado que las primeras. 1.2. Operadores Relacionales El examen cubre seis operaciones relacionales (<, <= , >, >=, == , and !=). Estos operadores siempre dan como resultado un valor booleano. Este valor suele usarse en una sentencia 'if', tal y como se muestra a continuacin:

Pero el valor resultante puede asignarse directamente a un tipo primitivo booleano:

Algunas comparaciones legales:

En el cdigo anterior, estamos usando una comparacin entre caracteres. Es tambin legal comparar un carcter con cualquier nmero (aunque no sea una buena prctica). Si ejecutamos el cdigo anterior obtendremos la siguiente salida: The animal is a gray elephant Operadores de "Igualdad" Java tambin tiene dos operaciones relacionales que comparan dos "cosas" similares y devuelven un booleano que dice si dos cosas son iguales. Los operadores son: == Igual a != Distinto de Cada comparacin individual puede involucrar dos nmeros (incluyendo 'char'), dos valores booleanos o dos referencias a objetos. No podemos comparar tipos incompatibles. Existen cuatro tipos diferentes de cosas que podemos probar: Nmeros Caracteres Booleanos Variables de Referencia a Objetos

Igualdad para Primitivos El siguiente cdigo muestra algunos tests de igualdad sobre variables de primitivos:

El programa produce la siguiente salida: character 'a' == 'a'? true character 'a' == 'b'? false 5 != 6? true 5.0 == 5L? true true == false? false Normalmente si se compara un nmero punto flotante con un entero y los valores son iguales, el operador == devuelve true. Igualdad para Variables de Referencia Dos variables de referencia pueden apuntar al mismo objeto, como muestra el siguiente cdigo:

Despus de ejecutar este cdigo, la variable 'a' y la variable 'b' apuntarn al mismo objeto. Podemos comprobar si dos variables apuntan al mismo objeto mediante el operador ==. Sin embargo, este operador comprueba los bits en la variable, por lo que si ambas variables son iguales, es que apuntan al mismo objeto. Veamos el siguiente cdigo:

El cdigo crea tres variables de referencia. Las dos primeras, 'a' y 'b', son objetos JButton con la misma etiqueta. El tercero, 'c', se ha inicializado con el mismo objeto al que apunta 'a'. Cuando se ejecuta el programa produce la siguiente salida: Is reference a == b? false Is reference a == c? true Esto nos muestra que 'a' y 'c' apuntan a la misma instancia y que el operador == no comprueban si dos objetos son "equivalentes. Igualdad para Enumerados Una vez que hemos declarado un 'enum', no es ampliable. En tiempo de ejecucin no hay forma de crear constantes enum adicionales. Por supuesto podemos tener todas las variables que queramos para referirnos a una constante 'enum', por lo que es importante tener la posibilidad de comparar dos variables de referencia de enum para ver si son iguales. Podemos usar tanto el operador == como el mtodo equals() para determinar si dos variables estn apuntando a la misma constante enum:

El cdigo anterior produce la siguiente salida: == dot equals 1.3. Comparacin instanceof El operador instanceof se usa slo para variables de referencia a objetos y podemos usarlo para comprobar si un objeto es de un tipo particular. Por tipo, nos referimos a clase o interfaz -en otras palabras, si el objeto referenciado a la izquierda del operador para la prueba IS-A para la clase o interfaz situada en el lado derecho. Ejemplo :

Imprime:

"s

is

string"

Aun cuando el objeto que estamos comprobando no es una instanciacin actual

del tipo de clase en el lado derecho del operador, instanceof seguir devolviendo 'true' si el objeto que est siendo comparado es compatible con el tipo de la derecha. El siguiente ejemplo demuestra un uso comn para instanceof: probar un objeto para ver si es una instancia de alguno de los subtipos antes de intentar un downcast:

El cdigo anterior compila y produce la siguiente salida: 'a' refers to a B En ejemplos como este, el uso del operador instanceof protege el programa de intentos ilegales de downcast. Podemos probar una referencia de objeto contra su propio tipo de clase o cualquiera de sus superclases. Esto significa que cualquier referencia a objeto evaluar a true si usamos el operador instanceof con el tipo Object, tal y como se muestra a continuacin:

Que imprime: "b is definitely an Object" Adems, es legal probar si la referencia 'null' es una instancia de una clase. Esto siempre devuelve 'false', por supuesto. Por ejemplo:

Imprime: Error

de

false Compilacin

de

false instanceof

No podemos usar el operador instanceof para probar dos jerarquas de clases diferentes. Por ejemplo, el siguiente cdifo NO compilar:

La compilacin falla, no hay forma de que 'd' podra hacer referencia a Cat o un subtipo de Cat. Dado lo siguiente:

La siguiente tabla resume el uso del operador instanceof Primer Operando(la referencia Segundo Operando (tipo con el Resultado que se est evaluando) que estamos comparando) null Any class or interface type false Foo instance Foo, Bar, Face, Object true Bar instance Bar, Face, Object true Bar instance Foo false Foo[] Foo, Bar, Face false Foo[] Object true Foo[1] Foo, Bar, Face, Object true 1.4. Operadores Aritmticos Estos operadores pueden usarse de forma estndar:

Operador Resto (%) El operador resto divide el operando izquierdo entre el derecho y coge el resto. Veamos un cdigo de ejemplo:

Si ejecutamos la clase MathTest el resultado es el siguiente: The result of 15 % 4 is the remainder of 15 divided by 4. The remainder is 3 Importante: Las expresiones son evaluadas de izquierda a derecha por defecto. Podemos cambiar esta secuencia o precedencia aadiendo parntesis. Tambin hay que destacar que los operadores *, / y % tienen ms prioridad que + y -. Operador de Concatenacin de String El signo ms (+) tambin puede usarse para concatenar dos cadenas, tal y como se muestra a continuacin:

La concatenacin de String toma inters cuando combinamos nmeros con cadenas:

Los valores enteros son tratados como caracteres y unidos a la derecha de la cadena dando el segundo resultado: "String37". El cdigo anterior podra leerse: "Empieza con una cadena a y le aadimos el caracter 3 (el valor de b) para producir String3, lueego aade el caracter 7 (valor de c) para producir String37." Podemos cambiar este comportamiento mediante parntesis:

Y obtendremos: "Stringl0". Al usar parntesis haremos que se evale primero (b + c) y el operador + actuar como operador de asignacin puesto que ambos operandos son valores enteros. El punto clave es que el operando de la izquierda del operador no es una cadena (String). Si lo fuera, el operador + actuara como concatenacin de String. La regla a recordar es: "Si algunos de los operandos es un String, el operador + se convierte en un operador de concatenacin de cadenas. Si ambos operandos son nmeros,

el

operador

acta

como

operador

suma."

En el examen no ser siempre tan obvio. Veamos el siguiente cdigo:

No podemos saber cmo se utilizar el operador + hasta que sepamos qu devuelve el mtodo foo(). Si devuelve un String, entonces concatenar 7 a la cadena devuelta. Pero si devuelve un nmero, entonces el operador se usar para sumar 7 al nmero devuelto. Por ltimo, necesitamos saber que es legal mezclar el operador de adicin compuesto (+=) y los Strings, como se muestra a continuacin:

Puesto que las dos veces que se ha usado el operador += el operando de la izquierda era un String, ambas operaciones fueron concatenaciones, resultando en: 1234567 Operadores de Incremento y Decremento El operador se coloca antes (prefijo) o despus (sufijo) de una variable para cambiar su valor. Si el operador se coloca antes o despus del operando, puede cambiar el resultado de una expresin. Veamos lo siguiente:

La ejecucin de este programa genera la siguiente salida: %java MathTest players online: 0 The value of players is 1 The value of players is now 2 Observa que cuando la variable es impresa, el primer valor es 0. Esto es porque hemos usado el post-incremento, que slo ocurre hasta que la variable se usa en la sentencia 'print'. La lnea 5 no incrementa la variable, simplemente imprime el valor que hemos incrementado antes. La lnea 6 aplica el pre-incremento, lo que indica que el incremento se realice antes de que se use la variable, por lo que la salida es 2.

En el examen veremos preguntas mezclando los operadores de incremento y decremento con otros operadores como en el siguiente ejemplo:

El cdigo anterior imprime: x = 3 y = 4 Podemos leer la sentencia 'if' como: "Si 3 es igual a 2 o 3 < 4". Como pasaba con la concatenacin de Strings, los operadores de incremento y decremento se usan a lo largo de todo el examen, an cuando las preguntas no van de ese tema. 1.5. Operador Condicional El operador condicional es un operador ternario (de tres operandos) y se usa para evaluar expresiones booleanas de forma parecida a la sentencia 'if', pero en lugar de ejecutar un bloque de cdigo si la expresin devuelve true, el operador condicional asignar un valor a una variable. En otras palabras, el propsito de este operador es decidir cul de los dos valores asignar a una variable. El operador se construye mediante un signo de interrogacin (?) y dos puntos (:). Los parntesis son opcionales. La estructura es: x = (expresin booleana) ? valor a asignar si es true : valor a asignar si es false Veamos un ejemplo de un operador condicional:

Podemos leer el cdigo anterior como: "Pon numofPets a 3. Luego vamos a asignar una cadena a la variable 'status'. Si numofPets es menor que 4 asigna 'Pet limit not exceeded', en cualquier otro caso asigna 'too many pets'." Podemos anidar operaciones condicionales en una sentencia:

1.6. Operadores Lgicos Los objetivos del examen especifican seis operadores lgicos (&, |, ^, !, && y ||). Alguna documentacin de Sun usa otra terminologa para dichos operadores, pero para nuestros propsitos del examen los llamaremos as. Operadores Lgicos de Evaluacin Perezosa Tenemos cinco operadores lgicos en el examen que se usarn para evaluar sentencias que contienen ms de una expresin booleana. Los ms usados de los cinco son los dos operadores lgicos de evaluacin perezosa. Estos son: && Evaluacin Perezona de AND || Evaluacin Perezona de OR Se usan para enlazar expresiones booleanas para formar grandes expresiones booleanas. Estos operadores slo evalan valores booleanas. Para que AND (&&) resulte true, ambos operandos deben ser true. Por ejemplo:

El cdigo anterior evala a true puesto que ambos operandos evalan a true. La evaluacin perezosa del operador && hace que primero se evale el lado izquierdo (primer operando) y se devuelve false, no se evala el segundo operando puesto que ya se sabe que la expresin no puede ser true.

Cuando ejecutamos el cdigo anterior obtenemos: %java Logical boolean b = false

El operador || es similar al operador &&, excepto que se evala a true si ALGUNO de los operandos es true. En este comando, la evaluacin perezosa hace que si el primer operando es true, la expresin devuelva true sin evaluar el segundo operando. Sin embargo, si el primer operando devuelve false, se debe evaluar el segundo. Pon atencin en el siguiente ejemplo, veremos varias preguntas parecidas en el examen:

El resultado es: % java TestOR i<5 Result is true i >= 5 i >= 5 Veamos que pas cuando se ejecut el mtodo main(): 1. Lnea 3: El primer operando se evala 2. Se invoca el mtodo isItSmall(3), imprime "i < 5" y devuelve true. 3. Puesto que el primer operando en la lnea 3 es true, el operador || no evlaa el segundo operando. Nunca veremos "i >= 5". 4. Lnea 6: Se evala el primer operando. 5. Se llama al mtdo isItSmall(6), imprimiendo "i >= 5" y devolviendo false. 6. Como el primer operando es false, se evlaa el segundo operando. 7. Se invoca al mtodo isItSmall(9), imprimiendo "i >= 5". 8. El mtodo isItSmall(9) devuelve false, por lo que la expresin de la lnea 6 es false y nunca se ejecuta la lna 7.

Operadores Lgicos (Sin Evaluacin Tenemos dos operadores lgicos sin evaluacin perezosa: & No Evaluacin Perezona de AND | No Evaluacin Perezona de OR

Perezosa)

Estos operadores se usan en expresiones lgicas como && y ||, pero siempre evalan los dos lados de la expresin. Son ineficientes. Encontraremos muchas preguntas en el examen que utilizan los operadores lgicos de evaluacin perezosa y sin evaluacin perezosa. Tenemos que saber perfectamente cuando se evalan los operandos y cuando no, puesto que el resultado puede variar en funcin de si se evala el segundo operando. Por ejemplo:

Operadores Lgicos Los dos ltimos operadores lgicos son: ^ Exclusive Or (XOR) ! Negacin

^y

El operador ^ evala slo valores booleanos. Este operador est relacionado con los operadores sin evaluacin perezosa en el sentido de que siempre evala ambos operandos en una expresin. Para que este operador devuelva true, EXACTAMENTE un operando debe ser true. Por ejemplo: Produce la salida: "xor false".

La expresin anterior se evala a false porque AMBOS operandos se evalan a true. El operador negacin (!) devuelve el opuesto del valor actual de un boolean:

Puede ser ledo como "si no es true La sentencia produce la siguiente Veamos otro ejemplo que usa booleanos:

la

expresin 7 salida: "not

== 5". equal".

Produce la salida: "! true false". En el ejemplo anterior, observa que la condicin & pasa (imprime true) y que el valor de la variable no cambia, por lo que imprime false.

Вам также может понравиться