tokens, operadores y expresiones -...

53
Tokens, Operadores y Expresiones H. Tejeda V [email protected] Universidad Michoacana Facultad de Ciencias F´ ısico-Matem ´ aticas Java– p. 1

Upload: vonhu

Post on 18-Sep-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Tokens, Operadores y Expresiones

H. Tejeda V

[email protected]

Universidad Michoacana

Facultad de Ciencias Fısico-Matematicas

Java– p. 1

Elementos lexicos

• Un programa es una secuencia de caracteres almacenados en unarchivo (código fuente).

• El compilador o el intérprete realiza la interpretación del código fuente.• Los caracteres pueden representar nombres de variables, palabras

reservadas, operadores, caracteres de “puntuación”.• Las construcciones de texto son los elementos léxicos del programa.• En una de las primeras fases de la compilación se buscan los elementos

léxicos y se realiza su conversión en tokens, ignorándose espacios enblanco y comentarios.

• Los tokens se identifican con palabras reservadas, literales, variables,operadores y elementos propios del lenguaje.

Java– p. 2

Juegos de Caracteres

• El lenguaje de programación Java se escribe utlizando Unicode, un juegode caracteres de 16 bits.

• Los primeros 256 caracteres de Unicode coinciden con el juego decaracteres Latin-1.

• La mayor parte de los primeros 128 caracteres de Latin-1 sonequivalentes al juego de caracteres ASCII de 7 bits.

• Cuando se usa un editor de texto que no admita caracteres Unicode, sepuede utilizar la secuencia de escape \ uxxxx, donde cada x representaun dígito hexadecimal (0-9 , a-f o A-F ) para codificar caracteresUnicode.

• La secuencia puede aparecer en constantes de caracteres, cadenas detexto e identificadores.

Java– p. 3

Comentarios

• Los comentarios dentro del código fuente existen por conveniencia de losprogramadores humanos.

• Son ignorados durante la transformación inicial del código fuente.• Hay tres clases de comentarios:

◦ // comentario Se ignoran los caracteres desde // hasta el final de lalínea.

◦ /* comentario */ Se ignoran todos los caracteres desde /* hasta elsiguiente */

◦ /** comentario */ Se ignoran todos los caracteres desde /** hasta elsiguiente */. Estos comentarios de documentación apareceninmediatamente antes de las declaraciones de identificadores y seincluyen en la documentación generada automáticamente.

• Los comentarios no se pueden anidar.

Java– p. 4

Tokens

• Los tokens de un lenguaje son sus palabras básicas.• El analizador sintáctico transforma el código fuente en tokens para

después reconocer sentencias, identificadores, etc.• Los espacios en blanco (espacios, tabuladores, caracteres de nueva

línea, y de salto de página) no son significativos. estos sirven paraseparar tokens, o bien, como contenidos de literales de carácter o decadenas de texto.

• El conversor en tokens es “voraz”, ya que toma tantos caracteres comopuede para construir el siguiente token, por ejemplo, como ++ es máslargo que +, la expresión:

j = i+++++i; // INV ALIDA

Se interpreta como la expresión inválida

j = i++ ++ +i; // INV ALIDA

y no como la expresión válida

j = i++ + ++i;

Java– p. 5

Identificadores

• Los identificadores, utilizados en nombres de entidades como variables,constantes y etiquetas, deben empezar con una letra, seguida de letras,dígitos o ambas cosas.

• Si algo se puede considerar una letra o un dígito en un idioma humano,posiblemente se podrá usar en un identificador.

• Las letras incluyen cualquier símbolo de moneda, signos epeciales o depuntuación.

• Cualquier diferencia en los caracteres de un identificador hace que éstesea único. Se diferencia entre mayúsculas y minúsculas.

• Los identificadores pueden tener la longitud que se quiera, pero conbuen criterio, si son demasiado largos son difíciles de usar y terminanoscureciendo el código.

Java– p. 6

Palabras reservadas

• No se pueden usar como idenificadores ya que tienen un significadoespecial en el lenguaje

abstract default if private this

boolean do implements protected throw

break double import public throws

byte else instanceof return transient

case extends int short try

catch final interface static void

char finally long strictfp volatile

class float native super while

const for new switch

continue goto package synchronized

