viernes, 1 de agosto de 2008

Tips para el SCJP V

Primero hablemos de como se representan en Java los diferentes tipos primitivos y los objetos. Después tenemos el tema de como trabaja Java el paso de parámetros por referencia, pero no como C o C++ lo cual es muy importante entender.

Representaciones de números y valores

  1. Existen tres formas de representar números enteros en Java, decimal (base 10), octal (base 8 ) y hexadecimal (base 16).
  2. Los números octales solo usan números del 0 al 7. En Java se representan colocando un cero al inicio del número. Ejemplo :070
  3. Los números hexadecimales pueden usar 16 símbolos para ser construidos: 0 1 2 3 4 5 6 7 8 9 a b c d e f .Java acepta las letras en mayúsculas o minúsculas (uno de los pocos lugares donde no hace esta distinción). Su prefijo es 0x. Ejemplo 0xAAF453ab.
  4. Los números de punto flotante se definen como un número, un punto y más números que representan una fracción.
  5. Los valores booleanos sólo puede ser definido como true o false. En Java no es válido usar números para representar valores de true o false.
  6. Un char se representa como un carácter entre (‘) comillas simples.
  7. Una referencia a un objeto es eso –una referencia variable. Es un espacio para guardar bits que representar una forma de llegar al objeto.
  8. El resultado de una expresión que involucra algo de tamaño int o más pequeño será un int. En otras palabras, suma dos bytes y obtienes un int. Multiplica un int y un short y el resultado será un int, divide un short por un byte y el resultado será un int…etc
  9. Si tratamos de asignar la suma de dos bytes a un byte aun cuando el resultado sea pequeño para que pueda ocupar un byte al compilador no le importará. El conoce la regla mencionada de expresiones y que el resultado será un int. Por ello para que funcione sin problemas debemos hacer un cast explícito.
  10. Todos los números de punto flotante son por default doubles (64 bits) no son float.
  11. En Java podemos acortar o recortar una primitiva, y cuando esto sucede se recortan o truncan los bits de mayor orden. En otras palabras, se pierden todos los bits de la izquierda que no quepan.
  12. Los operadores +=, -=, *=, /= realizan un cast implícito y no siguen la regla del int. Es decir podemos sumar dos bytes usando += y guardar el resultado en un byte sin problemas.
  13. Cuando igualamos referencias de primitivas lo que se hace es copiar el valor. Por ello los cambios que hagamos después no afectan al otro valor
int a = 10; // Asignar un valor a a
int b = a;
b = 30;
Aquí a tendrá el valor de 10 y b el valor de 30.

Alcance de las variables.
Existen 4 ambientes distintos
  • 1. Las variables static tienen el alcanza más grande. Son creadas cuando la clase es cargada y sobreviven todo el tiempo que la clase permanezca cargada en la JVM
  • 2. Las variables de instancia son creadas cuando una nueva instancia se crea y son removidas cuando esa instancia muere.
  • 3. Las variables locales viven mientras el método permanezca en la pila.
  • 4. Las variables de bloque, viven solamente cuando ese bloque se esta ejecutando.
Valores por Default de tipos primitivos
Tipo de la variable Valor por default
Referencia a objeto null (no referencia a ningún objeto)
byte, short, int, long 0
float, double 0.0
Boolean false
char '\u0000'

Otros
  1. Los elementos de un arreglo siempre son inicializados con valores por default, sin importar donde sean declarados o instanciados.
  2. Las variables locales, incluyendo las primitivas, siempre deben ser inicializadas antes de usarlas. Java nos les da valores por default, deben ser explícitamente iniciadas con algún valor.
  3. El compilador no puede decir siempre si una variable local ha sido inicializada antes de su uso. Por ejemplo en bloques condicionales (if) un bloque puede que nunca sea accesado pero el compilador no lo sabrá así que habrá que iniciar una variable que se encuentre ahí, aun cuando nunca sea usada.
  4. Las refencias de instancia siempre son iniciadas a null, a menos que explícitamente se diga otra cosa. Pero las referencias locales no tiene valores iniciales, es decir no son null.
Copiar valores o referencias
  1. Con variables primitivas la asignación de una variable a otra significa que el contenido (el patrón de bits) será copiado de una variable a otra. Las referencias de objetos funcionan de la misma manera. El contenido de una referencia es un patrón de bits y si se asigna a una referencia a el valor de la referencia v, el patrón de bits de a es copiado en b. Así que las dos referencias tendrán el mismo patrón, este patrón es el que refiere a un objeto en el heap.
  2. Es necesario comprender que sucede cuando se usa una referencia para modificar un String
  • Una nueva String es creada, dejando el objeto String original intacto. Y
  • La referencia usada para modificar el String (o el construir una nueva referencia) es asignada al nuevo objeto String.
  1. Cuando pasas un objeto a un método debes de recordar que estás pasado una referencia a ese objeto, no estas pasando el objeto en sí. Y aun más importante es saber que estas pasando una copia de la referencia original. Es decir, ambos el que llama y el método llamado tienen idénticas copias de la referencia, y por lo tanto ambos se refieren al mismo objeto (no a una copia) en el heap.
  2. Entonces ¿Podemos decir que java pasa objetos por referencia? NO. Lo que realmente hace Java es que, ya sea una primitiva o un objeto estas pasando una copia de los bits que representan un valor.

No hay comentarios: