• Save
Certificación java 6 cap 3
Upcoming SlideShare
Loading in...5
×
 

Certificación java 6 cap 3

on

  • 1,238 views

Capítulo 3 - Asignaciones - SCJP Sun Certified Programmer for Java 6 Exam 310-065

Capítulo 3 - Asignaciones - SCJP Sun Certified Programmer for Java 6 Exam 310-065

Statistics

Views

Total Views
1,238
Views on SlideShare
1,220
Embed Views
18

Actions

Likes
1
Downloads
0
Comments
0

4 Embeds 18

http://certificandomeenjava.blogspot.com 10
http://certificandomeenjava.blogspot.mx 4
http://certificandomeenjava.blogspot.ca 3
http://certificandomeenjava.blogspot.fr 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Certificación java 6 cap 3 Certificación java 6 cap 3 Presentation Transcript

  • 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 HexadecimalesDecimales Octales HexadecimalesSon los números Son los números con base 8. Son los números con basenormales, que están 15.en base 1o. Los valores válidos van de 0 a 7 Los valores válidos van deSe representan de Se representan anteponiendo 0 a 9 y de A hasta Funa notación normal un 0 Se representan colcandoint 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 DoubleMiden 32 bytes Miden 64 bytesSe define colocando al final una F, es Se define colocando una D al final, esobligatorio de lo contrario puede haber opcional.error de compilador por perdida deprecisiónfloat 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 thethe 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 = 0El 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 inicializadoyear se inicializóexplícitamente, por lotanto 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 DimensionAunque se cambia el valor a Weight = 5del atributo en el objeto b, Height = 30 btambién cambia en a, porque a y bapuntan 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 JavaLa excepción de la regla de la diapositiva Stringanterior es el objeto String, cuando unomaneja un objeto String se habilita un pool x Java Beande Strings, el sistema cada vez que semodifica una cadena el sistema crea un y string = JavaString nuevo y lo asigna a la variableCorrespondiente, por lo tanto aunque no se ve, en realidad el sistema empieza a usar dosobjetos 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 thatperform 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 dEn el caso de paso de objetos de referencia, After modify() d.height = 10se aplica el principio del manejo de paso de objetos dereferencia, cuando se pasa un objeto de referencia al método, el objeto que entra al métodoapunta también al mismo espacio de memoria del objeto original, por lo tanto cualquiercambio 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 objetivo1.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 objetocompuesto de varios objetos, segundo cada una de la posiciones tiene un índice y esteempieza 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 quese 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ónAquí 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 arrayde 2posiciones, y otro de 3 posiciones. El compilador de java entoces ve un objetocompuesto de 3 objetos Arrays de tipo int, que a su vez estan compuestos de 2 arrays parael de la posición 0, uno de 3 en la posición 1, y nada para la posición 2 porque no se hadeclarado
  •  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 arrayes un objeto tipo Cat, y un objeto no se un objeto, tampoco se puede hacer lopuede 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 constRecuerde el orden de ejecución es: Static -> bloques -> ConstructorLos métodos estáticos solo se corren una vez, los bloques y los constructorescada vez que se crea un objeto.
  • Cubre el objetivo3.1 Develop code that uses the primitive wrapper classes (such as Boolean, Character, Double, Integer, etc.), and/orautoboxing & 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.41.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 variableEn el caso de enfrentarse dos variablesmayores donde toque hacer upgrade y unvarargs ganan las variables En el caso de enfrentarse dos variables wrapper donde toque hacer boxing y un varargs ganan el wrapperFinalmente podemos concluir que el gran ganador es la variable donde toca hacerupdate, luego los wrappers donde se hace boxing y finalmente los varags son la últimaopció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.47.4 Given a code example, recognize the point at which an object becomes eligible for garbage collection, anddetermine what is and is not guaranteed by the garbage collection system, and recognize the behaviors of theObject 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. 0B. 1C. 2D. Compilation failsE. It is not possible to knowF. 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. manyB. a fewC. Compilation failsD. The output is not predictableE. 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. 2B. 4C. An exception is thrown at runtimeD. Compilation fails due to an error on line 4E. Compilation fails due to an error on line 5F. Compilation fails due to an error on line 6G. 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