Chapter 2 Review Questions Flashcards
1.Which of the following are valid Java identifiers? (Choose all that apply.)
A. _
B. _helloWorld$
C. true
D. java.lang
E. Public
F. 1980_s
G. _Q2_
B, E, G.
- Option A is invalid because a single underscore is no longer allowed as an identifier as of Java 9.
- Option B is valid because you can use an underscore within identifiers, and a dollar sign ($) is also a valid character.
- Option C is not a valid identifier because true is a Java reserved word.
- Option D is not valid because a period (.) is not allowed in identifiers.
- Option E is valid because Java is case sensitive. Since Public is not a reserved word, it is allowed as an identifier, whereas public would not be allowed.
- Option F is not valid because the first character is not a letter, dollar sign ($), or underscore (_).
- Finally, option G is valid as identifiers can contain underscores (_) and numbers, provided the number does not start the identifier.
2, What lines are printed by the following program? (Choose all that apply.)
1: public class WaterBottle { 2: private String brand; 3: private boolean empty; 4: public static float code; 5: public static void main(String[] args) { 6: WaterBottle wb = new WaterBottle(); 7: System.out.println("Empty = " + wb.empty); 8: System.out.println("Brand = " + wb.brand); 9: System.out.println("Code = " + code); 10: } }
A. Line 8 generates a compiler error.
B. Line 9 generates a compiler error.
C. Empty =
D. Empty = false
E. Brand =
F. Brand = null
G. Code = 0.0
H. Code = 0f
D, F, G
D, F, G. The code compiles and runs without issue, so options A and B are incorrect. A boolean field initializes to false, making option D correct with Empty = false being printed. Object references initialize to null, not the empty String, so option F is correct with Brand = null being printed. Finally, the default value of floating-point numbers is 0.0. Although float values can be declared with an f suffix, they are not printed with an f suffix. For these reasons, option G is correct and Code = 0.0 is printed.
3. Which of the following code snippets about var compile without issue when used in a method? (Choose all that apply.)
A. var spring = null;
B. var fall = “leaves”;
C. var evening = 2; evening = null;
D. var night = new Object();
E. var day = 1/0;
F. var winter = 12, cold;
G. var fall = 2, autumn = 2;
H. var morning = “”; morning = null;
B, D, E, H.
- A var cannot be initialized with a null value without a type, but it can be assigned a null value if the underlying type is not a primitive. For these reasons, option H is correct, but options A and C are incorrect.
- Options B and D are correct as the underlying types are String and Object, respectively.
- Option E is correct, as this is a valid numeric expression. You might know that dividing by zero produces a runtime exception, but the question was only about whether the code compiled.
- Finally, options F and G are incorrect as var cannot be used in a multiple-variable assignment.
4. Which of the following statements about the code snippet are true?
(Choose all that apply.)
4: short numPets = 5L; 5: int numGrains = 2.0; 6: String name = "Scruffy"; 7: int d = numPets.length(); 8: int e = numGrains.length; 9: int f = name.length();
A. Line 4 generates a compiler error.
B. Line 5 generates a compiler error.
C. Line 6 generates a compiler error.
D. Line 7 generates a compiler error.
E. Line 8 generates a compiler error.
F.Line 9 generates a compiler error.
A, B, D, E.
Line 4 does not compile because the L suffix makes the literal value a long, which cannot be stored inside a short directly, making option A correct. Line 5 does not compile because int is an integral type, but 2.0 is a double literal value, making option B correct. Line 6 compiles without issue. Lines 7 and 8 do not compile because numPets and numGrains are both primitives, and you can call methods only on reference types, not primitive values, making options D and E correct, respectively. Finally, line 9 compiles because there is a length() method defined on String.
5. Which statements about the following class are true? (Choose all that apply.)
1: public class River { 2: int Depth = 1; 3: float temp = 50.0; 4: public void flow() { 5: for (int i = 0; i < 1; i++) { 6: int depth = 2; 7: depth++; 8: temp--; 9: } 10: System.out.println(depth); 11: System.out.println(temp); } 12: public static void main(String... s) { 13: new River().flow(); 14: } }
A. Line 3 generates a compiler error.
B. Line 6 generates a compiler error.
C. Line 7 generates a compiler error.
D. Line 10 generates a compiler error.
E. The program prints 3 on line 10.
F. The program prints 4 on line 10.
G. The program prints 50.0 on line 11.
H. The program prints 49.0 on line 11.
A, D.
- The class does not compile, so options E, F, G, and H are incorrect. You might notice things like loops and increment/decrement operators in this problem, which we will cover in the next two chapters, but understanding them is not required to answer this question.
- The first compiler error is on line 3. The variable temp is declared as a float, but the assigned value is 50.0, which is a double without the F/f postfix. Since a double doesn’t fit inside a float, line 3 does not compile.
- Next, depth is declared inside the for loop and only has scope inside this loop. Therefore, reading the value on line 10 triggers a compiler error. Note that the variable Depth on line 2 is never used. Java is case sensitive, so Depth and depth are distinct variables. For these reasons, options A and D are the correct answers.
6. Which of the following are correct? (Choose all that apply.)
A. An instance variable of type float defaults to 0.
B. An instance variable of type char defaults to null.
C. An instance variable of type double defaults to 0.0.
D. An instance variable of type int defaults to null.
E. An instance variable of type String defaults to null.
F. An instance variable of type String defaults to the empty string ""
.
G. None of the above
C, E.
- Option C is correct because float and double primitives default to 0.0, which also makes option A incorrect.
- Option E is correct because all nonprimitive values default to null, which makes option F incorrect.
- Option D is incorrect because int primitives default to 0.
- Option B is incorrect because char defaults to the NUL character, ‘\u0000’. You don’t need to know this value for the exam, but you should know the default value is not null since it is a primitive.
7. Which of the following are correct? (Choose all that apply.)
A. A local variable of type boolean defaults to null.
B. A local variable of type float defaults to 0.0f.
C. A local variable of type double defaults to 0.
D. A local variable of type Object defaults to null.
E. A local variable of type boolean defaults to false.
F. A local variable of type float defaults to 0.0.
G. None of the above
G
G. Option G is correct because local variables do not get assigned default values. The code fails to compile if a local variable is used when not being explicitly initialized. If this question were about instance variables, options B, D, and E would be correct. A boolean primitive defaults to false, and a float primitive defaults to 0.0f.
8. Which of the following are true? (Choose all that apply.)
A. A class variable of type boolean defaults to 0.
B. A class variable of type boolean defaults to false.
C. A class variable of type boolean defaults to null.
D. A class variable of type long defaults to null.
E. A class variable of type long defaults to 0L.
F. A class variable of type long defaults to 0.
G. None of the above
B, E.
- Option B is correct because boolean primitives default to false.
- Option E is correct because long values default to 0L.
9. Which of the following statements about garbage collection are correct? (Choose all that apply.)
A. Calling System.gc() is guaranteed to free up memory by destroying objects eligible for garbage collection.
B. Garbage collection runs on a set schedule.
C. Garbage collection allows the JVM to reclaim memory for other objects.
D. Garbage collection runs when your program has used up half the available memory.
E. An object may be eligible for garbage collection but never removed from the heap.
F. An object is eligible for garbage collection once no references to it are accessible in the program.
G. Marking a variable final means its associated object will never be garbage collected.
C, E, F.
- In Java, there are no guarantees when garbage collection will run. The JVM is free to ignore calls to System.gc(). For this reason, options A, B, and D are incorrect.
- Option C is correct, as the purpose of garbage collection is to reclaim used memory.
- Option E is also correct that an object may never be garbage collected, such as if the program ends before garbage collection runs.
- Option F is correct and is the primary means by which garbage collection algorithms determine whether an object is eligible for garbage collection.
- Finally, option G is incorrect as marking a variable final means it is constant within its own scope. For example, a local variable marked final will be eligible for garbage collection after the method ends, assuming there are no other references to the object that exist outside the method.
10.Which statements about the following class are correct? (Choose all that apply.)
1: public class PoliceBox { 2: String color; 3: long age; 4: public void PoliceBox() { 5: color = "blue"; 6: age = 1200; 7: } 8: public static void main(String []time) { 9: var p = new PoliceBox(); 10: var q = new PoliceBox(); 11: p.color = "green"; 12: p.age = 1400; 13: p = q; 14: System.out.println("Q1="+q.color); 15: System.out.println("Q2="+q.age); 16: System.out.println("P1="+p.color); 17: System.out.println("P2="+p.age); 18: } }
A. It prints Q1=blue.
B. It prints Q2=1200.
C. It prints P1=null.
D. It prints P2=1400.
E. Line 4 does not compile.
F. Line 12 does not compile.
G. Line 13 does not compile.
H. None of the above
C.
- The class does compiles without issue, so options E, F, and G are incorrect.
- The key thing to notice is line 4 does not define a constructor, but instead a method named PoliceBox(), since it has a return type of void. This method is never executed during the program run, and color and age get assigned the default values null and 0L, respectively.
- Lines 11 and 12 change the values for an object associated with p, but then on line 13 the p variable is changed to point to the object associated with q, which still has the default values. For this reason, the program prints Q1=null, Q2=0, P1=null, and P2=0, making option C the only correct answer.
11. Which of the following legally fill in the blank so you can run the main() method from the command line? (Choose all that apply.)
public static void main(\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_) {}
A. String… var
B. String My.Names[]
C. String[] 123
D. String[] _names
E. String… $n
F. var names
G. String myArgs
A, D, E.
- From Chapter 1, a main() method must have a valid identifier of type String… or String[]. For this reason, option G can be eliminated immediately.
- Option A is correct because var is not a reserved word in Java and may be used as an identifier.
- Option B is incorrect as a period (.) may not be used in an identifier.
- Option C is also incorrect as an identifier may include digits but not start with one.
- Options D and E are correct as an underscore (_) and dollar sign ($) may appear anywhere in an identifier. Finally, option F is incorrect, as a var may not be used as a method argument.
12. Which of the following expressions, when inserted independently into the blank line, allow the code to compile? (Choose all that apply.)
public void printMagicData() { double magic = \_\_\_\_\_\_\_\_\_\_; System.out.println(magic); }
A. 3_1
B. 1_329_.0
C. 3_13.0_
D. 5_291._2
E. 2_234.0_0
F. 9___6
G. _1_3_5_0
H. None of the above
A, E, F.
- An underscore (_) can be placed in any numeric literal, so long as it is not at the beginning, the end, or next to a decimal point (.). Underscores can even be placed next to each other. For these reasons, options A, E, and F are correct.
- Options B and D are incorrect, as the underscore (_) is next to a decimal point (.). Options C and G are incorrect, because an underscore (_) cannot be placed at the beginning or end of the literal.
13. Suppose we have a class named Rabbit. Which of the following statements are true? (Choose all that apply.)
1: public class Rabbit { 2: public static void main(String[] args) { 3: Rabbit one = new Rabbit(); 4: Rabbit two = new Rabbit(); 5: Rabbit three = one; 6: one = null; 7: Rabbit four = one; 8: three = null; 9: two = null; 10: two = new Rabbit(); 11: System.gc(); 12: } }
A. The Rabbit object created on line 3 is first eligible for garbage collection immediately following line 6.
B. The Rabbit object created on line 3 is first eligible for garbage collection immediately following line 8.
C. The Rabbit object created on line 3 is first eligible for garbage collection immediately following line 12.
D. The Rabbit object created on line 4 is first eligible for garbage collection immediately following line 9.
E. The Rabbit object created on line 4 is first eligible for garbage collection immediately following line 11.
F. The Rabbit object created on line 4 is first eligible for garbage collection immediately following line 12.
G. The Rabbit object created on line 10 is first eligible for garbage collection immediately following line 11.
H. The Rabbit object created on line 10 is first eligible for garbage collection immediately following line 12.
B, D, H.
The Rabbit object from line 3 has two references to it: one and three. The references are set to null on lines 6 and 8, respectively. Option B is correct because this makes the object eligible for garbage collection after line 8. Line 7 sets the reference four to null, since that is the value of one, which means it has no effect on garbage collection. The Rabbit object from line 4 has only a single reference to it: two. Option D is correct because this single reference becomes null on line 9. The Rabbit object declared on line 10 becomes eligible for garbage collection at the end of the method on line 12, making option H correct. Calling System.gc() has no effect on eligibility for garbage collection.
14.Which of the following statements about var are true? (Choose all that apply.)
A. A var can be used as a constructor parameter.
B. The type of var is known at compile time.
C. A var cannot be used as an instance variable.
D. A var can be used in a multiple variable assignment statement.
E. The value of var cannot change at runtime.
F. The type of var cannot change at runtime.
G. The word var is a reserved word in Java.
B, C, F.
- A var cannot be used for a constructor or method parameter or for an instance or class variable, making option A incorrect and option C correct.
- The type of var is known at compile-time and the type cannot be changed at runtime, although its value can change at runtime. For these reasons, options B and F are correct, and option E is incorrect.
- Option D is incorrect, as var is not permitted in multiple-variable declarations. Finally, option G is incorrect, as var is not a reserved word in Java.
15. Given the following class, which of the following lines of code can independently replace INSERT CODE HERE to make the code compile?(Choose all that apply.)
public class Price { public void admission() { INSERT CODE HERE System.out.print(amount); } }
A. int Amount = 0b11;
B. int amount = 9L;
C. int amount = 0xE;
D. int amount = 1_2.0;
E. double amount = 1_0_.0;
F. int amount = 0b101;
G. double amount = 9_2.1_2;
H. double amount = 1_2_.0_0;
C, F, G.
- First off, 0b is the prefix for a binary value, and 0x is the prefix for a hexadecimal value. These values can be assigned to many primitive types, including int and double, making options C and F correct.
- Option A is incorrect because naming the variable Amount will cause the System.out.print(amount) call on the next line to not compile.
- Option B is incorrect because 9L is a long value. If the type was changed to long amount = 9L, then it would compile.
- Option D is incorrect because 1_2.0 is a double value. If the type was changed to double amount = 1_2.0, then it would compile.
- Options E and H are incorrect because the underscore (_) appears next to the decimal point (.), which is not allowed.
- Finally, option G is correct and the underscore and assignment usage is valid.