Java– p. 7

Tipos y Literales

• Toda expresión tiene un tipo que determina qué valores puede producir.• El tipo de una expresión está determinado por los tipos de los valores y

variables utilizadas en ella.• Los tipos se dividen en tipos primitivos y tipos de referencia• Los tipos de datos primitivos son:

boolean true o false

char carácter en código Unicode 2.1 de 16 bitsbyte número entero de bits 8 (con signo)short número entero de bits 16 (con signo)int número entero de bits 32 (con signo)long número entero de bits 64 (con signo)float número en punto flotante de 32 bits (IEEE 754-1985)double número en punto flotante de 64 bits (IEEE 754-1985)

Java– p. 8

Tipos y Literales cont.

• Cada tipo de dato primitivo tiene un tipo de clase correspondiente en elpaquete java.lang

• Estas clases de envoltura (wrapper) Boolean, Character, Byte,Short, Integer, Long, Float y Double definen tambiénconstantes y métodos útiles. Por ejemplo, la mayoría de las clasesdeclaran constantes MIN_VALUEy MAX_VALUE.

Java– p. 9

Literales

• Literales de referencia La única referencia de objeto literal es null quese puede asignar a cualquier variable de referencia. Por convención,null representa un objeto no creado o inválido. No tiene clase, nisiquiera Object .

• Literales booleanos true y false .• Literales de caracter Aparecen entre comillas simples cualquier

carácter válido de Unicode: ’Q’ . Se puede usar la forma \uxxxx,además de que ciertos caracteres especiales se pueden representar consu secuencia de escape.

\n nueva línea (\u000A ) \t tabulador (\u0009 )\b espacio atrás (\u0008 ) \r retorno (\u000D)\f salto de página (\u000C) \\ \ (\u005C)\’ comilla simple (\u0027 ) \" comilla doble(\u0022 )\ddd un char en valor octal

Java– p. 10

Literales numericos

• Enteros Las constantes enteras son cadenas de dígitos octales,decimales o hexadecimales. El inicio indica la base del número: con 0(cero) base 8 u octal, con 0x o 0X base 16 o hexadecimal, y cualquierotro conjunto supone un número decimal.

• Si termina la literal con L o l es una constante entera tipo long , en otrocso se trata de un entero tipo int .

• Punto Flotante Se expresan como números decimales con puntodecimal opcional, y seguidos opcionalmente por un exponente.

• Puede terminar con f o F para indicar constante de simple precisión, opor d o D para doble precisión.

• Las constantes en punto flotante son de tipo double a menos que seindique lo contrario.

• Existen dos ceros: el positivo 0.0 y el el negativo -0.0 los cuales seconsideran iguales al usar el operador ==, pero producen resultadosdistintos al realizar algunos cálculos como: 1d/0d es +∞, y 1d/-0d es−∞.

Java– p. 11

Literales

• Cadena de texto Aparecen entre comillas dobles: "durante" . Se pudeincluir cualquier caracter excepto los saltos de línea, a menos que se usesu secuencia de escape \n

• Un literal de cadena de texto se refiere a un objeto de tipo String .• Los caracteres se pueden especificar en octal, pero deben usarse los 3

dígitos.• Literales de clase Para cada tipo existe un objeto Class asociado. Se

nombra al objeto class de un tipo directamente, agregando “.class ” alnombre del tipo, como en

String.classjava.lang.String.classjava.util.Iterator.classboolean.class

• Las dos primeras literales de clase se refieren al mismo objeto class , yaque son dos nombres diferentes de la misma clase. La tercer literal esuna referencia al objeto Class para la interfaz Iterator y el últimorepresenta al tipo primitivo boolean .

Java– p. 12

Variables

• Son posiciones de almacenamiento en las cuales se puede asignar unvalor.

• Las variables pueden ser campos, variables locales en un bloque decódigo y parámetros.

• La declaración se divide en tres partes: modificadores seguidos por untipo, seguido de una lista de identificadores, pudiendo cada identificadortener un inicializador

• Las variables de campo son miembros de las clases o interfaces y sedeclaran en el cuerpo de la clase o la interfaz. Los campos se puedeninicializar dentro de un bloque de construcción o con un constructor,aunque no es necesario ya que tienen valores inciales por defecto.

