3.3 Conceptos Básicos del Lenguaje Java Conjunto de Caracteres Java utiliza Unicode, un conjunto de caracteres de 16 bits Java permite leer ASCII de 7-bit o Latin-1, conviertiéndolo a Unicode Son pocos los editores actuales que soportan Unicode Se puede usar su código en formato \udddd, donde d es un dígito hexadecimal Identificadores Deben comenzar con una letra, incluido _ o $, seguido de letras o dígitos Letras en Unicode es un concepto más amplio Son válidos: Árbol, Hähnchen, etc. Se diferencia mayúscula de minúscula árbol es diferente a Árbol Java define algunas palabras reservadas que no pueden ser usadas como identificador Palabras Resevadas abstract boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static super switch synchronized this throw throws transient try void volatile while Variables, Constantes y Tipos Primitivos Variable Una variable es un item de datos nombrado por un identificador Una variable tiene un tipo, que debe ser declarado antes de su uso (como en C) tipo variable Una variable tiene un ámbito (scope), definido por la visibilidad que tiene la variable en el programa 1
Tipos de Datos Tipos de Datos Primitivos Un tipo define los posibles valores para una variable Java define dos categorías de tipos de datos: Primitivos. Contiene un único valor de tamaño y formato apropiado (e.g. Entero, real, booleano, etc.) Referencias. Es una dirección a un conjunto de valores (e.g. Arreglo, clase e interfaz) Las direcciones son implícitas, dado que Java no soporta punteros Tipo Descripción Largo/Formato byte Entero de un byte 8 bits, C-2 short Entero corto 16 bits, C-2 int Entero 32 bits, C-2 long Entro largo 64 bits, C-2 float Punto flotante de 32 bits, IEEE 754 precisión simple double Punto flotante de 64 bits, IEEE 754 precisión doble char Caracter 16 bits, Unicode boolean Booleano (true y false) Más sobre Datos Primitivos Cada tipo primitivo (excepto short y byte) tiene una clase declarada en el paquete java.lang Constantes declaradas: MIN_VALUE y MAX_VALUE NEGATIVE_INFINITY y POSITIVE_INFINITY NaN (Not a Number) Constantes de Datos Primitivos 178 178L Entero Largo 345.125 234.12D 234.12F simple prec. 23.7e-4 c true caracter booleano Constantes Literales Declaración de Variables 178 178L 045 0X45df 345.125 234.12D 234.12F 23.7e-4 Entero Largo octal Hexadecimal simple prec. c \n \u8f4d true carácter nueva línea Unicode booleano [modificador] tipo variable {, variable* Modificador es opcional Posibles modificadores: static o final static sólo se puede usar en campos (fields) float[] x, y; Declaraciones pueden aparecer en cualquier parte del código La visibilidad de una variable se limita al bloque en que se declara 2
Orden de Resolución de Nombres Declaración local a un bloque (e.g. Loop) Parámetro de un constructor o método Un miembro de una clase o interfaz Tipos explícitamente importados Otros tipos declarados en el mismo paquete Tipos importados implícitamente nombrados Paquetes disponibles en el sistema host Valores Iniciales Una variable se puede inicializar en su declaración final double π = 3.14159; Java asigna valores por omisión a los campos de una clase si no se especifica Corresponde a valor 0 o null Variables locales de un método, constructor o inicializador estático no se inicializan Una variable se inicializa cada vez que se ejecuta su declaración Precedencia y Asociatividad de Operadores Operadores A igual precedencia, se asocia por la izquierda, excepto asignación que es por la derecha La precedencia se pueda cambiar usando paréntesis Para legibilidad se recomienda usar paréntesis, cuando sea posible, de manera de hacer explícita la precedencia, sin exagerar while ((v = stream.next())!= null) procesar(v); Precedencia de Operadores (1/2) Precedencia de Operadores (2/2) Menor precedencia Unario posfijo []. (param) ++ -- Unario prefijo ++ -- + ~! Creación y cast new (tipo) exp Multiplicativo * / % Aditivo + - Shift << >> >>> Relacional < > >= <= instanceof Igualdad ==!= Menor precedencia AND al bit & OR exclusivo al bit ^ OR inclusivo al bit AND lógico && OR lógico Condicional?: Asignación = += -= *= /= %= >>= <<= >>>= &= ^= = 3
Expresiones Una expresión se evalúa de izquierda a derecha Orden puede ser importante cuando existen efectos laterales o corto-circuito En general, cada operando se evalúa antes de realizar la operación Cada expresión tiene un tipo En general domina el operando de mayor rango de valores (e.g. double + long double) Conversión de Tipo: Implícita Conversión implícita. Es automática! Valores Primitivos. Se permite entre valores primitivos cuando se soporta un mayor rango de valores No se permite de punto flotante a entero En la conversión se puede perder precisión Referencias. Una referencia a un objeto de una clase incluye una instancia de cada supertipo Se puede usar una referencia a un objeto de un tipo cuando se requiera una referencia a un supertipo Conversión de Tipo: Explícita Se requiere cuando un tipo no se puede asignar a otro por conversión implícita La conversión explícita se denomina cast double d = 7.99; long l = (long) d; Se puede usar para referencias a objetos con conversión no segura Operador instanceof permite verificar se se puede aplicar casta un objeto if (obj instanceof clase)... null instanceof tipo es siempre falso Operadores Aritméticos Se soporta para todos los tipos de números Suma + Resta - Multiplicación * División / Residuo o módulo % Además cambio de signo - Operadores de Incremento y Decremento Operador de incremento a++ equivale a a = a+1 Operador de decremento a-- equivale a a = a-1 Ambos operadores existen en forma prefija y postfija Prefijo calcula primero la operación y luego se aplica; postfijo es al revés arreglo[i++] Operadores Relacionales Mayor que > Mayor o igual que >= Menor que < Menor o igual que <= Igual que == Diferente!= 4
Operadores al Bit AND al bit & OR inclusivo al bit OR exclusivo al bit ^ Corrimiento a la izquierda << (rellenando con 0) Corrrimiento a la derecha >> (rellenando con el signo) Corrimiento a la derecha >>> (rellenando con 0) Operador Condicional La forma valor = test? exp1 : exp2; Es equivalente a: if (test) valor = exp1; else valor = exp2; La diferencia es que el operador condicional define valor y permite expresiones más compactas Operador de Asignación El operador = corresponde a la asignación, operador de menor precedencia Java soporta otras formas de asignación += -= *= /= %= >>= <<= >>>= &= ^= = arreglo[indice()] += 12 es casi equivalente a arreglo[indice()] = arreglo[indice()] + 12 Segundo caso llama dos veces a indice() Control de Flujo Sentencias y Bloques Sentencia if-else Un bloque básicamente se compone de: Sentencias de expresión Asignación Formas de prefijo o postfijo de ++ y -- Llamadas a métodos (objeto.metodo(...)) Creación de objetos (con new) Sentencias de declaración Variables requieren de inicialización Toda se termina con ; Un bloque se forma con { y Forma básica de flujo de control condicional if (exp-booleana) sent1 else sent2 El else se parea con el ifmás cercano if (valor >= 0) if ( valor < MAX) process(valor); else System.out.println ( valor negativo ) Mal asociado el else 5
Sentencia switch Evalúa una expresión entera cuyo valor se usa para seleccionar caso mediante etiqueta Si no se encuentra etiqueta se salta a default Si no existe default, no se hace nada switch (valor) { case 0: case 2: case 4: case 6: case 8: System.out.println ( es par ); break; case 1: case 3: case 5: case 7: case 9: System.out.println ( es impar ); break; default: System.out.println ( es impar ); Sentencia while y do-while Permite repetición controlada por expresión boolena Las dos formas son: while (exp-boolena ) do while (exp-boolena ); Sentencia for Permite controlar una repetición para un rango de valores La forma es la siguiente: for (exp-inicial; exp-boolena; exp-incremento) Esta forma equivale a: exp-inicial; while (exp-boolena ) { exp-incremento; Sentencia break Permite salir desde cualquier bloque, no sólo switch Se usa para terminar una repetición como for, while o do Se puede usar una etiqueta para salir de un anidamiento de bloques buscar: for(y=0; y<max; y++) { for (x=0; x<max, x++) { if (Matriz[x][y] == valor) { encontrado = true; break buscar; if (! encontrado) System.out.println ( no está ); Sentencia continue Sentencia return La continue permite saltar al final del cuerpo de una repetición y evaluar la condición de término Se usa para ignorar una elemento de proceso Permite terminar la ejecución de un método y retorna al invocador. Si no retorno valor: return; Si retorna valor: return valor; while (! stream.eof ()) { elem = stream.next(); if (elem == elem == \n ) continue; procesar(elem); 6