SlideShare una empresa de Scribd logo
1 de 96
Realizado por: Raúl Ernesto Triviño Alvarado




    Capítulo 3 - Asignaciones
Cubre los objetivos:
1.3 Develop code that declares, initializes, and uses primitives, arrays, enums, and objects as static, instance,
and local variables. Also, use legal identifiers for variable names.
7.6 Write code that correctly applies the appropriate operators including assignment operators (limited to: =,
+=, -=)...
   Literales enteros:
     Se dividen en tres tipos: decimales, octales y
      Hexadecimales
Decimales             Octales                               Hexadecimales
Son los números       Son los números con base 8.           Son los números con base
normales, que están                                         15.
en base 1o.           Los valores válidos van de 0 a 7
                                                            Los valores válidos van de
Se representan de     Se representan anteponiendo           0 a 9 y de A hasta F
una notación normal   un 0
                                                            Se representan colcando
int length = 343;     int six = 06; // Equal to decimal 6   un valor 0x
                      int seven = 07; // Equal to decimal
                      7
                      int eight = 010; // Equal to          int x = 0X0001;
                      decimal 8                             int y = 0x7fffffff;
                      int nine = 011; // Equal to decimal
                                                            int z = 0xDeadCafe;
                      9
   Literales de punto flotante
     Los flotantes pueden ser de dos tipos, los float o los
      double, los float miden 32 bytes y los double miden 64
      bytes.
Float                                     Double
Miden 32 bytes                            Miden 64 bytes
Se define colocando al final una F, es    Se define colocando una D al final, es
obligatorio de lo contrario puede haber   opcional.
error de compilador por perdida de
precisión
float f = 23.467890; // Compiler          double d = 110599.995011D; //
error, possible loss                      Optional, not required
// of precision                           double g = 987.897; // No 'D' suffix,
float g = 49837849.029847F; // OK; has    but OK because the
the suffix "F"                            // literal is a double by default
   Caracteres:
     Las variables primitivas que responden a los literales son los char,
      estos se representan con una carácter encerrado entre comillas
      simples.
     También se definen como el valor unicode con el valor encerrado entre
      comillas simples y precedido con u.
     Por último también se pueden poner valores enteros pero siempre y
      cuando quepan en un tamaño de 16 bits, es decir hasta 65535 en
      valores decimales.

                         char letterN = 'u004E'; // The letter 'N'


    char a = 'a';
    char b = '@';        char a = 0x892;       // hexadecimal literal
                         char b = 982;         // int literal
                         char c = (char)70000; // The cast is required; 70000 is out of char
                                               // range
   Asignación de primitivos
     La asignación es sencilla, se hace por medio del símbolo igual (=).
     El punto donde toca tener cuidado es con el tamaño de las variables.
      Por ejemplo sumar dos enteros y asignarlo a un entero no tiene lío




     Pero sumar dos bytes y asignarlo a un byte si tiene problema, la suma
      de dos bytes siempre dan un resultado mayor de 8 bytes, y por lo
      tanto toca hacer un casteo explicito, o asignarlo a un entero
 Como se vio en el capitulo pasado existen dos tipos de
  casteo (explicito e implícito).
 El implícito se hace cuando una variable de tamaño menor
  se asigna a un caso mayor.
 En caso del explicito aplica en el caso que una variable de
  tamaño menor se asigna a una menor, en este caso toca
  tener cuidado porque por lo general hay una posible
  perdida de precisión del valor.


       Casteo implícito                  Casteo explícityo
The byte es 56
   El punto importante aquí es que siempre el
    compilador trata de asignar las variables de
    punto flotante a una variable double, que tiene
    64 bytes de espacio, por lo tanto si se desea
    asignar el valor a una variable float, que tiene 16
    bytes de espacio, toca hacer un casteo explícito.

       No compila          Si compila
                           float f = (float) 32.3;
       float f = 32.3;     float g = 32.3f;
                           float h = 32.3F;
   Cuando se asigna el valor de una variable primitiva a
    otra, lo que se hace es que en el espacio de memoria
    de una variable se copia el valor a el espacio de
    memoria de la segunda, pero siguen siendo
    independientes.
                                           a = 10
                                        a = 10 b = 10
                                        a = 10 b = 30



    a = 10
    a = 10 after change to b
   La asignación de variables de referencia aplica a
    los mismos principios de casteo (explícito e
    implicito), la diferencia que se da es en la cadena
    de herencia que existe entre los objetos.
                              Se puede hacer sin problema porque
                                      Bar es hijo de Foo

                              No se puede hacer porque Foo es hijo
                              de Bar, arroja un error de compilación
   Las variables ya sean primitivas u objetos tienen un
    alcance dentro de la clase, y esta depende de donde
    se creo.
                          Una variable estática tiene un alcance de toda la clase, son creadas cuando la clase se
                         esta cargando, inclusive antes de la construcción, y vive mientras esta arriba la máquina
                                                               virtual de Java


                              Una variable de instancia se crea cuando se crea la clase, es decir después del
                                                constructor, y vive mientras la clase vive.


                         Una variable de bloque se crea y se mantiene viva mientras se ejecuta el bloque al que
                                                              pertenece.


                         Una variable local es aquella que se mantiene viva mientras el método se encuentra en
                                                               ejecución
   Tratar de acceder una variable de instancia de
    una clase desde un contexto de un bloque
    estático como un main.
                                             La variable x, es una variable de
                                           instancia, no puede ser accedida por
                                                    un bloque estático



   Tratar de que un método use una variable local
    de un método distinto

                              La variable del método go2 y no puede acceder a la
                                variable del método go, son métodos distintos
   Tratar de usar una variable de bloque después
    de que se terminó de ejecutar el bloque

                                La variable test no puede
                               acceder a la variable test del
                                        bloque for
   Al momento de crear una variable no es
    necesaria inicializarla, entonces el compilador
    le asigna un valor por defecto, estos valores
    son:
El compilador inicializa la variable en 0
                                                                    year = 0




El valor de year nunca cambia en la ejecución del ejemplo, por lo tanto escribirá:

                                  The year is 0
   Los objetos se inicializan con null, pues al no asignarle
    un objeto queda el espacio de memoria que
    corresponde al objeto apuntando a nada. Por ejemplo
                                       String es un objeto, por lo tanto title queda
                                                  apuntando a la nada.
                                                     title = null



                                                        s = null


                                             Error de ejecución,
                                     nullPointerException, no se puede
                                       pasar a minúscula nada o nulo
   Los array son colecciones de un tipo de variable, y
    pueda que se haya inicializado el array como tal, pero
    los objetos contenidos en esta colección no están
    inicializados, entonces lo más seguro es que el
    compilador les coloque el tipo de valor por defecto.
                                          Se ha inicializado el array
                                          de 100 enteros




                                Se obtiene una lista de 100 veces 0
   Las primitivas locales se caracterizan que no se pueden usar son
    antes inicializarse, en caso contrario arrojará error de compilación.
                                                      Error de compilación
                                                      porque year no esta
                                                      inicializado

year se inicializó
explícitamente, por lo
tanto corre sin problemas



                                     No se puede determinar, pues los valores de
                                     args no siempre se llenan, si no se llenan
                                     entonces arroja error de compilación,
                                     en caso contrario funciona sin problemas
   Aquí se presenta el mismo principio que con las
    primitivas, para poder usarlo es necesario tener
    una inicialización explicita, así sea ponerle null,
    pero debe ser explicito.
                                 Aquí hay un error de compilación,
                                 en este caso no se inicializó
                                 explícitamente la variable date,
                                 entonces al usarla se estalla. Para
                                 solucionarlo se debe usar la siguiente
                                 Línea:

                                           Date date = null;
   Con los arrays el cuento es diferente, como
    un array es un objeto entonces toca
    inicializarlo, pero no es necesario inicializar
    cada uno de los valores del array, pues al
    momento de inicializar el array se les coloca
    automáticamente el valor por defecto.
   Cuando se asigna un objeto de referencia a otro hay que tener en
     cuenta que los objetos en realidad apuntan a un espacio de
     memoria dentro de la máquina, por lo tanto el comportamiento de
     estos es diferente a una variable primitiva.
                                                                Dimension
                                                a
                                                                Weight = 5
                                                                Height = 10



                                               a.height = 10

                                                                Dimension
                                                a
                                                                Weight = 5
                                                                Height = 10
                                                b
                                                                Dimension
Aunque se cambia el valor                       a
                                                                Weight = 5
del atributo en el objeto b,                                    Height = 30
                                                b
también cambia en a, porque a y b
apuntan al mismo espacio de memoria            a.height = 30 after change to b
   Existe un caso especial como el siguiente:

                                                                       String
                                                        y
                                                                       Java
                                                        x

                                                           y string = Java
                                                                      String
                                                       y              Java
La excepción de la regla de la diapositiva
                                                                        String
anterior es el objeto String, cuando uno
maneja un objeto String se habilita un pool             x             Java Bean

de Strings, el sistema cada vez que se
modifica una cadena el sistema crea un                  y string = Java
String nuevo y lo asigna a la variable
Correspondiente, por lo tanto aunque no se ve, en realidad el sistema empieza a usar dos
objetos distintos al cambiar el valor del String
Cubre el objetivo:
7.3 Determine the effect upon object references and primitive values when they are passed into methods that
perform assignments or other modifying operations on the parameters.
Dimension
                                                                              Weight = 5
                                                               d              Height = 10




                                                              Before modify() d.height = 10


                                                              After modify() d.height = 10


                                                                              Dimension
                                                             dim              Weight = 5
                                                                              Height =11

                                                               d