• Las variables locales se pueden declarar en cualquier lugar de un bloquede sentencias, no sólo al inicio del bloque, y pueden ser de tipo primitivoo de referencia.

• Como caso especial, se permite la declaración de una variable localdentro de la sección de inicialización de un ciclo for .

Java– p. 13

Variables cont.

• Una variables local debe ser asignada antes de poder usarla, ya que notiene un valor por defecto. Si la asignación no se realiza el compilador loindica.

int x; // no inicializada, no se puede usarint y = 2;x = y * y; // correcto, ahora ’x’ tiene un valor

• Las variables locales dejan de existir cuando el flujo de control alcanze elfinal del bloque donde fueron declaradas.

• El único modificador que puede usarse con una variable local es final yse hace cuando va a ser accedida por una clase interna local o anónima.

• Las variables parámetro son los parámetros que se declaran enmétodos, constructores o bloques catch y la declaración consta de unmodificador opcional, un nombre de tipo y un sólo identificador.

• Los parámetros no pueden tener inicializadores explícitos.• Las variables parámetro dejan de existir cuando finaliza el bloque en el

que aparecen.

Java– p. 14

Variables final

• Con el modificador final indica que el valor de la variable se estableceexactamente una vez y desde ese momento tendrá siempre el mismovalor. Es inmutable.

• Cualquier variable se puede declarar final .• Se deben inicializar antes de usarse, generalmente se hace al

declararlas.

final int id = sigID++;

Java– p. 15

Variables final cont.

• Se puede posponer la inicialización, por lo que se le denomina a lavariable final en blanco, la cual se debe inicializar dentro de un bloque deinicialización o constructor si es un campo de instancia, o en el caso deuna variable, antes de usarla.

class ObjNombrado {final String nombre;ObjNombrado ( String nombre ) {

this.nombre = nombre;}

}

• Las variables locales finales en blanco son útiles cuando el valor que seva a asignar está condicionado por los valores de otras variables.

Java– p. 16

Variables de arreglo

• Los arreglos proporcionan colecciones ordenadas de elementos.• Los componentes de un arreglo pueden ser tipos primitivos o referencias

a objetos, incluyendo referencias a otros arreglos.• Los arreglos son en sí mismos objetos y extienden a Object .

int[] ae = new int[3];

• Lo anterior declara un arreglo con el nombre ae con tres valores int .• En la declaración de tipo se omiten las dimensiones.• El número de componentes se determina cuando se crea utilizando new

y no se puede modificar.• Los elementos del arreglo son accedidos mediante su posición.• El primer elemento de un arreglo tiene como índice 0 (cero) y el último

longitud-1.• El acceso a un elemento del arreglo es con su nombre y el índice

encerrado entre corchetes.

Java– p. 17

Variables de arreglo cont.

• Siempre que se usa un índice se comprueba que esté dentro de loslímites del arreglo, caso contrario se lanza una excepciónArrayIndexOutOfBoundException .

• La expresión de un índice debe ser de tipo int .• La longitud del arreglo se conoce con el campo length .

for (int i = 0; i < ae.length; i++)System.out.println(i + ": " + ae[i]);

• Un arreglo de longitud cero se denomina arreglo vacío.• También es posible poner los corchetes del arreglo después del nombre

de la variable en vez de ponerlos después del tipo:

int ae[] = new int[3];

Java– p. 18

Modificadores de Arreglos

• Se pueden usar los modificadores normales, dependiendo de si elarreglo es un campo o una variable local.

• Los modificadores se aplican a la variable arreglo, no a los elementos.• Si una variable arreglo se declara como final , significa que la

referencia al arreglo no se puede modificar tras la inicialización, por lotanto, no significa que los elementos del arreglo no se puedan cambiar.

Java– p. 19

Arreglos de Arreglos

• Ejemplo para declarar e imprimir una matriz bidimensional:

float[][] mat = new float[4][4];inicializaMatriz(mat);for (int y = 0; y < mat.length; y++) {

for (int x = 0; x < mat[y].length; x++)System.out.print(mat[y][x] + " ");

System.out.println();}

• La primera dimensión se debe especificar al crear el arreglo, las otrasdimensiones pueden quedar sin especificar.

