SCJP –  Fundamentos * Extraído desde:  http://www.sun.com/training/catalog/courses/CX-310-055.xml
Fundamentos <ul><li>Elementos de un archivo fuente </li></ul><ul><ul><li>Declaración de paquete (única) </li></ul></ul><ul...
Identificadores <ul><li>Un identificador valido en Java comienza con una letra (unicode), “$” o “_”, después cualquier com...
Arreglos <ul><li>Los arreglos son objetos y para crearlo hay que seguir estos pasos: </li></ul><ul><ul><li>Declarados: int...
Arreglos <ul><li>El tamaño de un arreglo no puede ser cambiado </li></ul><ul><li>Arreglos “anónimos” pueden ser creados as...
Recolección de Basura <ul><li>Un objeto “sin uso” es aquel que no puede ser referenciado por ninguna parte “activa” del pr...
Recolección de Basura <ul><li>La memoria ocupada durante la ejecución del programa no será liberada hasta que el programa ...
Recolección de Basura <ul><li>Referencias circulares no previenen que los objetos sean recolectados </li></ul><ul><li>Pode...
El método “finalize” <ul><li>El método “finalize” es utilizado para liberar recursos utilizados (posiblemente) por el obje...
El método “finalize” <ul><li>El método finalize puede ser sobrecargado pero solo el método con la firma “original” será in...
Operadores y Asignaciones <ul><li>Enteros </li></ul><ul><ul><li>Los enteros dependiendo de la precisión se dividen en los ...
Enteros <ul><li>Los enteros por defecto se almacenan internamente como tipo int, que es un valor de 32 bits con signo. Si ...
Coma flotante <ul><li>Los reales en coma flotante (números con parte entera y parte decimal), pueden ser de dos tipos:  fl...
Lógicos <ul><li>En Java el tipo lógico se ha implementado a través de los literales (y palabras reservadas):  true  y  fal...
Caracteres <ul><li>Los caracteres que se refieran a un único carácter unicode se representan entre comillas simples. Adici...
Precedencia y Asociatividad
Operadores <ul><li>Los operadores prefijos unarios y todos los operadores binarios (excepto el de asignación) son asociado...
Ejemplo: Operadores <ul><li>¿Como será evaluado: 2 + 3 * 4? </li></ul><ul><li>Será evaluado como 2 + (3 * 4), debido a que...
Conversiones <ul><li>Java, es un lenguaje fuertemente tipificado, chequea en tiempo de compilación la compatibilidad de ti...
Casting... <ul><li>La sintaxis de  cast , es la siguiente: </li></ul><ul><ul><li>(<tipo>) <expresión> </li></ul></ul><ul><...
Casting... <ul><li>Los valores boolean no pueden ser “moldeados” a otro tipo, y viceversa. </li></ul><ul><li>Moldear a nul...
Estrechamiento y Ensanchamiento <ul><li>Para un tipo de dato primitivo, un valor mas “estrecho” puede ser convertido a un ...
Tabla de conversión
Promociones Numéricas <ul><li>Los operadores numéricos solo permiten operandos de ciertos tipos. La promoción numérica es ...
Promoción Numérica Unaria <ul><li>Si el operando del operador es menor a  int , automáticamente será convertido a  int .  ...
Contextos de Aplicación <ul><li>Operando de un operador aritmético unario como + y/o –  </li></ul><ul><li>Operando de un o...
Ejemplos: <ul><li>byte b = 3; // Asignación valida, literal “3” se encuentra en rango.  </li></ul><ul><ul><li>128 seria in...
Promoción Numérica Binaria <ul><li>La promoción numérica binaria implícita se aplica para lograr un apropiado ensanchamien...
Contextos de Aplicación <ul><li>La promoción numérica binaria es aplicada en los siguientes contextos: </li></ul><ul><ul><...
Contextos de Conversión <ul><li>Las conversiones de tipo pueden ocurrir en los siguientes contextos: </li></ul><ul><ul><li...
Notas de Conversión <ul><li>Tanto los operadores unarios como binarios, independiente del tipo de los operandos sobre los ...
Operador de Asignación Simple : = <ul><li>Las asignación tiene la siguiente sintaxis: </li></ul><ul><ul><li><variable> = <...
Asignación de Conversiones Numéricas <ul><li>El destino y la fuente deben ser del mismo tipo en  la asignación. Si el ensa...
Ejemplo: <ul><li>long bigInteger = 412343214321543L; </li></ul><ul><li>float realNo = bigInteger; </li></ul><ul><li>Se rea...
Operadores Aritméticos <ul><li>Los operadores aritméticos son usados para construir expresiones matemáticas algebraicas. <...
Notas Operadores Aritméticos <ul><li>La división por cero solo lanza una excepción para tipos int y float </li></ul><ul><u...
Ejemplo <ul><li>El operador “+” se encuentra “sobrecargado para concatenar String, teniendo mayor precedencia el operador ...
Operadores Aritméticos de Asignación <ul><li>Este operador de asignación extendido tiene la siguiente sintaxis: </li></ul>...
Ejemplo <ul><li>Ejemplo: Dado T igual al tipo de x. a es una expresión. </li></ul><ul><li>x *= a; es igual a x = (T) (x * ...
Operador Binario de Concatenación <ul><li>El operador binario + esta sobrecargado de manera que detecta si alguno de sus o...
Operadores de Incremento y Decremento <ul><li>Los operadores de incremento (++) y decremento (--) tienen dos comportamient...
Ejemplo <ul><li>int x=0; x=x++;  </li></ul><ul><ul><li>¿Resultado? x = ¿?; </li></ul></ul>
Expresiones Booleanas <ul><li>Las expresiones booleanas tienen tipos de datos boolean, y solo pueden ser evaluadas verdade...
Operadores Relacionales  <, <=, >, >= <ul><li>Dado a y b que representan expresiones de valores numéricos, el operador rel...
Operadores Relacionales Evaluación <ul><li>En la evaluación resulta un valor lógico. </li></ul><ul><li>Un operador relacio...
Igualdad (primitivos ==, !=) <ul><li>Dado a y b que representan valores de tipo de datos primitivos, la igualdad de los va...
Consideraciones <ul><li>Precaución con la comparación de números en coma flotante, ya que ciertos valores solo pueden ser ...
Igualdad de referencias de objetos <ul><li>Dado r y s variables de referencia, la igualdad esta dada por: </li></ul><ul><u...
Condiciones <ul><li>Los operandos deben ser de un tipo compatible. </li></ul><ul><ul><li>Esto significa si es posible mold...
Consideraciones <ul><li>La clase  Object  provee el método lógico  equals(Object obj)  el cual puede ser sobrescrito  para...
Operadores Lógicos <ul><li>Los operadores lógicos lógicos pueden ser aplicados a operandos lógicos, retornan un nuevo valo...
Operadores extendidos <ul><li>Asignación booleana lógica &=, ^=, |= </li></ul><ul><li>El operando de la izquierda debe ser...
Operadores condicionales: &&, || <ul><li>Los operadores condicionales son muy parecidos a los operadores lógicos lógicos, ...
Operadores condicionales: &&, || <ul><li>Dado x e y expresiones de valores lógicos, los operadores condicionales se define...
Corto Circuito en la Evaluación <ul><li>En la evaluación de expresiones que involucren operadores condicionales AND ó OR, ...
Ejemplo <ul><li>boolean b = (4==2) && (1 < 4) //false </li></ul><ul><ul><li>En este caso como 4==2 es falso, y el operador...
Representación de Enteros <ul><li>El tipo de datos entero en Java representa a valores positivos y negativos. </li></ul><u...
Representación Binaria <ul><li>Sumando 1 al valor máximo de int 2147483647 da como resultado el valor mínimo de int -21474...
Calculando el Complemento a dos <ul><li>Dado un valor  byte  positivo 41, entonces la representación binaria es -41 y pued...
Operadores a nivel de bits <ul><li>Los operadores a nivel de bits binario manipulan cada valor individual correspondiente ...
Operadores a nivel de bits <ul><li>Ejemplo: </li></ul><ul><ul><li>char v1 = ')';  // 41 </li></ul></ul><ul><ul><li>byte v2...
Operadores extendidos  &=, ^=, |= <ul><li>Estos operadores son definidos en la tabla siguiente: </li></ul>
Operadores de desplazamiento <ul><li>Los operadores de desplazamiento binario forman un nuevo valor desplazando bits hacia...
Rangos de desplazamiento <ul><li>El numero de bits desplazados siempre esta en el rango: </li></ul><ul><li>Modulo de 32 pa...
El operador << <ul><li>Los bits son desplazados a la izquierda, y llenando con ceros a la derecha. </li></ul><ul><li>Ejemp...
Operador << <ul><li>Cada desplazamiento a la izquierda corresponde a la multiplicación del valor por 2 elevado al numero d...
Ejemplo <ul><li>byte b = -42; // 1101 0110 </li></ul><ul><li>int result = b << 4; // -672 </li></ul><ul><li>Los bits del b...
Operador >> <ul><li>Todos los bits son desplazados a la derecha, el bit de signo es usado para llenar a la izquierda. </li...
Operador >>> <ul><li>Todos los bits son desplazados a la derecha, se rellena con 0 a la izquierda sin importar si el opera...
Op. Extendidos  >>=, >>=, >>>= <ul><li>Estos operadores son definidos en la tabla siguiente: </li></ul><ul><li>El resultad...
El operador condicional “? :” ternario: <ul><li>El operador ternario permite expresiones condicionales definidas. Y tiene ...
Otros operadores: new, [], instanceof <ul><li>El operador new es usado para crear objetos, por ejemplo instancias de clase...
Ejemplo <ul><li>if (miString instanceof String) </li></ul><ul><li>Se comprueba el objeto que denota la referencia, por lo ...
Paso de Parámetros <ul><li>Los objetos se comunican a través de mensajes </li></ul><ul><li>Los mensajes son implementados ...
Sintaxis <ul><li>La sintaxis para llamar un método puede ser cualquiera de estas: </li></ul><ul><ul><li><referencia de obj...
Paso de Parámetros <ul><li>Si el objeto llamador y el llamado son el mismo, <referencia de objeto> puede ser omitido. </li...
Paso de Parámetros <ul><li>Las listas de parámetros Actual y Formal deben ser compatibles: </li></ul><ul><ul><li>El numero...
Pasando valores primitivos <ul><li>Cuando un parámetro actual es una variable de tipo primitivo, el valor de la variable e...
Pasando valores de referencia <ul><li>Si un parámetro actual es una referencia a un objeto, entonces un valor de referenci...
Parámetros formales finales <ul><li>Un parámetro formal puede declararse final anteponiendo la palabra  final  en la decla...
Conversiones “Boxing” <ul><li>Desde el tipo boolean al tipo Boolean  </li></ul><ul><li>Desde el tipo byte al tipo Byte  </...
Como funciona? <ul><li>Si p es un valor de tipo boolean, entonces la conversion boxing convierte p en una referencia r de ...
Como funciona? <ul><li>Si p de un valor de tipo int, entonces la conversion boxing convierte p en una refrencia r de la cl...
Como funciona? <ul><li>Si p es de un valor tipo double, entonces Si p no es NaN, la conversion boxing convierte p en una r...
Cuidado <ul><li>Si el valor de p fue “transformada” a true, false, byte, char entre u0000 a u007f, ó un int ó short entre ...
Unboxing <ul><li>Desde el tipo Boolean al tipo boolean  </li></ul><ul><li>Desde el tipo Byte al tipo byte  </li></ul><ul><...
Como funciona? <ul><li>Si r es una referencia de tipo Boolean, entonces la conversion unboxing convierte r en: r.booleanVa...
Próxima SlideShare
Cargando en…5
×

Seccion Fundamentos SCJP

3.358 visualizaciones

Publicado el

Sección Fundamentos examen de certificación Sun Certified Java Programmer

Publicado en: Tecnología
0 comentarios
5 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
3.358
En SlideShare
0
De insertados
0
Número de insertados
97
Acciones
Compartido
0
Descargas
1
Comentarios
0
Recomendaciones
5
Insertados 0
No insertados

No hay notas en la diapositiva.
  • Seccion Fundamentos SCJP

    1. 1. SCJP – Fundamentos * Extraído desde: http://www.sun.com/training/catalog/courses/CX-310-055.xml
    2. 2. Fundamentos <ul><li>Elementos de un archivo fuente </li></ul><ul><ul><li>Declaración de paquete (única) </li></ul></ul><ul><ul><li>Instrucciones “import” (cero o mas) </li></ul></ul><ul><ul><li>Definiciones de clase (cero o mas, solo una publica –incluso si es interface- ) </li></ul></ul><ul><ul><ul><li>El nombre de la clase publica debe ser el mismo del archivo (y .java) </li></ul></ul></ul><ul><ul><ul><li>Sin embargo un archivo fuente puede no tener una clase publica, ó incluso nada. </li></ul></ul></ul><ul><li>La importación de paquetes no es recursiva (no importa sub paquetes) </li></ul><ul><li>Los comentarios pueden estar en cualquier lugar, pero no pueden ser anidados. </li></ul>
    3. 3. Identificadores <ul><li>Un identificador valido en Java comienza con una letra (unicode), “$” o “_”, después cualquier combinación de letras, “$”, “_” o dígitos </li></ul><ul><li>Los caracteres unicote pueden estar en cualquier parte del codigo fuente, las siguientes instrucciones son todas validas: </li></ul><ul><ul><li>chu0061r a = 'a'; </li></ul></ul><ul><ul><li>char u0062 = 'b'; </li></ul></ul><ul><ul><li>char c = 'u0063'; </li></ul></ul><ul><li>Todos los tipos de datos enteros son con signo excepto “char” </li></ul>
    4. 4. Arreglos <ul><li>Los arreglos son objetos y para crearlo hay que seguir estos pasos: </li></ul><ul><ul><li>Declarados: int[] a; String b[]; Object []c; (no se especifica el tamaño) </li></ul></ul><ul><ul><li>Asignados o construidos: a = new int[10]; c = new String[arraysize] (el argumento “arraysize” es de tipo entero) </li></ul></ul><ul><ul><li>Inicializados: for (int i = 0; i < a.length; a[i++] = 0) </li></ul></ul><ul><li>Lo anterior se puede hace en un solo paso: </li></ul><ul><ul><li>int a[] = { 1, 2, 3 }; ó int a[] = new int[] { 1, 2, 3 }; (En ninguna caso se indica el tamaño, se determina a través del numero de elementos “literales”) </li></ul></ul>
    5. 5. Arreglos <ul><li>El tamaño de un arreglo no puede ser cambiado </li></ul><ul><li>Arreglos “anónimos” pueden ser creados así: new int[] {1,2,3} ó new int[10] </li></ul><ul><li>El índice de un arreglo comienza con 0 y la cantidad de elementos se determina con el atributo length (el ultimo elemento es igual arreglo.length - 1). </li></ul><ul><li>Pueden ser creados arreglos con cero elementos </li></ul><ul><li>El “Garbage Collection” es un mecanismo a través del cual se recupera memoria desde objetos “sin uso”, aumentando la memoria disponible para nuevos objetos. </li></ul>
    6. 6. Recolección de Basura <ul><li>Un objeto “sin uso” es aquel que no puede ser referenciado por ninguna parte “activa” del programa. </li></ul><ul><li>El “Garbage Collection” corre como un Thread de baja prioridad. </li></ul><ul><li>No es posible forzar el Garbage Collection, solo se puede “sugerir” su ejecución con System.gc() </li></ul><ul><li>No hay garantía sobre la recolección y ejecución de los “finalizadores” de los objeto. GC no se ejecutara si en la ejecución del programa no existen “garantías”. </li></ul>
    7. 7. Recolección de Basura <ul><li>La memoria ocupada durante la ejecución del programa no será liberada hasta que el programa termine, a excepción de que el sistema operativo lo solicite. </li></ul><ul><li>Tampoco existen garantías con respecto al orden en que serán recolectados los objetos (elegibles por el GC) </li></ul><ul><li>Un objeto es elegible para la recolección de basura solo si las referencias desde otros objetos son a su vez también son elegibles para la recolección de basura. </li></ul>
    8. 8. Recolección de Basura <ul><li>Referencias circulares no previenen que los objetos sean recolectados </li></ul><ul><li>Podemos asignar null a las variables de referencias y ejecutar gc para recolectar el objeto referenciado por la variable, pero si el objeto tiene asignado un Oyente (Listener), este no será recolectado, primero se debe remover el oyente. </li></ul><ul><li>Todos los objetos tienen un método “finalize”, el cual es heredado desde la clase Object </li></ul>
    9. 9. El método “finalize” <ul><li>El método “finalize” es utilizado para liberar recursos utilizados (posiblemente) por el objeto, el orden en cual es invocado este método no tiene relación con el orden de creación, la firma del método es: </li></ul><ul><li>protected void finalize() throws Throwable { } </li></ul><ul><li>El método finalize es ejecutado solo una vez por objeto, si se produce una excepción (en el método), el objeto continuara en estado “elegible”. </li></ul><ul><li>El método finalize puede ser ejecutado explícitamente pero esto no implica que será recolectado. </li></ul>
    10. 10. El método “finalize” <ul><li>El método finalize puede ser sobrecargado pero solo el método con la firma “original” será invocado por gc. </li></ul><ul><li>El método finalize no esta “encadenado” implícitamente, por lo que debe invocar al método finalize de la clase padre, pero el compilador no comprobara esto. </li></ul><ul><li>Se puede ejecutar System.runFinalization() puede ser usado para ejecutar (no debe ser ejecutado antes) los “finalizadores” de los objetos elegibles. </li></ul>
    11. 11. Operadores y Asignaciones <ul><li>Enteros </li></ul><ul><ul><li>Los enteros dependiendo de la precisión se dividen en los siguientes tipos primarios: </li></ul></ul><ul><ul><li>byte 8 bits complemento a dos. </li></ul></ul><ul><ul><li>short 16 bits complemento a dos. </li></ul></ul><ul><ul><li>int 32 bits complemento a dos. </li></ul></ul><ul><ul><li>long 64 bits complemento a dos. </li></ul></ul>
    12. 12. Enteros <ul><li>Los enteros por defecto se almacenan internamente como tipo int, que es un valor de 32 bits con signo. Si fuese necesario que un literal se almacenara como long debe añadirse una letra l o L al final del literal. Estos pueden representarse en tres formatos diferentes: </li></ul><ul><ul><li>decimal (no tiene notación especial) </li></ul></ul><ul><ul><li>octal (notación: prefijo 0) </li></ul></ul><ul><ul><li>hexadecimal (notación: prefijo 0x ó 0X) </li></ul></ul><ul><li>Ejemplo; Decimal: 42, Hexadecimal: 0x2A, Octal: 052 </li></ul>
    13. 13. Coma flotante <ul><li>Los reales en coma flotante (números con parte entera y parte decimal), pueden ser de dos tipos: float y double . </li></ul><ul><ul><li>Los primeros se almacenan en 32 bits y los segundos en 64 bits. </li></ul></ul><ul><ul><li>La diferencia esta dada por la capacidad de precisión, debido a la mayor cantidad de información que necesitan para representarlos. </li></ul></ul><ul><li>Por defecto los literales de coma flotante se almacenan en double si fuese necesario expresar un literal como float solo basta poner una f ó F al final del literal. </li></ul>
    14. 14. Lógicos <ul><li>En Java el tipo lógico se ha implementado a través de los literales (y palabras reservadas): true y false . </li></ul>
    15. 15. Caracteres <ul><li>Los caracteres que se refieran a un único carácter unicode se representan entre comillas simples. Adicionalmente Java cuenta con un tipo de dato char (short) para almacenar este tipo de datos. También pueden incluirse caracteres no imprimibles como: , , , f, , , ’, ”, udddd, ddd </li></ul><ul><li>Ejemplo de formatos de representación de enteros: </li></ul><ul><ul><li>int i = 18; </li></ul></ul><ul><ul><li>int j = 022;//Version Octal: dos veces ocho mas dos </li></ul></ul><ul><ul><li>int k = 0x12;//Version Hex: una vez dieciséis mas dos </li></ul></ul>
    16. 16. Precedencia y Asociatividad
    17. 17. Operadores <ul><li>Los operadores prefijos unarios y todos los operadores binarios (excepto el de asignación) son asociados de izquierda a derecha. </li></ul><ul><li>Todos los operadores unarios (excepto los prefijos), todos los operadores de asignación, y el operador condicional ternario (incluido el de creación de objetos y cast ) son asociados de derecha a izquierda. </li></ul><ul><li>Las expresiones se analizan de izquierda a derecha, salvo que existan paréntesis. </li></ul><ul><li>Las reglas de precedencia determinan que operador debe ser aplicado primero entre dos operadores con diferente precedencia. </li></ul>
    18. 18. Ejemplo: Operadores <ul><li>¿Como será evaluado: 2 + 3 * 4? </li></ul><ul><li>Será evaluado como 2 + (3 * 4), debido a que * tiene mayor precedencia que +. </li></ul>
    19. 19. Conversiones <ul><li>Java, es un lenguaje fuertemente tipificado, chequea en tiempo de compilación la compatibilidad de tipos. </li></ul><ul><ul><li>Si un tipo puede ser sustituido por otro. </li></ul></ul><ul><li>Pero a veces solo es posible hacerlo en tiempo de ejecución. </li></ul><ul><ul><li>Un tipo de referencia (objeto) solo se encuentra construido en tiempo de ejecución. </li></ul></ul><ul><li>Si un operador tiene operadores incompatibles (Por ejemplo, la asignación de un doble a un entero) Java demanda la utilización de un cast para indicar explícitamente el tipo de conversión. </li></ul>
    20. 20. Casting... <ul><li>La sintaxis de cast , es la siguiente: </li></ul><ul><ul><li>(<tipo>) <expresión> </li></ul></ul><ul><li>En tiempo de ejecución se creara un nuevo valor de <tipo> que “mejor” represente al valor de <expresión>. </li></ul><ul><li>El moldeo o casting puede ser aplicado a tipos primitivos como a referencias. </li></ul><ul><li>Obviamente el casting entre referencias y primitivos, no esta permitido. </li></ul>
    21. 21. Casting... <ul><li>Los valores boolean no pueden ser “moldeados” a otro tipo, y viceversa. </li></ul><ul><li>Moldear a null genera un error de compilación ya que null no es un tipo. </li></ul><ul><li>Diferencia importante en la asignación: </li></ul><ul><ul><li>Los tipos primitivos son chequeados en tiempo de compilación. </li></ul></ul><ul><ul><li>Los tipos de referencia son chequeados en tiempo de ejecución. </li></ul></ul><ul><ul><li>Las conversiones que involucran moldeos se llaman conversiones explicitas </li></ul></ul><ul><ul><li>Bajo ciertas condiciones el compilador realiza conversiones implícitas , por ejemplo cuando un char es asignado a un int </li></ul></ul>
    22. 22. Estrechamiento y Ensanchamiento <ul><li>Para un tipo de dato primitivo, un valor mas “estrecho” puede ser convertido a un valor mas “ancho” sin perder información. </li></ul><ul><li>Esto se conoce como “Conversión de ensanchamiento de primitivos”. </li></ul><ul><li>La conversión al próximo valor más “ancho” esta resumida en la siguiente figura. Las conversiones son transitivas. </li></ul>
    23. 23. Tabla de conversión
    24. 24. Promociones Numéricas <ul><li>Los operadores numéricos solo permiten operandos de ciertos tipos. La promoción numérica es implícitamente aplicada a los operandos para convertirlos en tipos permisibles. </li></ul><ul><li>Existe una distinción importante entre la promoción numérica unaria y binaria. </li></ul>
    25. 25. Promoción Numérica Unaria <ul><li>Si el operando del operador es menor a int , automáticamente será convertido a int . </li></ul><ul><li>En otras palabras los tipos byte, short, char son convertidos a enteros a través de una conversión de ensanchamiento de primitivos. </li></ul><ul><ul><li>Asignar un resultado int a una variable de estos tipos requiere una conversión explicita. </li></ul></ul>
    26. 26. Contextos de Aplicación <ul><li>Operando de un operador aritmético unario como + y/o – </li></ul><ul><li>Operando de un operador de complemento (~) </li></ul><ul><li>Durante la creación de un arreglo, por ejemplo new int[20], donde la dimensión debe estar expresada en entero y por lo tanto debe ser evaluada </li></ul><ul><li>En el índice de un arreglo (Idem punto anterior) </li></ul><ul><li>Operandos individuales de los operadores shift <<, >> y >>> </li></ul>
    27. 27. Ejemplos: <ul><li>byte b = 3; // Asignación valida, literal “3” se encuentra en rango. </li></ul><ul><ul><li>128 seria invalido. </li></ul></ul><ul><li>b = (byte) –b; // Asignación valida, se requiere conversión explicita a byte ya que se produjo la promoción automática del operador unario -. </li></ul>
    28. 28. Promoción Numérica Binaria <ul><li>La promoción numérica binaria implícita se aplica para lograr un apropiado ensanchamiento (primitivo) entre un par de operandos, siendo el de tipo mayor el mandatario para el ensanchamiento. Pero, siempre mayor a int . </li></ul><ul><ul><li>byte, short, char, siempre son convertidos a int . </li></ul></ul>
    29. 29. Contextos de Aplicación <ul><li>La promoción numérica binaria es aplicada en los siguientes contextos: </li></ul><ul><ul><li>Operandos de operadores aritméticos: *, /, %, + y – </li></ul></ul><ul><ul><li>Operandos de operadores relacionales: <, <=, > y >= </li></ul></ul><ul><ul><li>Operandos de operadores de igualdad numérica: == y != </li></ul></ul><ul><ul><li>Operandos de operadores de bits (bitwise) &, ^ y | </li></ul></ul>
    30. 30. Contextos de Conversión <ul><li>Las conversiones de tipo pueden ocurrir en los siguientes contextos: </li></ul><ul><ul><li>Asignaciones, que involucren tipos de datos primitivos y referencias. </li></ul></ul><ul><ul><li>Invocaciones de métodos, que involucren parámetros de tipo primitivo y de tipo referencia </li></ul></ul><ul><ul><li>Evaluación aritmética de expresiones que involucren tipos numéricos </li></ul></ul><ul><ul><li>Concatenación de cadenas que involucren a objetos de la clase String y otros tipos de datos </li></ul></ul>
    31. 31. Notas de Conversión <ul><li>Tanto los operadores unarios como binarios, independiente del tipo de los operandos sobre los que se realice la operación, devuelven un int para todos los casos, excepto que uno de los operandos sea un long, en cuyo caso el valor devuelto será un long. </li></ul><ul><li>Esto último se aplica sobre números en punto flotante, pero el resultado será de tipo float si ambos operandos son de este tipo y en caso contrario el tipo será double . </li></ul>
    32. 32. Operador de Asignación Simple : = <ul><li>Las asignación tiene la siguiente sintaxis: </li></ul><ul><ul><li><variable> = <expresión> </li></ul></ul><ul><ul><ul><li>El destino <variable> y la fuente <expresión> deben ser de tipo compatible. </li></ul></ul></ul><ul><ul><ul><li><variable> debe haber sido declarada. </li></ul></ul></ul><ul><li>Asignación múltiple: </li></ul><ul><ul><li>k = j =10, es interpretado como (k = (j = 10)), ya que el operador de asignación tiene asociatividad a la derecha. </li></ul></ul><ul><ul><ul><li>Esto también se aplica a tipos referencia. </li></ul></ul></ul>
    33. 33. Asignación de Conversiones Numéricas <ul><li>El destino y la fuente deben ser del mismo tipo en la asignación. Si el ensanchamiento de un primitivo es permisible, esta se realiza de manera implícita. </li></ul><ul><li>Valores enteros ensanchados a punto flotante puede resultar en una perdida de precisión. </li></ul><ul><ul><li>NO confundir la magnitud (cuan grande puede ser un valor) con la precisión (la cantidad de dígitos en un numero) </li></ul></ul>
    34. 34. Ejemplo: <ul><li>long bigInteger = 412343214321543L; </li></ul><ul><li>float realNo = bigInteger; </li></ul><ul><li>Se realiza el ensanchamiento pero se pierde precisión. </li></ul>
    35. 35. Operadores Aritméticos <ul><li>Los operadores aritméticos son usados para construir expresiones matemáticas algebraicas. </li></ul><ul><ul><li>Los operandos son de tipo numérico, pero el operador + puede actuar concatenando cadenas si uno de sus operando es de tipo String (cadena). </li></ul></ul><ul><ul><li>La tabla siguiente muestra la precedencia de los operadores aritméticos: </li></ul></ul><ul><ul><li>Unarios </li></ul></ul><ul><ul><ul><li>+ (Adición) - (Sustracción) </li></ul></ul></ul><ul><ul><li>Binarios </li></ul></ul><ul><ul><ul><li>* (Multiplicación) / (División) % (Modulo) </li></ul></ul></ul><ul><ul><ul><li>+ (Adición) - (Sustracción) </li></ul></ul></ul>
    36. 36. Notas Operadores Aritméticos <ul><li>La división por cero solo lanza una excepción para tipos int y float </li></ul><ul><ul><li>long y double, se obtendrá como resultado NaN, POSITIVE_INFINITY ó NEVATIVE_INFINITY </li></ul></ul><ul><li>Cálculos en punto flotante pueden producir NaN (la raíz cuadrada de un numero negativo) ó Infinito (División por cero) </li></ul><ul><ul><li>No comparar x==Float.NaN ya que no funcionara, </li></ul></ul><ul><ul><li>Usa la clase“Wrapper” ya que dispone de un método Float.IsNaN(x) para realizar esta comprobación correctamente. </li></ul></ul><ul><ul><ul><li>Pero (X == Double.POSITIVE_INFINITY) OK </li></ul></ul></ul>
    37. 37. Ejemplo <ul><li>El operador “+” se encuentra “sobrecargado para concatenar String, teniendo mayor precedencia el operador “+” para enteros, ejemplo: </li></ul><ul><ul><li>System.out.println(1 + 2 + “3”); // resultado : 33 </li></ul></ul>
    38. 38. Operadores Aritméticos de Asignación <ul><li>Este operador de asignación extendido tiene la siguiente sintaxis: </li></ul><ul><ul><li><variable> <op>= <expresión> </li></ul></ul><ul><ul><li>y tiene el siguiente sentido semántico: </li></ul></ul><ul><ul><ul><li><variable> = (<tipo>) ( <variable> <op> (<expresión>) ) </li></ul></ul></ul><ul><ul><ul><li>Es importante considerar esto a la hora de evaluar expresiones. </li></ul></ul></ul><ul><li>El tipo de <variable> es igual a <tipo> y la <variable> es evaluada solo una vez. </li></ul><ul><ul><li><op> puede ser cualquier operador valido (*,/,%,+,-) </li></ul></ul>
    39. 39. Ejemplo <ul><li>Ejemplo: Dado T igual al tipo de x. a es una expresión. </li></ul><ul><li>x *= a; es igual a x = (T) (x * (a)); </li></ul><ul><ul><li>Nota: No se puede utilizar estos operadores junto con la declaración </li></ul></ul><ul><li>int x += 1; </li></ul>
    40. 40. Operador Binario de Concatenación <ul><li>El operador binario + esta sobrecargado de manera que detecta si alguno de sus operandos es un String, de manera de realizar la conversión del otro operando a String y realizar la concatenación. </li></ul><ul><li>Valores como true, false y null son representados como String de manera literal. </li></ul><ul><li>Ejemplo: </li></ul><ul><ul><li>String s = “Hola ” + 4 </li></ul></ul><ul><ul><ul><li>Resultado: “Hola 4” </li></ul></ul></ul>
    41. 41. Operadores de Incremento y Decremento <ul><li>Los operadores de incremento (++) y decremento (--) tienen dos comportamientos: prefijo y postfijo. </li></ul><ul><ul><li>++i, primero suma 1 a i, después usa este nuevo valor de i como valor en la expresión. </li></ul></ul><ul><ul><li>i++, primero usa el valor de i en la expresión, después suma 1 a i. </li></ul></ul><ul><ul><ul><li>Lo mismo aplica al operador --. </li></ul></ul></ul><ul><li>Notas : </li></ul><ul><ul><li>Estos operadores pueden ser aplicados a operandos de tipo char, byte y short. </li></ul></ul><ul><ul><ul><li>En estos casos se realiza la promoción numérica binaria y una conversión de estrechamiento implícita, para evitar el efecto secundario de modificar el valor del operando. </li></ul></ul></ul>
    42. 42. Ejemplo <ul><li>int x=0; x=x++; </li></ul><ul><ul><li>¿Resultado? x = ¿?; </li></ul></ul>
    43. 43. Expresiones Booleanas <ul><li>Las expresiones booleanas tienen tipos de datos boolean, y solo pueden ser evaluadas verdadero o falso. </li></ul><ul><li>Expresiones booleanas pueden ser utilizadas como condicionantes en instrucciones de control de flujo. </li></ul><ul><li>Expresiones booleanas pueden ser formadas usando: </li></ul><ul><ul><li>Operadores relacionales </li></ul></ul><ul><ul><li>Operadores de igualdad </li></ul></ul><ul><ul><li>Operadores lógicos </li></ul></ul><ul><ul><li>Operadores condicionales </li></ul></ul><ul><ul><li>Operadores de asignación </li></ul></ul>
    44. 44. Operadores Relacionales <, <=, >, >= <ul><li>Dado a y b que representan expresiones de valores numéricos, el operador relacional (en este caso comparación) se definen como muestra la siguiente tabla: </li></ul><ul><ul><li>a < b ¿a es menor a b? </li></ul></ul><ul><ul><li>a <= b ¿a es menor o igual a b? </li></ul></ul><ul><ul><li>a > b ¿a es mayor a b? </li></ul></ul><ul><ul><li>a >= b ¿a es mayor o igual a b? </li></ul></ul><ul><li>Todos los operadores relacionales son binarios y sus operandos son expresiones numéricas. </li></ul><ul><li>La promoción numérica binaria es aplicada a los operandos. </li></ul>
    45. 45. Operadores Relacionales Evaluación <ul><li>En la evaluación resulta un valor lógico. </li></ul><ul><li>Un operador relacional tiene menor precedencia que un operador aritmético, pero mayor precedencia que un operador de asignación. </li></ul><ul><li>Tienen asociatividad a la izquierda. </li></ul>
    46. 46. Igualdad (primitivos ==, !=) <ul><li>Dado a y b que representan valores de tipo de datos primitivos, la igualdad de los valores según el operador se definen como muestran: </li></ul><ul><ul><li>a == b ¿a es igual a b?, ¿tienen el mismo valor primitivo? </li></ul></ul><ul><ul><li>a != b ¿a es distinto a b?, ¿tienen distinto valor primitivo? </li></ul></ul><ul><li>Los operadores de igualdad == y != pueden ser usados para comparar valores de tipo de datos primitivos incluyendo a los boolean. </li></ul><ul><li>La promoción numérica binaria es aplicada a los operandos no lógicos. </li></ul>
    47. 47. Consideraciones <ul><li>Precaución con la comparación de números en coma flotante, ya que ciertos valores solo pueden ser almacenados como una aproximación finita de bits. </li></ul><ul><ul><li>Ejemplo: (1.0 – 2.0/3.0 == 1.0/3.0) retorna falso, aunque matemáticamente sea verdadero. </li></ul></ul><ul><li>Tienen asociatividad a la izquierda. </li></ul><ul><li>Pueden ser utilizados valores lógicos como operandos, pero en este caso ambos operandos deben ser del mismo tipo. </li></ul>
    48. 48. Igualdad de referencias de objetos <ul><li>Dado r y s variables de referencia, la igualdad esta dada por: </li></ul><ul><ul><li>r == s ¿a es igual a b?, ¿tienen el mismo valor de referencia? </li></ul></ul><ul><ul><li>r != s ¿a es distinto a b?, ¿tienen distinto valor de referencia? </li></ul></ul><ul><li>Los operadores de igualdad == y != pueden ser usados para comparar valores de referencia de manera de saber si representan al mismo objeto. </li></ul><ul><ul><li>No se considera el estado de los objetos. </li></ul></ul>
    49. 49. Condiciones <ul><li>Los operandos deben ser de un tipo compatible. </li></ul><ul><ul><li>Esto significa si es posible moldear uno con el otro, de otra manera se genera un error de compilación. </li></ul></ul><ul><li>Se puede asignar null a una referencia y por lo tanto también puede utilizarse null como operando. </li></ul>
    50. 50. Consideraciones <ul><li>La clase Object provee el método lógico equals(Object obj) el cual puede ser sobrescrito para dar un sentido semántico correcto a una comparación de igualdad (o desigualdad). </li></ul><ul><li>La implementación por defecto de este método utiliza el operador == </li></ul><ul><li>Ciertas clases del API estándar de Java sobrescriben el método equals como por ejemplo: String, BitSet, Date, etc. </li></ul>
    51. 51. Operadores Lógicos <ul><li>Los operadores lógicos lógicos pueden ser aplicados a operandos lógicos, retornan un nuevo valor lógico. </li></ul><ul><li>Los operadores ^, & y | pueden ser aplicados a enteros para realizar operaciones de complemento lógico. </li></ul><ul><li>Dado x e y que representan expresiones booleanas, los operadores lógicos lógicos se definen en la tabla siguiente: </li></ul><ul><li>Todos los operadores lógicos son binarios, ha excepción el operador de negación. </li></ul>
    52. 52. Operadores extendidos <ul><li>Asignación booleana lógica &=, ^=, |= </li></ul><ul><li>El operando de la izquierda debe ser una variable de tipo boolean. </li></ul><ul><li>A la derecha debe ser una expresión booleana. </li></ul><ul><li>Estos operadores son definidos en la tabla siguiente: </li></ul>
    53. 53. Operadores condicionales: &&, || <ul><li>Los operadores condicionales son muy parecidos a los operadores lógicos lógicos, excepto que en la evaluación se produce un corto circuito . </li></ul><ul><li>Ambos operadores condicionales son binarios y contrario a los operadores lógicos, solo pueden ser aplicados a expresiones booleanas. </li></ul><ul><ul><li>No existen operadores de asignación extendidos para los operadores condicionales. </li></ul></ul>
    54. 54. Operadores condicionales: &&, || <ul><li>Dado x e y expresiones de valores lógicos, los operadores condicionales se definen según la tabla siguiente: </li></ul>
    55. 55. Corto Circuito en la Evaluación <ul><li>En la evaluación de expresiones que involucren operadores condicionales AND ó OR, el operando de la izquierda es evaluado primero que el de la derecha y se produce un corto circuito en la evaluación. </li></ul><ul><ul><li>Es decir si la evaluación puede ser determinada por el operando de la izquierda, el operando de la derecha no es evaluado. </li></ul></ul>
    56. 56. Ejemplo <ul><li>boolean b = (4==2) && (1 < 4) //false </li></ul><ul><ul><li>En este caso como 4==2 es falso, y el operador es &&, no es necesario seguir evaluando la expresión ya que con certeza el resultado será falso. </li></ul></ul><ul><li>Lo mismo ocurre con el operador || (OR). </li></ul><ul><ul><li>Los operadores condicionales tienen menor precedencia que cualquier operador matemático o relacional, pero mayor que el de asignación. </li></ul></ul>
    57. 57. Representación de Enteros <ul><li>El tipo de datos entero en Java representa a valores positivos y negativos. </li></ul><ul><li>Java usa un complemento a dos para representar enteros. </li></ul><ul><li>Los Bits en un valor entero usualmente son ordenados desde la derecha a izquierda. </li></ul><ul><ul><li>Comienzan con el bit 0 (mas a la derecha) </li></ul></ul><ul><ul><li>El numero del bit mas significativo (es el bit de signo , el mas a la izquierda), cuando se aplican operadores a nivel de bits depende del tipo de entero es: </li></ul></ul><ul><ul><ul><li>31 para byte, short, char e int </li></ul></ul></ul><ul><ul><ul><li>61 para long </li></ul></ul></ul>
    58. 58. Representación Binaria <ul><li>Sumando 1 al valor máximo de int 2147483647 da como resultado el valor mínimo de int -2147483648. </li></ul><ul><li>Esto demuestra que no existe overflow ó underflow en los enteros. </li></ul><ul><li>Convirtiendo números binarios a decimales: </li></ul><ul><ul><li>101001 = 1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 </li></ul></ul><ul><ul><li>= 32 + 0 + 8 + 0 + 0 +1 </li></ul></ul><ul><ul><li>= 41 </li></ul></ul><ul><li>A decimal: </li></ul><ul><ul><li>41:2=20; 20:2=10; 10:2=5; 5:2=2; 2:2=1 </li></ul></ul><ul><ul><ul><li>1 0 0 1 0 1 </li></ul></ul></ul><ul><ul><li>101001 </li></ul></ul>
    59. 59. Calculando el Complemento a dos <ul><li>Dado un valor byte positivo 41, entonces la representación binaria es -41 y puede ser determinada de la siguiente manera: </li></ul><ul><li>De manera similar dado -41, entonces la representación binaria es 41 y puede ser determinada de la siguiente manera: </li></ul>
    60. 60. Operadores a nivel de bits <ul><li>Los operadores a nivel de bits binario manipulan cada valor individual correspondiente en los operandos. </li></ul><ul><li>La promoción numérica unaria es aplicada al operando del operador unario de complemento ~ </li></ul><ul><li>La promoción numérica binaria es aplicada a los operandos de los operadores a nivel de bits binarios </li></ul><ul><li>Ambas promociones dan como resultado un nuevo valor entero, que solo puede ser de tipo int ó long . </li></ul>
    61. 61. Operadores a nivel de bits <ul><li>Ejemplo: </li></ul><ul><ul><li>char v1 = ')'; // 41 </li></ul></ul><ul><ul><li>byte v2 = 13; </li></ul></ul><ul><ul><li>int result; </li></ul></ul><ul><ul><li>result = ~v1; // -42 </li></ul></ul><ul><ul><li>result = v1 & v2; // 9 </li></ul></ul><ul><ul><li>result = v1 | v2; // 45 </li></ul></ul><ul><ul><li>result = v1 ^ v2; // 36 </li></ul></ul>
    62. 62. Operadores extendidos &=, ^=, |= <ul><li>Estos operadores son definidos en la tabla siguiente: </li></ul>
    63. 63. Operadores de desplazamiento <ul><li>Los operadores de desplazamiento binario forman un nuevo valor desplazando bits hacia la izquierda o derecha un numero de veces dado un numero entero. </li></ul><ul><li>El numero de desplazamientos (distancia) es dado por el operando de la derecha. </li></ul><ul><li>El valor ha ser desplazado será el operando a la izquierda. </li></ul><ul><li>Una promoción numérica unaria es aplicada de manera individual a cada operando. </li></ul><ul><li>El valor retornado es promovido al tipo de dato del operador de la izquierda. </li></ul><ul><ul><li>El valor del operando (izquierda) no es alterado. </li></ul></ul>
    64. 64. Rangos de desplazamiento <ul><li>El numero de bits desplazados siempre esta en el rango: </li></ul><ul><li>Modulo de 32 para valores int </li></ul><ul><li>Modulo de 64 para valores long </li></ul><ul><li>Los operadores de desplazamiento de bits se definen la siguiente tabla: </li></ul>
    65. 65. El operador << <ul><li>Los bits son desplazados a la izquierda, y llenando con ceros a la derecha. </li></ul><ul><li>Ejemplo: </li></ul><ul><ul><li>int i = 12; </li></ul></ul><ul><ul><li>int result = i << 4; // 192 </li></ul></ul><ul><li>El desplazamiento se produce asi: </li></ul><ul><ul><li>i << 4; </li></ul></ul><ul><ul><li>= 0000 0000 0000 0000 0000 0000 0000 1100 << 4 </li></ul></ul><ul><ul><li>= 0000 0000 0000 0000 0000 0000 1100 0000 </li></ul></ul><ul><ul><li>= 0x000000c0 </li></ul></ul><ul><ul><li>= 192 </li></ul></ul>
    66. 66. Operador << <ul><li>Cada desplazamiento a la izquierda corresponde a la multiplicación del valor por 2 elevado al numero de desplazamientos. En el ejemplo anterior esto equivale a: 12 * 2^4 que es 192. </li></ul><ul><li>El bit de signo de un byte o short es extendido para llenar los bits superiores cuando el valor es promovido </li></ul>
    67. 67. Ejemplo <ul><li>byte b = -42; // 1101 0110 </li></ul><ul><li>int result = b << 4; // -672 </li></ul><ul><li>Los bits del byte una vez convertidos a int, y desplazados 4 lugares: </li></ul><ul><ul><li>b << 4 </li></ul></ul><ul><ul><li>= 1111 1111 1111 1111 1111 1111 1101 0110 << 4 </li></ul></ul><ul><ul><li>= 1111 1111 1111 1111 1111 1101 0110 0000 </li></ul></ul><ul><ul><li>= -672 </li></ul></ul>
    68. 68. Operador >> <ul><li>Todos los bits son desplazados a la derecha, el bit de signo es usado para llenar a la izquierda. </li></ul><ul><ul><li>Si el operando de la izquierda es positivo, se llenara con 0 a la izquierda. </li></ul></ul><ul><ul><li>Si el operando de la izquierda es negativo, se llenara con 1 a la derecha. </li></ul></ul><ul><li>Ejemplo: </li></ul><ul><ul><li>int i = 12; </li></ul></ul><ul><ul><li>int result = i >> 2; // 3 </li></ul></ul><ul><ul><li>El valor de i es desplazado a la derecha llenado con el signo 2 lugares: </li></ul></ul><ul><ul><ul><li>i >> 2; </li></ul></ul></ul><ul><ul><ul><li>= 0000 0000 0000 0000 0000 0000 0000 1100 >> 2 </li></ul></ul></ul><ul><ul><ul><li>= 0000 0000 0000 0000 0000 0000 0000 0011 </li></ul></ul></ul><ul><ul><ul><li>= 3 </li></ul></ul></ul>
    69. 69. Operador >>> <ul><li>Todos los bits son desplazados a la derecha, se rellena con 0 a la izquierda sin importar si el operando es positivo o negativo. </li></ul><ul><ul><li>Obviamente, para valores positivos el operador >> y >>> son equivalentes. </li></ul></ul><ul><li>Ejemplo: </li></ul><ul><li>byte b = -42; // 11010110 </li></ul><ul><li>int result = b >>> 4; // 268435453 </li></ul><ul><li>El valor del byte b, después de la promoción a int y llenado con 1 a la izquierda. </li></ul><ul><ul><li>b >>> 4 </li></ul></ul><ul><ul><li>= 1111 1111 1111 1111 1111 1111 1101 0110 >>> 4 </li></ul></ul><ul><ul><li>= 0000 1111 1111 1111 1111 1111 1111 1101 </li></ul></ul><ul><ul><li>= 268435453 </li></ul></ul>
    70. 70. Op. Extendidos >>=, >>=, >>>= <ul><li>Estos operadores son definidos en la tabla siguiente: </li></ul><ul><li>El resultado de -1 >> 1 es –1, y no 0. Esto difiere de la simple división por 2. Donde se puede pensar que la operación de desplazamiento redondea hacia abajo. </li></ul><ul><li>El resultado de 1 << 31 será el numero menor que puede ser representado. </li></ul><ul><li>Los números negativos son representados con la notación complementos a dos. </li></ul>
    71. 71. El operador condicional “? :” ternario: <ul><li>El operador ternario permite expresiones condicionales definidas. Y tiene la siguiente sintaxis: </li></ul><ul><ul><li><condición> ? <expresión 1> : <expresión 2> </li></ul></ul><ul><li>Si la expresión booleana <condición> es evaluada como verdadero, la expresión <expresión 1> es evaluada, si no la expresión <expresión 2> es evaluada. </li></ul><ul><ul><li><expresión 1> y <expresión 2> deben ser de tipos compatibles. </li></ul></ul><ul><li>Ejemplo: </li></ul><ul><ul><li>boolean bisiesto = false; </li></ul></ul><ul><ul><li>int diasEnFebrero = bisiesto ? 29 : 28; // 28 </li></ul></ul><ul><ul><ul><li>Este operador es equivalente a if – else </li></ul></ul></ul>
    72. 72. Otros operadores: new, [], instanceof <ul><li>El operador new es usado para crear objetos, por ejemplo instancias de clases y arreglos. </li></ul><ul><li>El operador [] es usado para construir y declarar arreglos, y para acceder a elementos para un arreglo. </li></ul><ul><li>El operador lógico instanceof es utilizado para comprobar el tipo de un objeto. </li></ul><ul><ul><li>Es un operador binario, el operando de la izquierda (Un objeto) se comprobara si es instancia del operando de la derecha (Una clase). </li></ul></ul>
    73. 73. Ejemplo <ul><li>if (miString instanceof String) </li></ul><ul><li>Se comprueba el objeto que denota la referencia, por lo tanto si miString==null, no se considera instancia, por lo tanto no hace un chequeo de tipos, si no una comprobación de si un objeto es instancia de una clase determinada o hereda o implementa una interfaz. </li></ul>
    74. 74. Paso de Parámetros <ul><li>Los objetos se comunican a través de mensajes </li></ul><ul><li>Los mensajes son implementados como un llamado a un método de un objeto </li></ul><ul><li>Los métodos estáticos pueden ser invocados directamente sobre una clase </li></ul><ul><li>Los parámetros en la llamada del método proveen un mecanismo para intercambiar información entre el objeto “llamador” y el “llamado” </li></ul>
    75. 75. Sintaxis <ul><li>La sintaxis para llamar un método puede ser cualquiera de estas: </li></ul><ul><ul><li><referencia de objeto>.<nombre del método> (<lista actual de parámetros>) </li></ul></ul><ul><ul><li><nombre de clase>.<nombre del método estático> (<lista actual de parámetros>) </li></ul></ul><ul><ul><li><nombre del método> (<lista de parámetros>) </li></ul></ul>
    76. 76. Paso de Parámetros <ul><li>Si el objeto llamador y el llamado son el mismo, <referencia de objeto> puede ser omitido. </li></ul><ul><li>El operador punto “.” tiene asociatividad a la izquierda, por ejemplo: </li></ul><ul><ul><li>unObjeto.hacer1().hacer2().hacer3(); </li></ul></ul><ul><ul><ul><li>La primera llamada hacer1() retorna un objeto sobre el cual se ejecutara el método hacer2(), y así sucesivamente. </li></ul></ul></ul><ul><li>Los parámetros actuales son parámetros que serán pasados al método cuando este sea invocado y pueden variar en cada llamada. </li></ul><ul><li>Las lista de parámetros formales definidos en la definición del método, son locales para el método. </li></ul>
    77. 77. Paso de Parámetros <ul><li>Las listas de parámetros Actual y Formal deben ser compatibles: </li></ul><ul><ul><li>El numero de parámetros deben ser iguales </li></ul></ul><ul><ul><li>La correspondencia individual de los parámetros actual y formal deben ser de tipo compatible. </li></ul></ul><ul><li>En Java todos los parámetros son pasados por valor, sin embargo al pasae una referencia a un objeto podemos realizar cambios en dicha referencia. </li></ul><ul><ul><li>Un ejemplo de esto son los arreglos (que de hecho son objetos) no podremos realizar cambio al arreglo en si (como asignarle un nuevo arreglo), pero podemos cambiar el valor de alguno de sus elementos. </li></ul></ul>
    78. 78. Pasando valores primitivos <ul><li>Cuando un parámetro actual es una variable de tipo primitivo, el valor de la variable es copiado al parámetro formal en el momento de la invocación. </li></ul><ul><li>Como el parámetro formal es local en el método, cualquier cambio no se reflejara en el parámetro actual. </li></ul><ul><li>El parámetro actual puede ser una expresión que puede ser evaluada y el resultado será pasado al método. </li></ul><ul><li>Conversiones de tipo entre los parámetros actual y formal de tipos de datos primitivos es similar a la conversión de asignación numérica. </li></ul><ul><li>Conversiones de ensanchamiento son aplicadas implícitamente. </li></ul>
    79. 79. Pasando valores de referencia <ul><li>Si un parámetro actual es una referencia a un objeto, entonces un valor de referencia de un objeto es pasado. </li></ul><ul><li>En este caso el parámetro actual y formal son como “alias” al mismo objeto. </li></ul><ul><li>Por lo tanto los cambios realizados dentro del método son reflejados en el objeto una vez finalizado el método. </li></ul><ul><li>Pero solo es posible cambiar el “estado” del objeto y NO el valor de referencia. </li></ul><ul><li>Nota: Los arreglos son objetos. </li></ul>
    80. 80. Parámetros formales finales <ul><li>Un parámetro formal puede declararse final anteponiendo la palabra final en la declaración. </li></ul><ul><ul><li>Un parámetro final, es una variable que no puede ser cambiada. </li></ul></ul><ul><ul><li>Son constantes que pueden ser utilizadas por razones de rendimiento. </li></ul></ul>
    81. 81. Conversiones “Boxing” <ul><li>Desde el tipo boolean al tipo Boolean </li></ul><ul><li>Desde el tipo byte al tipo Byte </li></ul><ul><li>Desde el tipo char al tipo Character </li></ul><ul><li>Desde el tipo short al tipo Short </li></ul><ul><li>Desde el tipo int al tipo Integer </li></ul><ul><li>Desde el tipo long al tipo Long </li></ul><ul><li>Desde el tipo float al tipo Float </li></ul><ul><li>Desde el tipo double al tipo Double </li></ul>
    82. 82. Como funciona? <ul><li>Si p es un valor de tipo boolean, entonces la conversion boxing convierte p en una referencia r de la clase Boolean, de manera que: </li></ul><ul><ul><li>r.booleanValue() == p </li></ul></ul><ul><li>Si p es de un valor de tipo byte, entonces la conversion boxing convierte p en una referencia r de la clase Byte, de manera que: </li></ul><ul><ul><li>r.byteValue() == p </li></ul></ul><ul><li>Si p es un valor de tipo char, entonces la conversion boxing convierte p en una referencia r de la clase Character, de manera que: </li></ul><ul><ul><li>r.charValue() == p </li></ul></ul><ul><li>Si p es un valor de tipo short, entonces la conversion boxing convierte p en una referencia r de la clase Short, de manera que: </li></ul><ul><ul><li>r.shortValue() == p </li></ul></ul>
    83. 83. Como funciona? <ul><li>Si p de un valor de tipo int, entonces la conversion boxing convierte p en una refrencia r de la clase Integer, de manera que: </li></ul><ul><ul><li>r.intValue() == p </li></ul></ul><ul><li>Si p es de un valor de tipo long, entonces la conversion boxing convierte p en una referencia r de clase Long, de manera que : </li></ul><ul><ul><li>r.longValue() == p </li></ul></ul><ul><li>Si p es de valor de tipo float entonces: </li></ul><ul><ul><li>Si p no es NaN, entonces la conversion boxing convierte p en una referencia r de clase Float, de manera que: </li></ul></ul><ul><ul><ul><li>r.floatValue() se evaluá a p </li></ul></ul></ul><ul><ul><li>De otro modo, la conversion boxing convierte p en una referencia r de clase Float de manera que: </li></ul></ul><ul><ul><ul><li>r.isNaN() es evaluado como true. </li></ul></ul></ul>
    84. 84. Como funciona? <ul><li>Si p es de un valor tipo double, entonces Si p no es NaN, la conversion boxing convierte p en una referencia r de la clase Double, de manera que: </li></ul><ul><ul><li>r.doubleValue() evaluates to p </li></ul></ul><ul><ul><li>De otro modo, la conversion boxing convierte p en una referencia r de la clase Double de manera que: </li></ul></ul><ul><ul><ul><li>r.isNaN() es evaluado como true. </li></ul></ul></ul><ul><li>Si p es un valor de cualquier otro tipo, la conversion boxing es equivalente a la conversion de de identidad </li></ul>
    85. 85. Cuidado <ul><li>Si el valor de p fue “transformada” a true, false, byte, char entre u0000 a u007f, ó un int ó short entre -128 y 127, </li></ul><ul><li>Entonces r1 y r2 sean resultado de cualquier conversión boxing de p siempre seran r1 == r2. </li></ul>
    86. 86. Unboxing <ul><li>Desde el tipo Boolean al tipo boolean </li></ul><ul><li>Desde el tipo Byte al tipo byte </li></ul><ul><li>Desde el tipo Character al tipo char </li></ul><ul><li>Desde el tipo Short al tipo short </li></ul><ul><li>Desde el tipo Integer al tipo int </li></ul><ul><li>Desde el tipo Long al tipo long </li></ul><ul><li>Desde el tipo Float al tipo float </li></ul><ul><li>Desde el tipo Double al tipo double </li></ul>
    87. 87. Como funciona? <ul><li>Si r es una referencia de tipo Boolean, entonces la conversion unboxing convierte r en: r.booleanValue() </li></ul><ul><li>Si r es una referencia de tipo Byte, entonces la conversion unboxing convierte r en: r.byteValue() </li></ul><ul><li>Si r es una referencia de tipo Character, entonces la conversion unboxing convierte r en: r.charValue() </li></ul><ul><li>Si r es una referencia de tipo Short, entonces la conversion unboxing convierte r en: r.shortValue() </li></ul><ul><li>Si r es una referencia de tipo Integer, entonces la conversion unboxing convierte r en: r.intValue() </li></ul>

    ×