En el caso de paso de objetos de referencia,                  After modify() d.height = 10
se aplica el principio del manejo de paso de objetos de
referencia, cuando se pasa un objeto de referencia al método, el objeto que entra al método
apunta también al mismo espacio de memoria del objeto original, por lo tanto cualquier
cambio que se haga en el método afecta al objeto original también.
   Al momento de pasar los objetos al método hay que tener en cuenta que
    lo que el sistema hace es pasar una copia del objeto, no el objeto como
    tal, eso implica que al ser una copia, si se reasigna la variable del objeto
    en el método a otro objeto, pues el objeto original se mantiene igual.
                                                                    Foo

                                                                   Name = “”
                                                        f

                                                                     Foo
                                                    f               Name
                                                                    =“Boo”

                                                    g
                                                                    Foo
                                                        f           Name =
                                                                     “Boo”

                                                                   Foo
                                                        g         Name = “”
   Aquí se hace lo mismo que con los objetos de referencia, se pasa
    es una copia de la variable, pero como son primitivas pues no se
    maneja el concepto de apuntador al mismo espacio de memoria, si
    no simplemente se copia el valor, por lo tanto todos los cambios
    en el método de esta variable no afectan la variable original.

                                                    a=1
                                             Before modify() a = 1


                                              After modify() a = 1
                                                   a=1
                                                 number = 2
                                                   number = 2
Cubre el objetivo
1.3 Develop code that declares, initializes, and uses primitives, arrays, enums, and objects as static, instance,
and local variables. Also, use legal identifiers for variable names.
 Un array puede ser de tipo primitiva o de una clase en
  específica.
 Para declararla se necesita declarar la restricción de
  acceso, el tipo de variable que va a contener el array, un
  nombre y comillas cuadradas.
 Es importante anotar que en este punto no se declara el
  tamaño del array.
 Las comillas cuadradas pueden ir antes o después del
  nombre del array.

     Array de                                                       Array mal
                  Array de objetos     Array multidimensional
    primitivas                                                      declarado
    int[] key;    Thread[] threads;   String[][][] occupantName;   int[5] scores;
    int key [];   Thread threads[];   String[] ManagerName [];
   La construcción a diferencia de la declaración si lleva el tamaño del
    array, la construcción se hace así:



 int[] testScores;
 testScores = new int[4];




La imagen anterior evidencia varias cosas, primero el sistema ve el array como un objeto
compuesto de varios objetos, segundo cada una de la posiciones tiene un índice y este
empieza desde 0, y cada uno de las posiciones tiene una variable del tipo que se declaró
el arreglo, esto significa que no es posible tener variables de diferente tipo, a menos que
se maneje herencia.
   Los arrays multidimensionales se construyen
    indicando solamente la cantidad de posiciones de la
    primera dimensión, las otras se dejan en blanco, tal
    como se ve a continuación




Aquí se puede observar que en la sección amarilla se declaró un array de 3 posiciones,
pero multidimensional, luego se toman las posiciones 0 y 1 y se declaran de nuevo un array
de 2posiciones, y otro de 3 posiciones. El compilador de java entoces ve un objeto
compuesto de 3 objetos Arrays de tipo int, que a su vez estan compuestos de 2 arrays para
el de la posición 0, uno de 3 en la posición 1, y nada para la posición 2 porque no se ha
declarado
   Cuando uno construye un array, java le asigna automáticamente
    los valores por defecto a los elementos del array, en el caso de los
    objetos les coloca null, si es una primitiva númerica 0, y si es un
    boolean false.
   Si uno desea asignarles un valor diferente entonces lo que se debe
    hacer es inicializar manualmente cada uno de los elementos, ya
    sea específicamente sobre una posición, o recorriendo el array por
    medio de una sentencia for.




        Asignación uno a uno,                 Asignación en un ciclo,
       no es muy recomendable                     recomendable
   Es posible que en el examen de certificación
      salga un tema relacionado con este tópico,
      puesto que es una forma de inicialización muy
      poco común, pero igual legal y funcional
   Dog[] myDogs = {puppy, new Dog("Clover"), new Dog("Aiko")};

Tipo objeto   Llave cuadrada   nombre   Declaración directa de los elementos del array
   Un array anónimo es cuando se contruye y se inicializa
    un array al mismo tiempo y se asigna a un array ya
    declarado, al igual que la diapositiva pasada, no es
    muy común, pero igual es válido y funciona.

                                         Declaro el array




                                Le asigno los valores al
     Construyo el array                 array
       Con el manejo de las variables primitivas en un array se maneja el
        mismo principio que se maneja en la asignación de variables, se
        pueden pasar variables con casteo implícito si la variable a asignar
        es más pequeña que la del array, y si no es así se debe manejar
        casteo explícito con el riesgo que halla perdida de presición, si es
        un array de booleanos solo se puede asignar true o false.




        Si en el ejemplo anterior deseamos asignar una variable long toca
         hacer el casteo explícito con todos los riesgos que esto implica
   La asignación de valores de un array una vez más continua
    con los mismos lineamientos que se presentan en la
    asignación normal, los objetos asignados deben heredar o
    implementar el tipo del array.

                                       Compila sin problema porque
                                        Ferrari implementa Sporty
                                       Compila sin problema porque
                                      RacingPlate implementa Sporty

                                      No compila porque GolfClub no
                                           implementa Sporty
   Cuando uno va a asignar un array de un valor a
    otro, entonces hay que tener en cuenta se puede
    asignar un array a otro siempre y cuando tengan
    el mismo tipo, y no importa el tamaño de los
    arrays.
                              Compila sin problema array tipo
                                int cuadra con array tipo int

                              No compila sin problema array tipo
                               int no cuadra con array tipo char
   Para los arrays de objetos de referencia la cosa cambia,
    resulta que en este caso si maneja herencia, se puede
    asignar a un array de una clase padre un array de clase
    hijo, pero cuidado no se puede hacer de ninguna forma lo
    contrario, es decir a un array clase hijo, asignarle un array
    clase padre. Aquí se cumplen los principios vistos en la
    sección de que un objeto “es un”
                                         Compila sin problema porque
                                              Honda es un Car




                                        No compila sin problema porque
                                              beers no es un Car
   Aquí hay que tener presente que un array multidimensional no puede ser
       asignado a un array unidimensional y que un array no puede asignarsele una
       variable que no sea array. Ojo no es que arroje error de compilación si no
       excepción, classCastException
                                                 A. myCats = myCats[0]; Este caso es
                                                 error, porque myCats es un array
                                                 multidimensional, no se le puede asignar un
                                                 Array unidimensional.

                                                C. myCats[1] = myCats[1][2]; tampoco se
                                                puede, si no se le puede asignar a un array
                                                multidimensional un array unidimensional,
                                                pues tampoco se puede hacer lo contrario.

B. myCats = myCats[0][0]; Tampoco se          D. myCats[0][1] = moreCats; No se puede,
puede, porque lo que hay en la posición 0,    porque si no se le puede asiganar a un array
es un objeto tipo Cat, y un objeto no se      un objeto, tampoco se puede hacer lo
puede asignar a un array                      contrario
    Tratar de acceder a una posición del array que esta más allá del tamaño
     de este, esto genera una excepción ArrayIndexOutOfBoundsException
                                                                                    Aunque compila sin problemas sale una excepción,
                                                                                     la posición 5 no existe, las posiciones van de 0 a 4



   Buscar una posición con valor negativo, las posiciones negativas no
    existen.
    Compila y sin error, pero arroja error de excepción, no
     existe una posición negativa en el mundo del array


   Declarar en un array anónimo o en el array de una línea el tamaño del
    array




                                           No se pueden tener el tamaño del array porque estamos
                                                         en la declaración del array
   Los bloques de inicialización son segmentos de código
    encerrados entre corchetes, no son métodos porque no
    tienen la firma de declaración, y estos corren por el
    compilador después de ejecutar el constructor de la clase.
   Entonces el orden de ejecución es primero los bloques
    marcados como static, luego el bloque, luego el
    contructor de la clase , y luego los diferentes métodos que
    se van llamando.
   Los bloques se diferencian de los bloques estáticos en que
    los primeros se ejecutan cada vez que se crea un objeto de
    la clase, mientras que los segundos solo una vez, que es la
    primera vez que se crea un objeto de la clase.
1st static init
                                                               2nd static init
                                                               1st instance init
                                                               2nd instance init
                                                               no-arg const
                                                               1st instance init
                                                               2nd instance init
                                                               1-arg const


Recuerde el orden de ejecución es:

                       Static -> bloques -> Constructor