• El ejemplo se puede reescribir de la siguiente forma más explícita:

float[][] mat = new float[4][];for (int y = 0; y < mat.length; y++)

mat[y] = new float[4];

• La ventaja de los arreglos de arreglos es que cada uno puede ser detamaño diferente.

Java– p. 20

Inicializacion de Arreglos

• Al crear un arreglo, cada uno de sus elementos toma el valor inicial pordefecto de su tipo (cero para tipos numéricos, ’\u0000’ para char ,false para boolean y null para tipos de referencia).

• Los arreglos se pueden inicializar dando una serie de valores entre llavesdespués de su declaración.

String[] peligrosos = { "Leones", "Tigres", "Osos" };

• El siguiente código es equivalente a:

String[] peligrosos = new String[3];peligrosos[0] = "Leones";peligrosos[1] = "Tigres";peligrosos[2] = "Osos";

• Se puede usar new explícitamente, pero se debe omitir la longitud delarreglo.

String[] peligrosos=new String[] {"Leones", "Tigres", "Osos" };

Java– p. 21

Inicializacion de Arreglos cont.

• Se puede crear e inicializar un arreglo en cualquier parte, por ejemplo sepuede crear e inicializar un arreglo cuando se invoca a un método.

printStrings(new String[] { "uno","dos","muchos" });

• Los arreglos de arreglos se pueden inicializar anidando inicializaciones.

int [][] trianguloPascal = {

{ 1 },{ 1, 1 },{ 1, 2, 1 },{ 1, 3, 3, 1 },{ 1, 4, 6, 4, 1 }

};

• Los índices de un arreglo van de fuera hacia dentro. Por ejemplo,trianguloPascal[0] se refiere al arreglo int que tiene un elemento,trianguloPascal[1] se refiere al arreglo int de dos elementos, etc.

Java– p. 22

T A R E A

1. Escribe un programa que calcule el triángulo de Pascal hasta unaprofundidad de 12, almacenando cada fila del triángulo en un arreglo de lalongitud apropiada y poniendo cada uno de los arreglos de las filas en unarreglo de 12 arreglos int . Diseña la solución de forma que los resultadossean impresos por un método que imprima el arreglo de arreglos usando lalongitud de cada arreglo, no la constante 12. Modifica el código para usaruna constante distinta de 12 sin modificar el código de impresión.

Java– p. 23

Gestion de nombres

• Se realiza usando dos mecanismos:1. El Espacio de nombres se divide en espacios para diferentes clases

de nombres. Cuando se utiliza un nombre en un programa, sucontexto ayuda a determinar qué clase de nombre es. Los seisespacios diferentes son:◦ Nombres de paquetes◦ Nombres de tipos◦ Nombres de campos◦ Nombres de métodos◦ Nombres de variables locales (incluyendo parámetros)◦ Etiquetas

2. Se utilizan las reglas de alcance para controlar la visibilidad desdeotras partes del programa de los nombres declarados en una partedel programa.

Java– p. 24

¿Como se determina el significado del nombre?

• Buscando en el alcance en curso o en los alcances que lo encierran,declaraciones de ese nombre en los diferentes espacios de nombres. Elorden de búsqueda es:1. Variables locales declaradas en el bloque de código, ciclo for o

como paramétros para una cláusula catch o una sentencia try .Después, variables locales declaradas en cualquier bloque de códigoque incluya al bloque actual. Lo anterior se aplica recursivamentehasta llegar al método que contiene al bloque, o hasta que ya no seencuentre un bloque que lo incluya.

2. Si el código está en un método o en un constructor, los parámetrosdel método o del constructor.

3. Un miembro de la clase o interfaz. Son los campos y métodos deltipo, incluyendo cualquier miembro accesible heredado.

4. Si el tipo es un tipo anidado, el bloque o clase que lo incluye. Si eltipo es un tipo anidado estático, sólo se busca en los miembrosestáticos de la clase o bloque que lo incluye. Se aplicarecursivamente a los bloques y clases que incluyen a su vez los queincluyen al tipo actual.

• Los nombres que se declaran en alcances exteriores pueden quedarocultos por nombres declarados en alcances más internos. Java– p. 25

Operaciones Aritmeticas

• Los operadores aritméticos para tipos numéricos primitivos son:

+ suma- resta

* multiplicación/ división% residuo ó módulo

• Se puede usar el operador unitario - para la negación y también se tiene+ unitario.

• El resultado que se obtiene al emplear los operadores aritméticosdepende de los tipos de operandos involucrados.

Java– p. 26

Aritmetica Entera

• Es modular en complemento a 2, por lo que si se sobrepasa el rango desu tipo (int o long ), se ajusta al módulo del rango, por lo tanto, no seproducen desbordamientos.

• La división entera y el residuo se truncan hacia cero, por ejemplo: (7/2es 3 y -7/2 es -3

• Dividir por cero u obtener el residuo de dividir por cero no es unaoperación válida en aritmética entera y, por tanto, se lanza una excepciónArithmeticException

Java– p. 27

Aritmetica de punto flotante

• Puede desbordar hacia infinito (si el resultado es demasiado grande paraun double o un float ), o desbordar hacia cero (si el resultado esdemasiado pequeño para un double o un float ).

• El resultado de una expresión inválida, como dividir infinito por infinito esun valor NaN ("Not a Number ").

• La suma de dos valores infinitos produce el mismo infinito si tienen elmismo signo, y produce un NaN si tienen distinto signo.

• La resta de dos valores infinitos del mismo signo produce un NaN, y laresta de infinitos de diferente signo produce un valor infinito del mismosigno que el operado izquierdo.

• Las operaciones aritméticas en las que intervienen valores NaN dancomo resultado un NaN.

• Los desbordamientos dan como resultado un infinito del signo apropiado.• Los desbordamientos hacia cero producen un valor de cero con el signo

apropiado.

Java– p. 28

Aritmetica de punto flotante cont.

• Se puede usar un valor infinito usando las constantesPOSITIVE_INFINITY y NEGATIVE_INFINITY en las clases deenvoltura Float y Double .

• La multiplicación de infinito por cero produce un NaN.• Multiplicar infinito por un valor finito distinto de cero produce un valor

infinito del signo apropiado.• La división y el resto de punto flotante puede producir infinitos o NaN,

pero nunca una excepción

x y x/y x%y

Finito ±0.0 ±∞ NaNFinito ±∞ ±0.0 x±0.0 ±0.0 NaN NaN±∞ Finito ±∞ NaN±∞ ±∞ NaN NaN

Java– p. 29

Aritmetica de punto flotante estricta y no estricta

• La aritmética en punto flotante se puede ejecutar en modo: estricta y noestricta.

• La ejecución del código en modo estricto produce siempre resultadosequivalentes en todas las implementaciones de máquinas virtuales deJava.

• Las expresiones constantes que requieren punto flotante se evalúansiempre de forma estricta.

• En modo no estricto se permite a la máquina virtual un grado de libertadpara optimizar el código cuando no se requieren resultados repetibles,por lo que puede no obtenerse siempre el mismo resultado.

• La evaluación en punto flotante no estricta puede dar algo menos deprecisión que el código strictfp , con lo que algunas aplicacionespueden afectarse, pero será irrelevante en la mayor parte de ellas.

• Para determinar si una expresión es estricta, se examina si aparecestrictfp en el método, clase o interface donde está contenida laexpresión.

Java– p. 30

Operadores de incremento y decremento

• El operador de incremento es ++ y el de decremento es - - . Son usadossólo con variables numéricas o elementos de arreglos numéricos. Laexpresión i++ es equivalente a i = i + 1

• Los operadores de incremento y decremento pueden ser operadoresprefijo o sufijo. Si el operador es prefijo, la operación se aplica antes deque se devuelva el valor de la expresión. Si el operador es sufijo, laoperación se aplica después de utilizar el valor original.

class OrdenInc {

public static void main(String[] args) {int i = 16;System.out.println(++i + " " + i++ + " " + i);

}

}

Salida17 17 18

• Los operadores de incremento y decremento se aplican también avariables char , para obtener el valor del siguiente carácter o anterior.

Java– p. 31

Operadores relacionales y de igualdad

• Los operadores producen valores boolean y se pueden aplicar a lostipos numéricos primitivos, y siguen la interpretación matemáticahabitual.

> mayor que >= mayor que o igual a< menor que <= menor que o igual a

== igual a != diferente a

• Al comparar un número con NaN los operadores dan un resultadofalse , excepto el operador ! que devuelve true .

• Para comprobar si un valor es NaN se deben usar los métodosespecíficos de comprobación de NaN (Float.isNaN(float) oDouble.isNaN(Double) )

• Los operadores de igualdad se pueden aplicar a tipos de referencia. Laexpresión ref1==ref2 comprueba la identidad de las referencias,devolviendo true si se refieren al mismo objeto, o si ambas son null ,aunque ambas referencias sean de tipos diferentes.

• Para comprobar la equivalencia se usa el método equals definido enObject .

Java– p. 32

Operadores logicos

• Se emplean para combinar expresiones booleanas dando valoresbooleanos.

& Y lógico Cierto si y sólo si ambos operandosson ciertos

| O inclusivo lógico Cierto si cualquier operando es ciertoˆ O exclusivo lógico (XOR) Cierto si uno de sus operandos es cierto,

pero no ambos! negación lógica Niega o invierte un valor booleano

&& Y condicional Equivalentes al O e Y lógico pero realizan|| O condicional la evaluación del operando derecho

dependiendo del lado izquierdo.

if ((x < 0) ˆ (y < 0))diferenteSigno();

elsemismoSigno();

Java– p. 33

instanceof

• El operador instanceof evalúa si una referencia se refiere a un objetoque es una instancia particular de una clase o interfaz.

• El lado izquierdo de la expresión es una referencia a un objeto, y el ladoderecho es un nombre de interfaz o clase.

Java– p. 34

Operadores para manejo de bits

• Los operadores binarios sobre bits son:

& Y 1 si ambos bits son 1| O inclusivo 1 si cualquiera de los dos bits es 1ˆ O exclusivo (XOR) 1 sólo si los dos bits tienen valores diferentes

<< desplazamiento Desplaza los bits a la izquierda, rellenandoa la izquierda con ceros por la parte derecha

>> desplazamiento Desplaza los bits a la derecha, rellenando conaritmético el bit más significativo por la parte izquierda

>>> desplazamiento Desplaza los bits a la derecha, rellenando conlógico ceros por la parte izquierda.

Java– p. 35

Operadores para manejo de bits cont.

• Se aplican sólo a tipos enteros (incluido char ) y realizan la operaciónsobre cada pareja de bits de los dos operandos.

• Los tipos de los operandos determinan si un operado es lógico o bit a bit,ya que los operadores lógico se aplican a booleanos, y los otros a tiposenteros.

0xF00F & 0x0FF0 => 0x00000xF00F | 0x0FF0 => 0xFFFF0xAAAA ˆ 0xFFFF => 0x5555

• ˜ Operador unitario de complemento a nivel bit, el cual invierte cada unode los bits de su opeando. ˜ 0x00003333 => 0xFFFFCCCC

Java– p. 36

El operador condicional ? :

• Se conoce como operador ternario u operador interrogación/dospuntos .

• El operador condicional evalúa una sola expresión que produce uno dedos valores de acuerdo a una expresión booleana.

• La sentencia

valor = preguntaUsuario ? valorUsuario : valorDefecto;

es equivalente a

if (preguntaUsuario)valor = valorUsuario;

elsevalor = valorDefecto;

• El operador ? puede usarse como parte de una expresión ya quedevuelve un valor.

• Se producen expresiones más compactas, a costa de la legibilidad.• Las expresiones resultantes deben tener tipos compatibles para la

asignación.Java– p. 37

Operadores de asignacion

• El operador de asinación = asigna el valor de la expresión de suoperando derecho a su operando izquierdo, que debe ser el nombre deuna variable o un elemento de un arreglo.

• El tipo de la expresión debe ser compatible con el tipo de la variable,puede necesitarse una asignación explícita de tipo.

• Para los tipos de referencia la expresión debe ser del mismo tipo que eltipo de la variable, o bien un subtipo.

• Para tipos primitivos, los tipos numéricos deben ser compatibles entre sí,y un valor booleano se puede asignar sólo a una variable booleana.

z = 3; // Asignaci on simplex = y = z = 3; // Encadenamiento de asignaciones

Java– p. 38

Operadores de asignacion cont.

• Cualquier operación de aritmética binaria, lógica o de manejo de bits sepuede concatenar con = para formar operadores de asignacióncompuesta:

z * = 3; // var op= expr

equivalente a:

z = z * 3; // var = var op expr;

• La expresión a * = b + 1 es equivalente con a = a * (b + 1) y nocon a = a * b + 1

Java– p. 39

Operadores de concatenacion de cadenas de texto

• Se emplea + para concatenar dos cadenas de texto.• El operador + se interpreta como el operador de concatenación de

cadenas de texto, siempre que al menos uno de los operandos sea unString .

• Si sólo uno de los operando es un String , los otros son convertidosimplícitamente en String .

String buu = " !buu";String llanto = buu + "aaa";llanto += "! ";System.out.println(llanto);

La salida es

!buuaaa!

Java– p. 40

new

• El operador new es un operador unario de prefijo (el operando sigue aloperador).

• Se denomina expresión de creación de instancia.• El valor de la expresión es una referencia al objeto creado.

Expresiones• Una expresión consta de operadores y operandos.• El resultado puede ser una variable, un valor o nada (método declarado

como void ).

Java– p. 41

Expresiones - Orden de Evaluacion

• Los significados de las expresiones están siempre bien definidos.• Los operandos de los operadores se evalúan de izquierda a derecha, al

igual que las expresiones de los parámetros de las invocaciones demétodos o de constructores, así como las expresiones de los índices delos arreglos.

• Excepto en las operaciones &&, || y ?: todo operando de un operadorse evalúa antes de que la operación se realice.

• Si la evaluación del operando izquierdo de un operador binario produceuna excepción, no se evalúa el operando derecho.

• Si una expresión que está siendo evaluada como parámetro de unmétodo o constructor produce una excepción, no se evalúan másexpresiones de parámetros hacia la derecha.

• Lo anterior también se aplica para expresiones de índices de arreglos.

Java– p. 42

Tipo de una expresion

• Toda expresión tiene un tipo que está determinado por los tipos de suscomponentes y la semántica de los operadores.

• Las operaciones con enteros se realizan con precisión de int o long ,por lo que tipos de enteros más cortos (byte y short ) se transformanen int antes de su evaluación.

• Si hay un operando de punto flotante con un operador aritmético, laoperación se realiza con aritmética de punto flotante, a menos que unode los operandos sea double entonces los cálculos y el resultado seránde éste último.

• El operador + es de concatenación cuando cualquiera de los operandoses tipo String , o si el lado izquierdo del operador +=.

• Si se usa en una expresión, un valor char se convierte en int poniendoa cero los 16 bits más significativos.

• Como el lenguaje es fuertemente tipado en casi todos los casos serealiza la comprobación de compatiblidad de tipos en tiempo decompilación.

• Para determinar en tiempo de ejecución el tipo o para forzarexplícitamente se puede usar la conversión de tipos

Java– p. 43

Conversiones implıcitas de tipos

• Las conversiones que se producen automáticamente, sin intervencióndel programador, se conocen como implícitas.

• Conversión de ampliación. Un valor numérico se puede asignar acualquier otra variable numérica cuyo tipo admita un intervalo de valoresmayor. Por ejemplo, char para obtener un int

• Se puede usar la conversión implícita de tipos enteros en punto flotante,pero no al revés.

Java– p. 44

Conversiones implıcitas de tipos – Ejemplo

• Conservar la magnitud no es lo mismo que conservar la precisión de unvalor. Considerar la asignación de un long (64 bits de datos) a un float(32 bits) en donde se pueden perder los bits menos significativos.

long orig = 0x7effffff00000000L;float fval = orig;long perd = (long) fval;System.out.println("orig = " + orig);System.out.println("fval = " + fval);System.out.println("perd = " + perd);

salida

orig = 9151314438521880576fval = 9.1513144E18perd = 9151314442816847872

Java– p. 45

Conversiones explıcitas de tipos

• Cuando un tipo no se puede asignar a otro tipo con una conversiónimplícita, se puede intentar una conversión explícita, para realizar unaconversión de reducción.

double d = 7.99;long l = (long) d;

• Algunas conversiones no están permitidas, por ejemplo de boolean aint .

• Cuando un valor de punto flotante se convierte a un entero, la partefraccionaria se pierde.

• Un double se puede convertir explícitamente a float pudiendosuceder 3 cosas: perder precisión, obtener cero u obtener infinito.

Java– p. 46

Conversiones explıcitas de tipos – Ejemplo

• Los tipos enteros se convierten recortando los bits más significativos.

short s = -134;byte b = (byte) s;System.out.println("s = " + s + ", b = " + b);

salida

s = -134, b = 122;

Java– p. 47

Conversiones de cadenas de texto

• La conversión de cadenas de texto es un tipo especial de conversiónimplícita para tipos primitivos como a tipos de referencia.

• Siempre que el operador + tenga al menos un operando de tipo String ,se interpreta como concatenación y los otros operandos se conviertenimplícitamente en un String en el caso de que no lo sean.

• Las conversiones se definen para todos los tipos primitivos.• Para cualquier objeto se realizan invocando al método toString , que

se hereda de Object o se redefine.• Cuando se convierte una referencia null en un String , el resultado es

la cadena de texto "null" .

Java– p. 48

Acceso a miembros

• Se realiza mediante el operador punto (. ) como en ref.metodo() .• Se usa para acceder a miembros de instancia y a miembros estáticos.• Los miembros estáticos se acceden usando el nombre del tipo o una

referencia a objeto. Cuando se usa el tipo, el miembro referido es eldeclarado o el heredado en caso de no estar declarado. Al usar lareferencia, el tipo declarado de la referencia, y no el tipo del objeto al quese refiere determina a qué miembro se accede.

• Los miembros no estáticos se acceden mediante una referencia a objeto,usando una referencia explícita, o implícitamente con this .

• Los campos y tipos anidados se acceden usando el tipo declarado de lareferencia a objeto, al igual que dentro de un método.

Java– p. 49

Obtencion del metodo correcto

• Para que una invocación a un método sea correcta, se debenproporcionar parámetros en número y tipo apropiados, de forma que enla clase sólo haya un método que se ajuste.

• Si un método no está sobrecargado, la determinación del métodocorrecto es simple, ya que sólo hay una lista de parámetros asociada conel nombre del método.

Java– p. 50

Obtencion del metodo correcto cont.

• En el caso de que dos o más métodos del mismo nombre tengan elmismo número de parámetros, la selección por parte del compilador esusando el algoritmo “más específico”:1. Encuentra todos los métodos que se ajusten a la invocación (nombre

correcto y cuyos parámetros sean de tipos a los que se puedanasignar los valores de los parámetros de la invocación). Si hay unmétodo que se ajuste exactamente con todos los parámetros se leinvoca.

2. Si algún método del conjunto tiene tipos de parámetros que seantodos asignables a algún otro método del conjunto, se elimina porser menos específico. Se repite hasta que no puedan realizarseeliminaciones.

3. Si queda únicamente un método, será el más específico y el queserá invocado. Si queda más de uno, la invocación es ambigua, porlo tanto el código que realiza la invocación no es válido.

Java– p. 51

Obtencion del metodo correcto - Ejemplo

• Suponer la siguiente jerarquía de tipos:Postre

Pastel Bollo

BolloMantequillaPastelChocolate

• Suponer los siguiente métodos sobrecargados que tomancombinaciones particulares de parámetros Postre :

void menu (Postre p, Bollo b) / * 1a forma * /void menu (Pastel a, Postre p) / * 2a forma * /void menu (PastelChocolate ac, Bollo s) / * 3a forma * /

• Considerar las siguientes invocaciones a menu:

menu(refPostre, refBollo);menu(refPastelChocolate, refPostre);menu(refPastelChocolate, refBolloMantequilla);menu(refPastel, refBollo); // Inv alido

Java– p. 52

Orden de Precedencia de Operadores

operadores de sufijo [] . (params) expr++ expr --

operadores unitarios ++expr -- expr +expr - expr - !

creación o cast new (tipo) exprmultiplicativos * / %

aditivos + -

desplazamiento << >> >>>

relacionales < > >= <= instanceof

igualdad == !=

Y &

O exclusivo ˆ

O inclusivo |

Y condicional &&

O condicional ||

condicional ?:

asignación = += -= * = /= %= >>= <<= >>>= &= ˆ= |=

Java– p. 53