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