Los métodos estáticos solo se corren una vez, los bloques y los constructores
cada vez que se crea un objeto.
Cubre el objetivo
3.1 Develop code that uses the primitive wrapper classes (such as Boolean, Character, Double, Integer, etc.), and/or
autoboxing & unboxing. Discuss the differences between the String, StringBuilder, and StringBuffer classes.
   Una clase wrapper es una clase que se encarga de envolver una variable
    primitiva.
   El objetivo de estas clases es permitirle a una variable primitiva realizar
    operaciones más complejas como conversiones, asignaciones y
    asignarlas en arreglos y colecciones.
   Los wrapper son:
   Todos los wrappers a excepción de Character, tienen dos
    constructores, uno que toma una variable primitiva del tipo
    construido y otra que toma una representación String del tipo del
    wrapper
           Integer i1 = new Integer(42);             Float f1 = new Float(3.14f);
           Integer i2 = new Integer("42");           Float f2 = new Float("3.14f");

   Para Character, solo se tiene uno que toma el valor de un char
    como argumento
                                   Character c1 = new Character('c');


   En el caso de los booleanos también aplica el primer principio,
    tiene dos constructores, uno que toma true o false, y otro que
    toma un String con estos valores
                                  Boolean b1 = new Boolean("false");
                                  Boolean b2 = new Boolean(false);
   El método valueOf(), es un método estático que permite tomar un
    valor de una cadena y transformarlo al valor del wrapper.
   Existen dos especificaciones de este método, uno que toma el
    valor del wrapper solamente y hace la conversión, y otra que tiene
    dos parámetros que es el string del valor, y la especificación de la
    base a la que se debe convertir.

          Float f2 = Float.valueOf("3.14f");                       f2 = 3.14




           i2 = 101011                         Integer i2 = Integer.valueOf("101011", 2);
   El método xxxValue(), sirve para poder tomar el valor
    de un wrapper numérico y pasarlo a otro tipo de
    variable numérica.
   Cada una de las 6 clases de wrapper numéricas tiene 6
    métodos que permiten pasar el valor a los otros tipos
    de variable.

                                     Paso del valor 42 a byte


                                    Paso del valor 42 a short


                                    Paso del valor 42 a double
   Estos dos métodos están fuertemente relacionados pues ambos
    pueden tomar un valor String como parámetro de entrada y si el
    String está mal formado, pues en ejecución arroja una excepción
    tipo NumberFormatException, pero se diferencian en:

     El método parseXxx() retorna una primitiva.
     El método valueOf() retorna un wrapper del tipo que invoca el
      método.

                                                El método parseXxx(), retorna
                                                        una primitiva


                                               El método valueOf, retorna un
                                                         wrapper
   El método toString() sirve para pasar el valor
    contenido en cualquier wrapper a una cadena
    string.
      Double d = new Double("3.14");
      System.out.println("d = "+ d.toString() ); // result is d = 3.14


   Existe además un método especial para los
    wrapper Integer y Long, los cuales se les puede
    hace un ajuste de la escala, es decir pasarlo a
    base 10, 2, 16 u 8
                String s = "hex = "+ Long.toString(254,16); // s = "hex = fe"
   Los wrapper Integer y Long vienen por
    defecto en base 10, también se puede hacer
    una conversión de base usando estos
    métodos
    Boxing es una propiedad de los wrapper que apareció
     desde la versión 5 de java, la cual permite manipular
     directamente los valores contenidos en los wrappers
     sin necesidad de estar exportandolos a una variable
     primitiva, y luego tener que meterlos de nuevo en el
     wrapper si no que se hace de forma directa.

    Sin Autoboxing (Versiones Java 4 y   Con autoboxing (a partir de la
    posteriores)                         versión java 5)
   El método equals tanto para los wrappers como para
    otros objetos sirve para ver si tienen los mismos
    atributos, si los tienen pues son iguales, a diferencia
    de == que sirve para verificar si dos variables apuntan
    al mismo objeto.
                                                                i1              i2
                                                                     1000            1000




                                                                I1 y i2 son dos objetos diferentes por
                                                                         lo tanto son diferentes



                      I1 y i2 son dos objetos diferentes pero
                     tienen el mismo valor por lo tanto para
                            el método equals son iguales
   Aquí ocurre algo muy curioso, si se usa == en el
    ejemplo anterior también da verdadero, esto lo hace
    java, porque para salvar memoria, dos instancias de
    objetos wrapper, por medio del boxing, siempre serán
    iguales cuando su contenido es igual. I3         i4
                                                                    10               10




                                                          I1 y i2 son dos objetos diferentes pero
                                                          tienen el mismo valor, por boxing java
                I1 y i2 son dos objetos diferentes pero
                                                                    dice que son iguales.
               tienen el mismo valor por lo tanto para
                      el método equals son iguales

      En conclusión tanto != como == son verdaderos en una validación de objetos,
                               para el caso de los wrappers
   Existen casos que toca tener cuidado con los wrapper, puesto que
    estos son objetos, se debe tener los mismos cuidados que se
    tienen con una clase normal, por lo tanto es necesario no dejarlo
    con un valor nulo, antes de usarlo en una operación, en este caso
    se da un nullPointerException



                                                Aquí se da un nullPointerException,
                                                 porque al momento de hacer un
                                              unboxing, y sumar el valor con un int, se
                                                         totea la aplicación
   En el mundo de los wrappers uno podría pensar
    que se puede manejar con la misma lógica de las
    primitivas, es decir donde hay un método que
    acepta un Integer, poderle meter un Short o un
    Byte, pero no, las clases no se pueden castear.

                                Un Integer no puede pasarse a un
                                   método que pide un Long,
                                contrario a las primitivas estás no
                                        se pueden castear
Cubre los objetivos 1.5 y 5.4

1.5 Given a code example, determine if a method is correctly overriding or overloading another method,
and identify legal return values (including covariant returns), for the method.

5.4 Given a scenario, develop code that declares and/or invokes overridden or overloaded methods...
   Como se puede ver a
    modo de repaso uno
    de los principios
    fundamentales de la
    sobrecarga, es que el
    compilador siempre
    trata de ubicar el
    método con el que
    más fácil y cerca
    encaja una variable,
    en el caso de byte y
    short es el método
    que acepta un int.
En el caso de enfrentarse una variable
                                            mayor donde toque hacer upgrade y un
                                            wrapper gana la variable


En el caso de enfrentarse dos variables
mayores donde toque hacer upgrade y un
varargs ganan las variables


                                            En el caso de enfrentarse dos variables
                                            wrapper donde toque hacer boxing y un
                                            varargs ganan el wrapper


Finalmente podemos concluir que el gran ganador es la variable donde toca hacer
update, luego los wrappers donde se hace boxing y finalmente los varags son la última
opción
WidenAndBox.java:6:
                                                         go(java.lang.Long) in
                                                         WidenAndBox cannot be
                                                         applied to (byte)


   Cuando se trata de hacer boxing y update se generan problemas, pues un
    wrapper puede tomar el valor de una primitiva y hacer automáticamente
    operaciones con este valor, pero tampoco se le puede pedir tanto, al
    pasar el valor de una variable arroja error de compilación, no se puede
    hacer update y boxig al mismo tiempo.



                                                De esta forma se puede corregir el
                                                código anterior. Se realizo casteo
                                                manual, y se eliminó el wrapper en
                                                el llamado del método
   Con el ejemplo anterior vemos que los varargs pueden ser de tipo wrapper al
    igual que un objeto cualquera. Y en este caso si se hace boxing automático.
   Aquí toca tener en cuenta que los varargs en principio aceptan más de un
    elemento, entonces en caso que se tenga un método que acepte Object, y se
    invoque un método con un solo int, el compilador entonces elige el método del
    object, porque lo castea a Integer y luego lo asigna al método del object.
   Para el paso de primitivas se usa el método
    con el argumento más pequeño posible
   Usándose individualmente, boxing y varargs
    son compatibles con la sobrecarga
   No se puede meter un wrapper dentro de
    otro viendo que uno es mayor que el otro.
   No se puede hacer casteo y box a la vez.
   Se puede hacer box y luego castear.
   Para los varargs se puede hacer casteo y box.
Cubre el objetivo 7.4

7.4 Given a code example, recognize the point at which an object becomes eligible for garbage collection, and
determine what is and is not guaranteed by the garbage collection system, and recognize the behaviors of the
Object finalize() method.
   Las variables de una aplicación están almacenadas en un
    espacio de memoria llamado head, y la JVM (máquina
    virtual de java) es la que se encarga de administrarla, al
    tener muchas variables almacenadas dentro del head, el
    desempeño de la aplicación y la máquina se pueden ver
    afectados, por esto Java implementó un mecanismo
    llamado Garbage Collector.
   El Garbage Collector es un mecanismo automático que se
    encarga de revisar y eliminar los objetos que se
    encuentren en el head pero que no tengan ningún uso en
    la aplicación en el momento que hace la revisión, y así
    garantiza un mejor uso de memoria por parte de la
    aplicación
   El garbage collector corre de forma
    automática, es decir que este no esta
    controlado por uno como desarrollador si no
    directamente por la JVM, se puede pedir que
    se ejecute pero no es garantizado que el JVM
    lo haga.
   Por lo tanto la JVM es la que decide cuando el
    garbage collector debe ejecutarse y cuando
    no.
   Una vez más es automático, por lo tanto trabaja de
    una forma programable.
   Lo que si se puede asegurar, y eso es importante es
    que el garbage collector elige los objetos que puede
    eliminar teniendo en cuenta si existen hilos que estén
    accediendo a él, en caso que no halla ninguno
    usándolo, el garbage collector lo elimina.

                               En este caso es probable que el garbage
            10      999        collector elimine el objeto con valor 999,
                               porque no existe ningún hilo apuntando a
                               este.
       I3
   Hacer una referencia nula
     La primera forma para que el garbage collector
     tome un objeto es asignarle null.
                                         En este punto la variable
                                         sb no es elegible por el
                                         GC, porque tiene un valor
                                         asignado


                                         En este punto sb no
                                         apunta a nada, al estar
                                         sin valor el GC lo puede
                                         tomar para eliminarlo
   Reasignando el valor de una variable
     Ocurre también cuando asignamos el valor de una
       variable a otra.
                                                                                       goo
                                                                        hello          dbye



                                                                  s1             s2



                                                                        O
                                                                                       goo
                                                                         hello         dbye



                                                                            s1         s2
    En este caso el garbage collector elige el valor de la variable con valor hello,
    porque no existe ninguna variable apuntando a esta
   Cuando un método es creado, cualquier variable local
    existe únicamente durante la ejecución del método.
    Una vez el método termine los objetos de este son
    elegibles por el GC                     d
                                      d2                                now
                                                        Date




                                                O O
                                                Date
                                                               string
                                                               Buffer




                                                                string
                                                 Date           Buffer



                                           d2              now
   Forzando el garbage collector
     Es importante aclara que el GC no se puede forzar,
      lo que se puede es invocarlo pero no existen
      garantías de que la JVM lo ejecute.
     Existen dos formas de invocarlo:
      ▪ Runtime.getRuntime().gc();
      ▪ System.gc();
     Como dije antes es importante tener en cuenta
     que no existe garantía que se ejecute o que se
     elimine algún objeto del head
 El método finalize() es un mecanismo que corre
  en algunos códigos justo antes de que el objeto
  es eliminado por el GC.
 Este método todas las clases los pueden
  implementar ya que hace parte de la clase
  Object.
 El método finalize se ejecuta solo una vez, la
  primera vez que el garbage collector lo llama.
 En la implementación del método finalize() se
  puede salvar el objeto de eliminarse por el GC.
When // doStuff is reached, how many objects are eligible for GC?
A. 0
B. 1
C. 2
D. Compilation fails
E. It is not possible to know
F. An exception is thrown at runtime
   A no es porque al poner objetos con valor null, lo
    más seguro es que GC los elimine.
   B tampoco, pues C3 queda en null y también C1
   C es correcta, pues C1 se asigna null, y cuando
    creamos el objeto C3, al usarse por el método
    go(), queda en valor null también.
   D, E, y F son incorrectas pues la aplicación no
    presenta errores de compilación ni problemas de
    excepción.
                  Esta pregunta cubre el objetivo 7.4
   What is the result?
A. many
B. a few
C. Compilation fails
D. The output is not predictable
E. An exception is thrown at runtime
   C es correcta, pues las variables piden un
    valor short, y se esta pasando un 7, no es un
    valor compatible, y necesita hacer un casteo.
   B podría ser la respuesta si se hiciera el cast
    correspondiente.
   El resto de preguntas son totalmente falsas.


               Esta pregunta cubre el objetivo 1.3
What is the result?

A. 2
B. 4
C. An exception is thrown at runtime
D. Compilation fails due to an error on line 4
E. Compilation fails due to an error on line 5
F. Compilation fails due to an error on line 6
G. Compilation fails due to an error on line 7
   A y B son incorrectas la conversión de la línea 7 no
    permiten arrojar un error correcto.
   C es correcta, el que se da cuenta que el casteo no se
    puede hacer es en tiempo de ejecución, arroja un
    castClassException
   D es incorrecta, una asignación de un array a otro array se
    puede hacer
   E es incorrecta, pues un array es in objeto también.
   F es incorrecta, el valor contenido en o, es un array de dos
    dimenciones.
   G es incorrecta, el compilador no detecta el error, al usarse
    un casteo explícito, y es por eso que sale un
    castClassException.
                              Esta pregunta cubre el objetivo 1.3
What is the result?
 A. hi
 B. hi hi
 C. hi hi hi
 D. Compilation fails
 E. hi, followed by an exception
 F. hi hi, followed by an exception
m2         mixer


                                                          m2
                                                  mixer        mixer      hi
                                       m3

                                             m2
                                                  mixer                    Hi, hi
                                       m4

   De acuerdo al gráfico la                                             Hi, hi, O
    respuesta correcta es la F, pues   m5
    m5 esta apuntando a null, y
    cuando se va a ejecutar el
    método go, arroja un
    nullPointerException, la
    respuesta correcta es la F          Esta pregunta cubre el objetivo 7.3
What is the result?
 A. true true
 B. false true
 C. true false
 D. false false
 E. Compilation fails
 F. An exception is thrown at runtime
f1
                                                             X=5     f2
                                                                          X=5



                                                                     F1 = f3
                                                                               X=5

                                                        x1 = x = z
                                                               X=5



   Según la imagen anterior se puede ver que el objeto de f1 es el mismo de f3, por
    lo tanto el resultado de las comparaciones es true, true, que corresponde a la
    opción A. Además es importante ver que se cambia el valor de x de 5 a 6, pero
    debemos observar que como están marcadas como final, entonces no se puede
    cambiar el valor, y sigue siendo 5
                                                  Esta pregunta cubre el objetivo 7.3
What is the result?
   A. pre b1 b2 r3 r2 hawk
   B. pre b2 b1 r2 r3 hawk
   C. pre b2 b1 r2 r3 hawk r1 r4
   D. r1 r4 pre b1 b2 r3 r2 hawk
   E. r1 r4 pre b2 b1 r2 r3 hawk
   F. pre r1 r4 b1 b2 r3 r2 hawk
   G. pre r1 r4 b2 b1 r2 r3 hawk
   H. The order of output cannot be
    predicted
   I. Compilation fails
R1 r4 pre b1 b2 r3 r2 hawk




   Recuerde el orden es Static -> bloques -> constructor, los statics se corren una vez apenas sube la
    aplicación, los bloques cada vez que se instancia el objeto, entonces primero van los statics de
    Raptor, luego llama al padre Bird, ejecuta los bloques, el constructor, luego vuelve al hijo Reptil,
    imprime los bloques y el contructor, y finalmente vuelve a Hawk e imprime el del main. La
    respuesta correcta es la D.
                                                                    Esta pregunta cubre el objetivo 1.3
Which are true? (Choose all that apply.)
   A. The output could contain 30
   B. The output could contain @bf73fa
   C. The output could contain DIAMONDS
   D. Compilation fails due to an error on line 6
   E. Compilation fails due to an error on line 7
   F. Compilation fails due to an error on line 8
   G. Compilation fails due to an error on line 9
   H. Compilation fails due to an error within lines 12 to 14
   A es correcta, la ejecución de la aplicación al imprimir la
    instrucción de la línea 13 da 30.
   B es correcta este resultado se origina al llamar el método
    values del emun
   C es incorrecta no se esta invocando DIAMONS en el
    código
   D es incorrecta, si pueden haber métodos y valores
    específicos para un valor del enum
   E es incorrecta, un enum si puede tener constructores
   F es incorrecta, un emun si puede tener variables locales
   G es incorrecta, un enum si puede tener métodos locales
   H es incorrecta, se puede llamar el enum directamente, sin
    ningún problema
                             Esta pregunta cubre el objetivo 1.3
What is the result?
 A. 5 7
 B. 5 8
 C. 8 7
 D. 8 8
 E. Compilation fails
 F. An exception is thrown at runtime
   E es correcta, pues cuando estamos en el for
    se usa una variable llamada ouch, pero
    método que lo contiene (go), también usa
    como parámetro de entrada una variable con
    el mismo nombre.
   Las demás son incorrectas.

              Esta pregunta cubre el objetivo 1.3
What is the result?
   A. 212
   B. 232
   C. 234
   D. 312
   E. 332
   F. 334
   G. Compilation fails
   Es importante tener en cuenta, que el compilador siempre trata de hacer
    casteo de los elementos en la sobre carga, en este caso el int lo castea
    como un Integer, pero como se espera son varios integer por ser un
    vararg, entoces lo castea al método que acepta un object, es por eso que
    da 212, que es la opción A
                                         Esta pregunta cubre el objetivo 3.1
Which two are true about the objects created within main(), and eligible for garbage collection when line 14 is
    reached?
   A. Three objects were created
   B. Four objects were created
   C. Five objects were created
   D. Zero objects are eligible for GC
   E. One object is eligible for GC
   F. Two objects are eligible for GC
   G. Three objects are eligible for GC
   C es correcta, se crearon cinco objetos, tres
    contenidos en el array, el array como tal y el
    objeto da.

   F es correcta, pues dejar d y da[1] como null,
    el GC los puede tomar para eliminarlos.

   Las demás son incorrectas

              Esta pregunta cubre el objetivo 7.4
What is the result?
   A. 4 4
   B. 5 4
   C. 6 4
   D. 4 5
   E. 5 5
   F. Compilation fails
b1
                                                               Size = 5



                                                                          b1 b1
                                                             Size = 4             Size = 4




                                                         b1
                                                                  Size = 5        Size = 6

                                                             b1
   Como podemos ver en el gráfico se asigna el                     Size = 4
    objeto b1 en las posiciones 0 y 1 del array, al
    imprimirlo da como resultado 4, 4. La respuesta
    correcta es la A                                                      b2 b1
                 Esta pregunta cubre el objetivo 7.3.         Size = 6             Size = 4
What is the result?
   A. 2
   B. 3
   C. 4
   D. 5
   E. Compilation fails
   F. An exception is thrown at runtime
   La respuesta correcta es la E, el código
    presenta error de compilación, porque en la
    línea 9, no se inicializó la variable x, recuerde
    que una variable local para poderse usar debe
    inicializarse.


               Esta pregunta cubre el objetivo 1.3

Más contenido relacionado

La actualidad más candente

Aprendiendo un nuevo lenguaje
Aprendiendo un nuevo lenguajeAprendiendo un nuevo lenguaje
Aprendiendo un nuevo lenguaje
aiguajardo
 
Fundamentos de la programacion
Fundamentos de la programacionFundamentos de la programacion
Fundamentos de la programacion
luis angel
 
Unidad 1 introduccion
Unidad 1 introduccionUnidad 1 introduccion
Unidad 1 introduccion
Katyya20
 
Logica condicionales
Logica condicionalesLogica condicionales
Logica condicionales
memorales_IUE
 

La actualidad más candente (20)

JavaWorld - SCJP - Capitulo 4
JavaWorld - SCJP - Capitulo 4JavaWorld - SCJP - Capitulo 4
JavaWorld - SCJP - Capitulo 4
 
Aprendiendo un nuevo lenguaje
Aprendiendo un nuevo lenguajeAprendiendo un nuevo lenguaje
Aprendiendo un nuevo lenguaje
 
Operadores C SHARP
Operadores C SHARPOperadores C SHARP
Operadores C SHARP
 
Las variables y constantes
Las variables y constantesLas variables y constantes
Las variables y constantes
 
6 excepciones
6 excepciones6 excepciones
6 excepciones
 
Fundamentos de la programacion
Fundamentos de la programacionFundamentos de la programacion
Fundamentos de la programacion
 
Taller completo
Taller completoTaller completo
Taller completo
 
JavaWorld - SCJP - Capitulo 5
JavaWorld - SCJP - Capitulo 5JavaWorld - SCJP - Capitulo 5
JavaWorld - SCJP - Capitulo 5
 
Unidad 1 introduccion
Unidad 1 introduccionUnidad 1 introduccion
Unidad 1 introduccion
 
Introduccion Java
Introduccion JavaIntroduccion Java
Introduccion Java
 
SeúDocodigo
SeúDocodigoSeúDocodigo
SeúDocodigo
 
Programacion basica
Programacion basicaProgramacion basica
Programacion basica
 
Cap I
Cap ICap I
Cap I
 
Mod2ud1 2
Mod2ud1 2Mod2ud1 2
Mod2ud1 2
 
4 Redes Neuronales
4 Redes Neuronales4 Redes Neuronales
4 Redes Neuronales
 
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSONJavascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
Javascript - Módulo 8: LocalStorage, iFrames, Origin policy y JSON
 
Capitulo 4
Capitulo 4Capitulo 4
Capitulo 4
 
Logica condicionales
Logica condicionalesLogica condicionales
Logica condicionales
 
comandos
comandoscomandos
comandos
 
Instrucciones(raptor, java, c#)
Instrucciones(raptor, java, c#)Instrucciones(raptor, java, c#)
Instrucciones(raptor, java, c#)
 

Similar a Certificación java 6 cap 3

C2 fundamentos de java v2
C2 fundamentos de java v2C2 fundamentos de java v2
C2 fundamentos de java v2
Mariano Galvez
 
Informe Proyecto Final
Informe Proyecto FinalInforme Proyecto Final
Informe Proyecto Final
Jorge Ramon
 

Similar a Certificación java 6 cap 3 (20)

9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos9 Curso de POO en java - variables, constantes y objetos
9 Curso de POO en java - variables, constantes y objetos
 
Programacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para emsProgramacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para ems
 
Javascript continuación
Javascript   continuaciónJavascript   continuación
Javascript continuación
 
C2 fundamentos de java v2
C2 fundamentos de java v2C2 fundamentos de java v2
C2 fundamentos de java v2
 
Var const
Var constVar const
Var const
 
Jyoc java-cap10 clases complementarias y enumerados
Jyoc java-cap10 clases complementarias y enumeradosJyoc java-cap10 clases complementarias y enumerados
Jyoc java-cap10 clases complementarias y enumerados
 
LibreríAs De Java
LibreríAs De JavaLibreríAs De Java
LibreríAs De Java
 
Java variables
Java variablesJava variables
Java variables
 
Certificación java 6 cap 4
Certificación java 6 cap 4Certificación java 6 cap 4
Certificación java 6 cap 4
 
4 variables, arreglos, estructuras y enum
4 variables, arreglos, estructuras y enum4 variables, arreglos, estructuras y enum
4 variables, arreglos, estructuras y enum
 
TutorialKotlin.docx
TutorialKotlin.docxTutorialKotlin.docx
TutorialKotlin.docx
 
Conceptos Generales
Conceptos GeneralesConceptos Generales
Conceptos Generales
 
Sintaxis Básica del lenguaje Java
Sintaxis Básica del lenguaje JavaSintaxis Básica del lenguaje Java
Sintaxis Básica del lenguaje Java
 
Sintaxis Básica de Java
Sintaxis Básica de JavaSintaxis Básica de Java
Sintaxis Básica de Java
 
Estructuras repetitivas
Estructuras repetitivasEstructuras repetitivas
Estructuras repetitivas
 
Introduccion java
Introduccion javaIntroduccion java
Introduccion java
 
Informe Proyecto Final
Informe Proyecto FinalInforme Proyecto Final
Informe Proyecto Final
 
Lenguajes de Programación: Tutorial csharp
Lenguajes de Programación: Tutorial csharpLenguajes de Programación: Tutorial csharp
Lenguajes de Programación: Tutorial csharp
 
Dp2
Dp2Dp2
Dp2
 
Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015Java - Sintaxis Básica 2015
Java - Sintaxis Básica 2015
 

Último

Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Fernando Solis
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
EliaHernndez7
 

Último (20)

Los avatares para el juego dramático en entornos virtuales
Los avatares para el juego dramático en entornos virtualesLos avatares para el juego dramático en entornos virtuales
Los avatares para el juego dramático en entornos virtuales
 
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICABIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptx
 
Sesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronósticoSesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronóstico
 
Usos y desusos de la inteligencia artificial en revistas científicas
Usos y desusos de la inteligencia artificial en revistas científicasUsos y desusos de la inteligencia artificial en revistas científicas
Usos y desusos de la inteligencia artificial en revistas científicas
 
TRABAJO FINAL TOPOGRAFÍA COMPLETO DE LA UPC
TRABAJO FINAL TOPOGRAFÍA COMPLETO DE LA UPCTRABAJO FINAL TOPOGRAFÍA COMPLETO DE LA UPC
TRABAJO FINAL TOPOGRAFÍA COMPLETO DE LA UPC
 
Infografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdfInfografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdf
 
Biografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfBiografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdf
 
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
 
FUERZA Y MOVIMIENTO ciencias cuarto basico.ppt
FUERZA Y MOVIMIENTO ciencias cuarto basico.pptFUERZA Y MOVIMIENTO ciencias cuarto basico.ppt
FUERZA Y MOVIMIENTO ciencias cuarto basico.ppt
 
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADOTIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
 
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLAACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
 
LA LITERATURA DEL BARROCO 2023-2024pptx.pptx
LA LITERATURA DEL BARROCO 2023-2024pptx.pptxLA LITERATURA DEL BARROCO 2023-2024pptx.pptx
LA LITERATURA DEL BARROCO 2023-2024pptx.pptx
 
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
SESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.docSESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.doc
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
 
Análisis de los Factores Externos de la Organización.
Análisis de los Factores Externos de la Organización.Análisis de los Factores Externos de la Organización.
Análisis de los Factores Externos de la Organización.
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024
 

Certificación java 6 cap 3

  • 1. Realizado por: Raúl Ernesto Triviño Alvarado Capítulo 3 - Asignaciones
  • 2. Cubre los objetivos: 1.3 Develop code that declares, initializes, and uses primitives, arrays, enums, and objects as static, instance, and local variables. Also, use legal identifiers for variable names. 7.6 Write code that correctly applies the appropriate operators including assignment operators (limited to: =, +=, -=)...
  • 3. Literales enteros:  Se dividen en tres tipos: decimales, octales y Hexadecimales Decimales Octales Hexadecimales Son los números Son los números con base 8. Son los números con base normales, que están 15. en base 1o. Los valores válidos van de 0 a 7 Los valores válidos van de Se representan de Se representan anteponiendo 0 a 9 y de A hasta F una notación normal un 0 Se representan colcando int length = 343; int six = 06; // Equal to decimal 6 un valor 0x int seven = 07; // Equal to decimal 7 int eight = 010; // Equal to int x = 0X0001; decimal 8 int y = 0x7fffffff; int nine = 011; // Equal to decimal int z = 0xDeadCafe; 9
  • 4. Literales de punto flotante  Los flotantes pueden ser de dos tipos, los float o los double, los float miden 32 bytes y los double miden 64 bytes. Float Double Miden 32 bytes Miden 64 bytes Se define colocando al final una F, es Se define colocando una D al final, es obligatorio de lo contrario puede haber opcional. error de compilador por perdida de precisión float f = 23.467890; // Compiler double d = 110599.995011D; // error, possible loss Optional, not required // of precision double g = 987.897; // No 'D' suffix, float g = 49837849.029847F; // OK; has but OK because the the suffix "F" // literal is a double by default
  • 5. Caracteres:  Las variables primitivas que responden a los literales son los char, estos se representan con una carácter encerrado entre comillas simples.  También se definen como el valor unicode con el valor encerrado entre comillas simples y precedido con u.  Por último también se pueden poner valores enteros pero siempre y cuando quepan en un tamaño de 16 bits, es decir hasta 65535 en valores decimales. char letterN = 'u004E'; // The letter 'N' char a = 'a'; char b = '@'; char a = 0x892; // hexadecimal literal char b = 982; // int literal char c = (char)70000; // The cast is required; 70000 is out of char // range
  • 6. Asignación de primitivos  La asignación es sencilla, se hace por medio del símbolo igual (=).  El punto donde toca tener cuidado es con el tamaño de las variables. Por ejemplo sumar dos enteros y asignarlo a un entero no tiene lío  Pero sumar dos bytes y asignarlo a un byte si tiene problema, la suma de dos bytes siempre dan un resultado mayor de 8 bytes, y por lo tanto toca hacer un casteo explicito, o asignarlo a un entero
  • 7.  Como se vio en el capitulo pasado existen dos tipos de casteo (explicito e implícito).  El implícito se hace cuando una variable de tamaño menor se asigna a un caso mayor.  En caso del explicito aplica en el caso que una variable de tamaño menor se asigna a una menor, en este caso toca tener cuidado porque por lo general hay una posible perdida de precisión del valor. Casteo implícito Casteo explícityo
  • 9. El punto importante aquí es que siempre el compilador trata de asignar las variables de punto flotante a una variable double, que tiene 64 bytes de espacio, por lo tanto si se desea asignar el valor a una variable float, que tiene 16 bytes de espacio, toca hacer un casteo explícito. No compila Si compila float f = (float) 32.3; float f = 32.3; float g = 32.3f; float h = 32.3F;
  • 10. Cuando se asigna el valor de una variable primitiva a otra, lo que se hace es que en el espacio de memoria de una variable se copia el valor a el espacio de memoria de la segunda, pero siguen siendo independientes. a = 10 a = 10 b = 10 a = 10 b = 30 a = 10 a = 10 after change to b
  • 11. La asignación de variables de referencia aplica a los mismos principios de casteo (explícito e implicito), la diferencia que se da es en la cadena de herencia que existe entre los objetos. Se puede hacer sin problema porque Bar es hijo de Foo No se puede hacer porque Foo es hijo de Bar, arroja un error de compilación
  • 12. Las variables ya sean primitivas u objetos tienen un alcance dentro de la clase, y esta depende de donde se creo. Una variable estática tiene un alcance de toda la clase, son creadas cuando la clase se esta cargando, inclusive antes de la construcción, y vive mientras esta arriba la máquina virtual de Java Una variable de instancia se crea cuando se crea la clase, es decir después del constructor, y vive mientras la clase vive. Una variable de bloque se crea y se mantiene viva mientras se ejecuta el bloque al que pertenece. Una variable local es aquella que se mantiene viva mientras el método se encuentra en ejecución
  • 13. Tratar de acceder una variable de instancia de una clase desde un contexto de un bloque estático como un main. La variable x, es una variable de instancia, no puede ser accedida por un bloque estático  Tratar de que un método use una variable local de un método distinto La variable del método go2 y no puede acceder a la variable del método go, son métodos distintos
  • 14. Tratar de usar una variable de bloque después de que se terminó de ejecutar el bloque La variable test no puede acceder a la variable test del bloque for
  • 15. Al momento de crear una variable no es necesaria inicializarla, entonces el compilador le asigna un valor por defecto, estos valores son:
  • 16. El compilador inicializa la variable en 0 year = 0 El valor de year nunca cambia en la ejecución del ejemplo, por lo tanto escribirá: The year is 0
  • 17. Los objetos se inicializan con null, pues al no asignarle un objeto queda el espacio de memoria que corresponde al objeto apuntando a nada. Por ejemplo String es un objeto, por lo tanto title queda apuntando a la nada. title = null s = null Error de ejecución, nullPointerException, no se puede pasar a minúscula nada o nulo
  • 18. Los array son colecciones de un tipo de variable, y pueda que se haya inicializado el array como tal, pero los objetos contenidos en esta colección no están inicializados, entonces lo más seguro es que el compilador les coloque el tipo de valor por defecto. Se ha inicializado el array de 100 enteros Se obtiene una lista de 100 veces 0
  • 19. Las primitivas locales se caracterizan que no se pueden usar son antes inicializarse, en caso contrario arrojará error de compilación. Error de compilación porque year no esta inicializado year se inicializó explícitamente, por lo tanto corre sin problemas No se puede determinar, pues los valores de args no siempre se llenan, si no se llenan entonces arroja error de compilación, en caso contrario funciona sin problemas
  • 20. Aquí se presenta el mismo principio que con las primitivas, para poder usarlo es necesario tener una inicialización explicita, así sea ponerle null, pero debe ser explicito. Aquí hay un error de compilación, en este caso no se inicializó explícitamente la variable date, entonces al usarla se estalla. Para solucionarlo se debe usar la siguiente Línea: Date date = null;
  • 21. Con los arrays el cuento es diferente, como un array es un objeto entonces toca inicializarlo, pero no es necesario inicializar cada uno de los valores del array, pues al momento de inicializar el array se les coloca automáticamente el valor por defecto.
  • 22. Cuando se asigna un objeto de referencia a otro hay que tener en cuenta que los objetos en realidad apuntan a un espacio de memoria dentro de la máquina, por lo tanto el comportamiento de estos es diferente a una variable primitiva. Dimension a Weight = 5 Height = 10 a.height = 10 Dimension a Weight = 5 Height = 10 b Dimension Aunque se cambia el valor a Weight = 5 del atributo en el objeto b, Height = 30 b también cambia en a, porque a y b apuntan al mismo espacio de memoria a.height = 30 after change to b
  • 23. Existe un caso especial como el siguiente: String y Java x y string = Java String y Java La excepción de la regla de la diapositiva String anterior es el objeto String, cuando uno maneja un objeto String se habilita un pool x Java Bean de Strings, el sistema cada vez que se modifica una cadena el sistema crea un y string = Java String nuevo y lo asigna a la variable Correspondiente, por lo tanto aunque no se ve, en realidad el sistema empieza a usar dos objetos distintos al cambiar el valor del String
  • 24. Cubre el objetivo: 7.3 Determine the effect upon object references and primitive values when they are passed into methods that perform assignments or other modifying operations on the parameters.
  • 25. Dimension Weight = 5 d Height = 10 Before modify() d.height = 10 After modify() d.height = 10 Dimension dim Weight = 5 Height =11 d En el caso de paso de objetos de referencia, After modify() d.height = 10 se aplica el principio del manejo de paso de objetos de referencia, cuando se pasa un objeto de referencia al método, el objeto que entra al método apunta también al mismo espacio de memoria del objeto original, por lo tanto cualquier cambio que se haga en el método afecta al objeto original también.
  • 26. Al momento de pasar los objetos al método hay que tener en cuenta que lo que el sistema hace es pasar una copia del objeto, no el objeto como tal, eso implica que al ser una copia, si se reasigna la variable del objeto en el método a otro objeto, pues el objeto original se mantiene igual. Foo Name = “” f Foo f Name =“Boo” g Foo f Name = “Boo” Foo g Name = “”
  • 27. Aquí se hace lo mismo que con los objetos de referencia, se pasa es una copia de la variable, pero como son primitivas pues no se maneja el concepto de apuntador al mismo espacio de memoria, si no simplemente se copia el valor, por lo tanto todos los cambios en el método de esta variable no afectan la variable original. a=1 Before modify() a = 1 After modify() a = 1 a=1 number = 2 number = 2
  • 28. Cubre el objetivo 1.3 Develop code that declares, initializes, and uses primitives, arrays, enums, and objects as static, instance, and local variables. Also, use legal identifiers for variable names.
  • 29.  Un array puede ser de tipo primitiva o de una clase en específica.  Para declararla se necesita declarar la restricción de acceso, el tipo de variable que va a contener el array, un nombre y comillas cuadradas.  Es importante anotar que en este punto no se declara el tamaño del array.  Las comillas cuadradas pueden ir antes o después del nombre del array. Array de Array mal Array de objetos Array multidimensional primitivas declarado int[] key; Thread[] threads; String[][][] occupantName; int[5] scores; int key []; Thread threads[]; String[] ManagerName [];
  • 30. La construcción a diferencia de la declaración si lleva el tamaño del array, la construcción se hace así: int[] testScores; testScores = new int[4]; La imagen anterior evidencia varias cosas, primero el sistema ve el array como un objeto compuesto de varios objetos, segundo cada una de la posiciones tiene un índice y este empieza desde 0, y cada uno de las posiciones tiene una variable del tipo que se declaró el arreglo, esto significa que no es posible tener variables de diferente tipo, a menos que se maneje herencia.
  • 31. Los arrays multidimensionales se construyen indicando solamente la cantidad de posiciones de la primera dimensión, las otras se dejan en blanco, tal como se ve a continuación Aquí se puede observar que en la sección amarilla se declaró un array de 3 posiciones, pero multidimensional, luego se toman las posiciones 0 y 1 y se declaran de nuevo un array de 2posiciones, y otro de 3 posiciones. El compilador de java entoces ve un objeto compuesto de 3 objetos Arrays de tipo int, que a su vez estan compuestos de 2 arrays para el de la posición 0, uno de 3 en la posición 1, y nada para la posición 2 porque no se ha declarado
  • 32. Cuando uno construye un array, java le asigna automáticamente los valores por defecto a los elementos del array, en el caso de los objetos les coloca null, si es una primitiva númerica 0, y si es un boolean false.  Si uno desea asignarles un valor diferente entonces lo que se debe hacer es inicializar manualmente cada uno de los elementos, ya sea específicamente sobre una posición, o recorriendo el array por medio de una sentencia for. Asignación uno a uno, Asignación en un ciclo, no es muy recomendable recomendable
  • 33. Es posible que en el examen de certificación salga un tema relacionado con este tópico, puesto que es una forma de inicialización muy poco común, pero igual legal y funcional Dog[] myDogs = {puppy, new Dog("Clover"), new Dog("Aiko")}; Tipo objeto Llave cuadrada nombre Declaración directa de los elementos del array
  • 34. Un array anónimo es cuando se contruye y se inicializa un array al mismo tiempo y se asigna a un array ya declarado, al igual que la diapositiva pasada, no es muy común, pero igual es válido y funciona. Declaro el array Le asigno los valores al Construyo el array array
  • 35. Con el manejo de las variables primitivas en un array se maneja el mismo principio que se maneja en la asignación de variables, se pueden pasar variables con casteo implícito si la variable a asignar es más pequeña que la del array, y si no es así se debe manejar casteo explícito con el riesgo que halla perdida de presición, si es un array de booleanos solo se puede asignar true o false.  Si en el ejemplo anterior deseamos asignar una variable long toca hacer el casteo explícito con todos los riesgos que esto implica
  • 36. La asignación de valores de un array una vez más continua con los mismos lineamientos que se presentan en la asignación normal, los objetos asignados deben heredar o implementar el tipo del array. Compila sin problema porque Ferrari implementa Sporty Compila sin problema porque RacingPlate implementa Sporty No compila porque GolfClub no implementa Sporty
  • 37. Cuando uno va a asignar un array de un valor a otro, entonces hay que tener en cuenta se puede asignar un array a otro siempre y cuando tengan el mismo tipo, y no importa el tamaño de los arrays. Compila sin problema array tipo int cuadra con array tipo int No compila sin problema array tipo int no cuadra con array tipo char
  • 38. Para los arrays de objetos de referencia la cosa cambia, resulta que en este caso si maneja herencia, se puede asignar a un array de una clase padre un array de clase hijo, pero cuidado no se puede hacer de ninguna forma lo contrario, es decir a un array clase hijo, asignarle un array clase padre. Aquí se cumplen los principios vistos en la sección de que un objeto “es un” Compila sin problema porque Honda es un Car No compila sin problema porque beers no es un Car
  • 39. Aquí hay que tener presente que un array multidimensional no puede ser asignado a un array unidimensional y que un array no puede asignarsele una variable que no sea array. Ojo no es que arroje error de compilación si no excepción, classCastException A. myCats = myCats[0]; Este caso es error, porque myCats es un array multidimensional, no se le puede asignar un Array unidimensional. C. myCats[1] = myCats[1][2]; tampoco se puede, si no se le puede asignar a un array multidimensional un array unidimensional, pues tampoco se puede hacer lo contrario. B. myCats = myCats[0][0]; Tampoco se D. myCats[0][1] = moreCats; No se puede, puede, porque lo que hay en la posición 0, porque si no se le puede asiganar a un array es un objeto tipo Cat, y un objeto no se un objeto, tampoco se puede hacer lo puede asignar a un array contrario
  • 40. Tratar de acceder a una posición del array que esta más allá del tamaño de este, esto genera una excepción ArrayIndexOutOfBoundsException Aunque compila sin problemas sale una excepción, la posición 5 no existe, las posiciones van de 0 a 4  Buscar una posición con valor negativo, las posiciones negativas no existen. Compila y sin error, pero arroja error de excepción, no existe una posición negativa en el mundo del array  Declarar en un array anónimo o en el array de una línea el tamaño del array No se pueden tener el tamaño del array porque estamos en la declaración del array
  • 41. Los bloques de inicialización son segmentos de código encerrados entre corchetes, no son métodos porque no tienen la firma de declaración, y estos corren por el compilador después de ejecutar el constructor de la clase.  Entonces el orden de ejecución es primero los bloques marcados como static, luego el bloque, luego el contructor de la clase , y luego los diferentes métodos que se van llamando.  Los bloques se diferencian de los bloques estáticos en que los primeros se ejecutan cada vez que se crea un objeto de la clase, mientras que los segundos solo una vez, que es la primera vez que se crea un objeto de la clase.
  • 42. 1st static init 2nd static init 1st instance init 2nd instance init no-arg const 1st instance init 2nd instance init 1-arg const Recuerde el orden de ejecución es: Static -> bloques -> Constructor Los métodos estáticos solo se corren una vez, los bloques y los constructores cada vez que se crea un objeto.
  • 43. Cubre el objetivo 3.1 Develop code that uses the primitive wrapper classes (such as Boolean, Character, Double, Integer, etc.), and/or autoboxing & unboxing. Discuss the differences between the String, StringBuilder, and StringBuffer classes.
  • 44. Una clase wrapper es una clase que se encarga de envolver una variable primitiva.  El objetivo de estas clases es permitirle a una variable primitiva realizar operaciones más complejas como conversiones, asignaciones y asignarlas en arreglos y colecciones.  Los wrapper son:
  • 45. Todos los wrappers a excepción de Character, tienen dos constructores, uno que toma una variable primitiva del tipo construido y otra que toma una representación String del tipo del wrapper Integer i1 = new Integer(42); Float f1 = new Float(3.14f); Integer i2 = new Integer("42"); Float f2 = new Float("3.14f");  Para Character, solo se tiene uno que toma el valor de un char como argumento Character c1 = new Character('c');  En el caso de los booleanos también aplica el primer principio, tiene dos constructores, uno que toma true o false, y otro que toma un String con estos valores Boolean b1 = new Boolean("false"); Boolean b2 = new Boolean(false);
  • 46. El método valueOf(), es un método estático que permite tomar un valor de una cadena y transformarlo al valor del wrapper.  Existen dos especificaciones de este método, uno que toma el valor del wrapper solamente y hace la conversión, y otra que tiene dos parámetros que es el string del valor, y la especificación de la base a la que se debe convertir. Float f2 = Float.valueOf("3.14f"); f2 = 3.14 i2 = 101011 Integer i2 = Integer.valueOf("101011", 2);
  • 47. El método xxxValue(), sirve para poder tomar el valor de un wrapper numérico y pasarlo a otro tipo de variable numérica.  Cada una de las 6 clases de wrapper numéricas tiene 6 métodos que permiten pasar el valor a los otros tipos de variable. Paso del valor 42 a byte Paso del valor 42 a short Paso del valor 42 a double
  • 48. Estos dos métodos están fuertemente relacionados pues ambos pueden tomar un valor String como parámetro de entrada y si el String está mal formado, pues en ejecución arroja una excepción tipo NumberFormatException, pero se diferencian en:  El método parseXxx() retorna una primitiva.  El método valueOf() retorna un wrapper del tipo que invoca el método. El método parseXxx(), retorna una primitiva El método valueOf, retorna un wrapper
  • 49. El método toString() sirve para pasar el valor contenido en cualquier wrapper a una cadena string. Double d = new Double("3.14"); System.out.println("d = "+ d.toString() ); // result is d = 3.14  Existe además un método especial para los wrapper Integer y Long, los cuales se les puede hace un ajuste de la escala, es decir pasarlo a base 10, 2, 16 u 8 String s = "hex = "+ Long.toString(254,16); // s = "hex = fe"
  • 50. Los wrapper Integer y Long vienen por defecto en base 10, también se puede hacer una conversión de base usando estos métodos
  • 51.
  • 52. Boxing es una propiedad de los wrapper que apareció desde la versión 5 de java, la cual permite manipular directamente los valores contenidos en los wrappers sin necesidad de estar exportandolos a una variable primitiva, y luego tener que meterlos de nuevo en el wrapper si no que se hace de forma directa. Sin Autoboxing (Versiones Java 4 y Con autoboxing (a partir de la posteriores) versión java 5)
  • 53. El método equals tanto para los wrappers como para otros objetos sirve para ver si tienen los mismos atributos, si los tienen pues son iguales, a diferencia de == que sirve para verificar si dos variables apuntan al mismo objeto. i1 i2 1000 1000 I1 y i2 son dos objetos diferentes por lo tanto son diferentes I1 y i2 son dos objetos diferentes pero tienen el mismo valor por lo tanto para el método equals son iguales
  • 54. Aquí ocurre algo muy curioso, si se usa == en el ejemplo anterior también da verdadero, esto lo hace java, porque para salvar memoria, dos instancias de objetos wrapper, por medio del boxing, siempre serán iguales cuando su contenido es igual. I3 i4 10 10 I1 y i2 son dos objetos diferentes pero tienen el mismo valor, por boxing java I1 y i2 son dos objetos diferentes pero dice que son iguales. tienen el mismo valor por lo tanto para el método equals son iguales En conclusión tanto != como == son verdaderos en una validación de objetos, para el caso de los wrappers
  • 55. Existen casos que toca tener cuidado con los wrapper, puesto que estos son objetos, se debe tener los mismos cuidados que se tienen con una clase normal, por lo tanto es necesario no dejarlo con un valor nulo, antes de usarlo en una operación, en este caso se da un nullPointerException Aquí se da un nullPointerException, porque al momento de hacer un unboxing, y sumar el valor con un int, se totea la aplicación
  • 56. En el mundo de los wrappers uno podría pensar que se puede manejar con la misma lógica de las primitivas, es decir donde hay un método que acepta un Integer, poderle meter un Short o un Byte, pero no, las clases no se pueden castear. Un Integer no puede pasarse a un método que pide un Long, contrario a las primitivas estás no se pueden castear
  • 57. Cubre los objetivos 1.5 y 5.4 1.5 Given a code example, determine if a method is correctly overriding or overloading another method, and identify legal return values (including covariant returns), for the method. 5.4 Given a scenario, develop code that declares and/or invokes overridden or overloaded methods...
  • 58. Como se puede ver a modo de repaso uno de los principios fundamentales de la sobrecarga, es que el compilador siempre trata de ubicar el método con el que más fácil y cerca encaja una variable, en el caso de byte y short es el método que acepta un int.
  • 59. En el caso de enfrentarse una variable mayor donde toque hacer upgrade y un wrapper gana la variable En el caso de enfrentarse dos variables mayores donde toque hacer upgrade y un varargs ganan las variables En el caso de enfrentarse dos variables wrapper donde toque hacer boxing y un varargs ganan el wrapper Finalmente podemos concluir que el gran ganador es la variable donde toca hacer update, luego los wrappers donde se hace boxing y finalmente los varags son la última opción
  • 60. WidenAndBox.java:6: go(java.lang.Long) in WidenAndBox cannot be applied to (byte)  Cuando se trata de hacer boxing y update se generan problemas, pues un wrapper puede tomar el valor de una primitiva y hacer automáticamente operaciones con este valor, pero tampoco se le puede pedir tanto, al pasar el valor de una variable arroja error de compilación, no se puede hacer update y boxig al mismo tiempo. De esta forma se puede corregir el código anterior. Se realizo casteo manual, y se eliminó el wrapper en el llamado del método
  • 61. Con el ejemplo anterior vemos que los varargs pueden ser de tipo wrapper al igual que un objeto cualquera. Y en este caso si se hace boxing automático.  Aquí toca tener en cuenta que los varargs en principio aceptan más de un elemento, entonces en caso que se tenga un método que acepte Object, y se invoque un método con un solo int, el compilador entonces elige el método del object, porque lo castea a Integer y luego lo asigna al método del object.
  • 62. Para el paso de primitivas se usa el método con el argumento más pequeño posible  Usándose individualmente, boxing y varargs son compatibles con la sobrecarga  No se puede meter un wrapper dentro de otro viendo que uno es mayor que el otro.  No se puede hacer casteo y box a la vez.  Se puede hacer box y luego castear.  Para los varargs se puede hacer casteo y box.
  • 63. Cubre el objetivo 7.4 7.4 Given a code example, recognize the point at which an object becomes eligible for garbage collection, and determine what is and is not guaranteed by the garbage collection system, and recognize the behaviors of the Object finalize() method.
  • 64. Las variables de una aplicación están almacenadas en un espacio de memoria llamado head, y la JVM (máquina virtual de java) es la que se encarga de administrarla, al tener muchas variables almacenadas dentro del head, el desempeño de la aplicación y la máquina se pueden ver afectados, por esto Java implementó un mecanismo llamado Garbage Collector.  El Garbage Collector es un mecanismo automático que se encarga de revisar y eliminar los objetos que se encuentren en el head pero que no tengan ningún uso en la aplicación en el momento que hace la revisión, y así garantiza un mejor uso de memoria por parte de la aplicación
  • 65. El garbage collector corre de forma automática, es decir que este no esta controlado por uno como desarrollador si no directamente por la JVM, se puede pedir que se ejecute pero no es garantizado que el JVM lo haga.  Por lo tanto la JVM es la que decide cuando el garbage collector debe ejecutarse y cuando no.
  • 66. Una vez más es automático, por lo tanto trabaja de una forma programable.  Lo que si se puede asegurar, y eso es importante es que el garbage collector elige los objetos que puede eliminar teniendo en cuenta si existen hilos que estén accediendo a él, en caso que no halla ninguno usándolo, el garbage collector lo elimina. En este caso es probable que el garbage 10 999 collector elimine el objeto con valor 999, porque no existe ningún hilo apuntando a este. I3
  • 67. Hacer una referencia nula  La primera forma para que el garbage collector tome un objeto es asignarle null. En este punto la variable sb no es elegible por el GC, porque tiene un valor asignado En este punto sb no apunta a nada, al estar sin valor el GC lo puede tomar para eliminarlo
  • 68. Reasignando el valor de una variable  Ocurre también cuando asignamos el valor de una variable a otra. goo hello dbye s1 s2 O goo hello dbye s1 s2 En este caso el garbage collector elige el valor de la variable con valor hello, porque no existe ninguna variable apuntando a esta
  • 69. Cuando un método es creado, cualquier variable local existe únicamente durante la ejecución del método. Una vez el método termine los objetos de este son elegibles por el GC d d2 now Date O O Date string Buffer string Date Buffer d2 now
  • 70. Forzando el garbage collector  Es importante aclara que el GC no se puede forzar, lo que se puede es invocarlo pero no existen garantías de que la JVM lo ejecute.  Existen dos formas de invocarlo: ▪ Runtime.getRuntime().gc(); ▪ System.gc();  Como dije antes es importante tener en cuenta que no existe garantía que se ejecute o que se elimine algún objeto del head
  • 71.  El método finalize() es un mecanismo que corre en algunos códigos justo antes de que el objeto es eliminado por el GC.  Este método todas las clases los pueden implementar ya que hace parte de la clase Object.  El método finalize se ejecuta solo una vez, la primera vez que el garbage collector lo llama.  En la implementación del método finalize() se puede salvar el objeto de eliminarse por el GC.
  • 72.
  • 73. When // doStuff is reached, how many objects are eligible for GC? A. 0 B. 1 C. 2 D. Compilation fails E. It is not possible to know F. An exception is thrown at runtime
  • 74. A no es porque al poner objetos con valor null, lo más seguro es que GC los elimine.  B tampoco, pues C3 queda en null y también C1  C es correcta, pues C1 se asigna null, y cuando creamos el objeto C3, al usarse por el método go(), queda en valor null también.  D, E, y F son incorrectas pues la aplicación no presenta errores de compilación ni problemas de excepción. Esta pregunta cubre el objetivo 7.4
  • 75. What is the result? A. many B. a few C. Compilation fails D. The output is not predictable E. An exception is thrown at runtime
  • 76. C es correcta, pues las variables piden un valor short, y se esta pasando un 7, no es un valor compatible, y necesita hacer un casteo.  B podría ser la respuesta si se hiciera el cast correspondiente.  El resto de preguntas son totalmente falsas. Esta pregunta cubre el objetivo 1.3
  • 77. What is the result? A. 2 B. 4 C. An exception is thrown at runtime D. Compilation fails due to an error on line 4 E. Compilation fails due to an error on line 5 F. Compilation fails due to an error on line 6 G. Compilation fails due to an error on line 7
  • 78. A y B son incorrectas la conversión de la línea 7 no permiten arrojar un error correcto.  C es correcta, el que se da cuenta que el casteo no se puede hacer es en tiempo de ejecución, arroja un castClassException  D es incorrecta, una asignación de un array a otro array se puede hacer  E es incorrecta, pues un array es in objeto también.  F es incorrecta, el valor contenido en o, es un array de dos dimenciones.  G es incorrecta, el compilador no detecta el error, al usarse un casteo explícito, y es por eso que sale un castClassException. Esta pregunta cubre el objetivo 1.3
  • 79. What is the result?  A. hi  B. hi hi  C. hi hi hi  D. Compilation fails  E. hi, followed by an exception  F. hi hi, followed by an exception
  • 80. m2 mixer m2 mixer mixer hi m3 m2 mixer Hi, hi m4  De acuerdo al gráfico la Hi, hi, O respuesta correcta es la F, pues m5 m5 esta apuntando a null, y cuando se va a ejecutar el método go, arroja un nullPointerException, la respuesta correcta es la F Esta pregunta cubre el objetivo 7.3
  • 81. What is the result?  A. true true  B. false true  C. true false  D. false false  E. Compilation fails  F. An exception is thrown at runtime
  • 82. f1 X=5 f2 X=5 F1 = f3 X=5 x1 = x = z X=5  Según la imagen anterior se puede ver que el objeto de f1 es el mismo de f3, por lo tanto el resultado de las comparaciones es true, true, que corresponde a la opción A. Además es importante ver que se cambia el valor de x de 5 a 6, pero debemos observar que como están marcadas como final, entonces no se puede cambiar el valor, y sigue siendo 5 Esta pregunta cubre el objetivo 7.3
  • 83. What is the result?  A. pre b1 b2 r3 r2 hawk  B. pre b2 b1 r2 r3 hawk  C. pre b2 b1 r2 r3 hawk r1 r4  D. r1 r4 pre b1 b2 r3 r2 hawk  E. r1 r4 pre b2 b1 r2 r3 hawk  F. pre r1 r4 b1 b2 r3 r2 hawk  G. pre r1 r4 b2 b1 r2 r3 hawk  H. The order of output cannot be predicted  I. Compilation fails
  • 84. R1 r4 pre b1 b2 r3 r2 hawk  Recuerde el orden es Static -> bloques -> constructor, los statics se corren una vez apenas sube la aplicación, los bloques cada vez que se instancia el objeto, entonces primero van los statics de Raptor, luego llama al padre Bird, ejecuta los bloques, el constructor, luego vuelve al hijo Reptil, imprime los bloques y el contructor, y finalmente vuelve a Hawk e imprime el del main. La respuesta correcta es la D. Esta pregunta cubre el objetivo 1.3
  • 85. Which are true? (Choose all that apply.)  A. The output could contain 30  B. The output could contain @bf73fa  C. The output could contain DIAMONDS  D. Compilation fails due to an error on line 6  E. Compilation fails due to an error on line 7  F. Compilation fails due to an error on line 8  G. Compilation fails due to an error on line 9  H. Compilation fails due to an error within lines 12 to 14
  • 86. A es correcta, la ejecución de la aplicación al imprimir la instrucción de la línea 13 da 30.  B es correcta este resultado se origina al llamar el método values del emun  C es incorrecta no se esta invocando DIAMONS en el código  D es incorrecta, si pueden haber métodos y valores específicos para un valor del enum  E es incorrecta, un enum si puede tener constructores  F es incorrecta, un emun si puede tener variables locales  G es incorrecta, un enum si puede tener métodos locales  H es incorrecta, se puede llamar el enum directamente, sin ningún problema Esta pregunta cubre el objetivo 1.3
  • 87. What is the result?  A. 5 7  B. 5 8  C. 8 7  D. 8 8  E. Compilation fails  F. An exception is thrown at runtime
  • 88. E es correcta, pues cuando estamos en el for se usa una variable llamada ouch, pero método que lo contiene (go), también usa como parámetro de entrada una variable con el mismo nombre.  Las demás son incorrectas. Esta pregunta cubre el objetivo 1.3
  • 89. What is the result?  A. 212  B. 232  C. 234  D. 312  E. 332  F. 334  G. Compilation fails
  • 90. Es importante tener en cuenta, que el compilador siempre trata de hacer casteo de los elementos en la sobre carga, en este caso el int lo castea como un Integer, pero como se espera son varios integer por ser un vararg, entoces lo castea al método que acepta un object, es por eso que da 212, que es la opción A Esta pregunta cubre el objetivo 3.1
  • 91. Which two are true about the objects created within main(), and eligible for garbage collection when line 14 is reached?  A. Three objects were created  B. Four objects were created  C. Five objects were created  D. Zero objects are eligible for GC  E. One object is eligible for GC  F. Two objects are eligible for GC  G. Three objects are eligible for GC
  • 92. C es correcta, se crearon cinco objetos, tres contenidos en el array, el array como tal y el objeto da.  F es correcta, pues dejar d y da[1] como null, el GC los puede tomar para eliminarlos.  Las demás son incorrectas Esta pregunta cubre el objetivo 7.4
  • 93. What is the result?  A. 4 4  B. 5 4  C. 6 4  D. 4 5  E. 5 5  F. Compilation fails
  • 94. b1 Size = 5 b1 b1 Size = 4 Size = 4 b1 Size = 5 Size = 6 b1  Como podemos ver en el gráfico se asigna el Size = 4 objeto b1 en las posiciones 0 y 1 del array, al imprimirlo da como resultado 4, 4. La respuesta correcta es la A b2 b1 Esta pregunta cubre el objetivo 7.3. Size = 6 Size = 4
  • 95. What is the result?  A. 2  B. 3  C. 4  D. 5  E. Compilation fails  F. An exception is thrown at runtime
  • 96. La respuesta correcta es la E, el código presenta error de compilación, porque en la línea 9, no se inicializó la variable x, recuerde que una variable local para poderse usar debe inicializarse. Esta pregunta cubre el objetivo 1.3