10.11. Multiple-Choice Exercises¶
10.11.1. Easier Multiple Choice Questions¶
- Initialize the fields in the object.
- A constructor is often used to initialize the fields to their default values or in the case of a parameterized constructor, to the values passed in to the constructor.
- Determines the amount of space needed for an object and creates the object.
- The object is already created before the constructor is called.
- Names the new object.
- Constructors do not name the object.
10-11-1: What best describes the purpose of a class’s constructor?
- The methods do different things.
- Methods that do different things should be named differently.
- The methods have different parameter names.
- There is no reason the parameter names ought to be different if the two methods are performing the same action.
- The methods have different post-conditions.
- If the methods have different post-conditions, they are performing different functions, and should be named differently.
- Two methods with the same name can never be included in the same class.
- If two methods perform the same function, they can be named the same. However, the number of parameters, type of parameters, or order of parameter types must be different.
- The methods have different numbers of parameters
- Overloading occurs when two methods perform the same essential operation, but take a different number and/or type of parameters.
10-11-2: Under which of these conditions is it appropriate to overload a method (ie: the class will contain two methods with the same name)?
- Use four unrelated classes:
Car,Doors,AirConditioning, andMilesPerGallon. - Only
Carshould be a class. The number of doors, flag if it has air conditioning, and the average number of miles per gallon are attributes of a car so they belong in aCarclass. - Use a class
Carwith three subclasses:Doors,AirConditioning, andMilesPerGallon. - Doors, air conditioning, and miles per gallon are not a kind of car. Child classes need to be able to be substituted for the parent class.
- Use a class
Car, with fields:numDoors,hasAir, andmilesPerGallon. - The number of doors, flag if it has air conditioning, and the average number of miles per gallon are attributes of a car. Each of these is a simple value so they can just be fields of a
Carclass. - Use a class
Car, with subclasses ofDoors,AirConditioning, andMilesPerGallon. - A door is not a type of car. A flag for air conditioning is not a type of door, and a miles per gallon is not a type of air conditioning flag. Child classes need to be able to be substituted for the parent class.
- Use classes:
Doors,AirConditioning, andMilesPerGallon, each with a subclassCar. - A class
Carcan't be a subclass of three different classes. Each class can only have one parent class. Also a car is not a type of door, air conditioning flag, or miles per gallon. Child classes need to be able to be substituted for the parent class.
10-11-3: A car dealership needs a program to store information about the cars for sale. For each car, they want to keep track of the following information: number of doors (2 or 4), whether the car has air conditioning, and its average number of miles per gallon. Which of the following is the best design?
- How the methods are implemented.
- Only the programmer of the
Employeeclass must know how the public methods work. The programmer that is using theEmployeeclass can just use the public methods and not worry about how they are implemented. - The method names.
- The programmer who writes the methods will need to know what the names are. The programmer who will use the public methods will also need to know the names of the methods in order to invoke them.
- The method return types.
- In order to use the public methods of the
Employeeclass, a programmer must know the method return types. - Constants
- Constants are public fields and are meant to be used by people using a class.
- The number and types of the method parameters.
- In order to use the public methods of the
Employeeclass, a programmer must know the number of parameters and the type for each parameter.
10-11-4: A program is being written by a team of programmers. One programmer is implementing a class called Employee; another programmer is writing code that will use the Employee class. Which of the following aspects of the public methods and fields of the Employee class does not need to be known by both programmers?
- Create one class
PublishedMaterialwith the requested fields plus type. - This will complicate the process of retrieving objects based on their type. Also if we need to add information that is specific to
BookorMovieorAudioTapeit would be best if these were subclasses ofPublishedMaterial. - Create classes
Book,Movie, andAudioTapewith the requested fields. - This involves writing more code than is necessary (usually people copy and paste the shared code) and makes it harder to fix errors. It would be better to put common fields and methods in the superclass
PublishedMaterialand haveBook,Movie, andAudioTapebe subclasses. - Create one class
BookStorewith the requested fields plus type. - The class name,
BookStore, seems to imply the thing that keeps track of the store. This would be an appropriate class name for an object that handles the items in theBookstore. However, for the published material, it would be better to use a superclassPublishedMaterialand subclasses forBook,MovieandAudioTape. - Create classes for each.
- This is more classes than is necessary. Items such as
Title,Price,ID,AuthorandDatePublishedare simple variables that do not need a class of their own but should be fields in aPublishedMaterialsuperclass, withMovie,AudioTapeandBookas subclasses. - Create the class
PublishedMaterialwith children classes ofBook,Movie, andAudioTape. - We will need to get objects based on their type so we should create classes for
Book,Movie, andAudioTape. They have common fields so we should put these in a common superclassPublishedMaterial.
10-11-5: A bookstore is working on an on-line ordering system. For each type of published material (books, movies, audio tapes) they need to track the id, title, author(s), date published, and price. Which of the following would be the best design?
10.11.2. Medium Multiple Choice Questions¶
- Won't compile since
GradStudentdoesn't have agetInfomethod GradStudentwill inherit thegetInfomethod fromStudent. This would be true ifgetInfowas a private method.- Taco
- Objects know what class they are created as and all methods are resolved starting with that class at run time. If the method isn't found in that class the parent class is checked (and so on until it is found). So it will first look for
getInfoinGradStudentand when it doesn't find it it will look inStudent. IngetInfoit callsthis.getFood. Again, it will first look for this method inGradStudent. It will find thegetFoodmethod there and return "Taco". - Pizza
- This would be true if it was
Student s1 = new Student(); - Won't compile since you are creating a
GradStudent, not aStudent - An object of a subclass can be substituted for a parent class object. A
GradStudentis aStudent. - Won't compile since you use
this.getFood() - In object methods if you leave off the
this.when invoking an object method it will be added for you by the compiler. The keywordthisrefers to the current object which is implicitly passed to all object methods.
10-11-6: Given the following class declarations, what is the output from Student s1 = new GradStudent(); followed by s1.getInfo();?
public class Student {
public String getFood() {
return "Pizza";
}
public String getInfo() {
return this.getFood();
}
}
public class GradStudent extends Student {
public String getFood() {
return "Taco";
}
}
- I only
- I is wrong because
yis a private field and thus can not be directly accessed from code in a client class. - II only
- I is wrong because
yis a private field and thus can not be directly accessed from code in a client class. II is correct becauseEnhancedItemhassetYas a public method. III is correct becauseEnhancedIteminherits the public methodsetXfromItem. - I and II only
- I is wrong because
yis a private field and thus can not be directly accessed from code in a client class. - II and III only
- I is wrong because
yis a private field and thus can not be directly accessed from code in a client class. II is correct becauseEnhancedItemhassetYas a public method. III is correct becauseEnhancedIteminherits the public methodsetXfromItem. - I, II, and III
- I is wrong because
yis a private field and thus can not be directly accessed from code in a client class.
10-11-7: Given the following class declarations, and EnhancedItem enItemObj = new EnhancedItem(); in a client class, which of the following statements would compile?
public class Item
{
private int x;
public void setX(int theX)
{
x = theX;
}
// ... other methods not shown
}
public class EnhancedItem extends Item
{
private int y;
public void setY(int theY)
{
y = theY;
}
// ... other methods not shown
}
I. enItemObj.y = 32;
II. enItemObj.setY(32);
III. enItemObj.setX(52);
- t1.method1(t1,t1);
- You can't pass an object of class
Test1since it is not either an object of typeTest2or an object of typeTest3. You can pass the specified type or an object that is a subclass of the specified type butTest1is not a subclass ofTest2orTest3. - t2.method1(t2,t2);
- You can't pass an object of class
Test2as a parameter of typeTest3.Test2is the parent class ofTest3not a subclass. You can pass an object of the specified type or an object of any subclass. - t3.method1(t1,t1);
- You can't pass an object of class
Test1since it is not either an object of typeTest2or an object of typeTest3. You can pass the specified type or an object that is a subclass of the specified type butTest1is not a subclass ofTest2orTest3. - t2.method1(t3,t2);
- You can't pass
t2as an object of typeTest3since it is an object of classTest2and classTest2is not either classTest3or a subclass of classTest3. ClassTest2is the parent of classTest3. - t3.method1(t3,t3);
- Since
method1is a public method of classTest1objects of any subclasses ofTest1can invoke the method. So, it can be invoked ont3since it is an object ofTest3and this is a subclass ofTest1. And, sincemethod1takes an object of classTest2andTest3as parameters. This actually means it can take an object ofTest2or any subclass ofTest2and an object ofTest3or any subclass ofTest3. So it can taket3which is an object of classTest3as an object ofTest2sinceTest3is a subclass ofTest2.
10-11-8: Given the following class declarations and initializations in a client program, which of the following is a correct call to method1?
public class Test1
{
public void method1(Test2 v1, Test3 v2)
{
// rest of method not shown
}
}
public class Test2 extends Test1
{
}
public class Test3 extends Test2
{
}
The following initializations appear in a different class.
Test1 t1 = new Test1();
Test2 t2 = new Test2();
Test3 t3 = new Test3();
- Meow Moo Woof Awk Awk
- Objects keep a reference to the class that created them. So, even if you put them in an array of
Animalobjects, they know what they are and all methods are resolved starting with the class of the object.BirdandPigdo not override speak so thespeakmethod inAnimalwill execute. - Awk Awk Awk Awk Awk
- Methods are always resolved starting with the class of the object, so
Cat,Cow, andDogwill all execute their overriddenspeakmethods, so the output will be: Meow Moo Woof Awk Awk. - This will not compile
- Because
Bird,Cow,Cat,Dog, andPigare subclasses ofAnimal, they can be stored in an array declared asAnimalwithout any compile time errors. - This will have runtime errors
- Because
Bird,Cow,Cat,Dog, andPigare subclasses ofAnimal, they can be stored in an array declared asAnimalwithout any runtime errors. - Meow Moo Woof Oink Awk
- The
Pigclass did not override thespeakmethod, so it will use the method fromAnimal, thus the output should be: Meow Moo Woof Awk Awk
10-11-9: If you have a parent class Animal that has a method speak() which returns: Awk. Cat has a speak method that returns: Meow. Bird does not have a speak method. Dog has a speak method that returns: Woof. Pig does not have a speak method. Cow has a speak method that returns: Moo. What is the output from looping through the array a created below and asking each element to speak()?
Animal[] a = { new Cat(), new Cow(), new Dog(), new Pig(), new Bird() }
- The code compiles and runs with no errors, the output is 5 6 5 6
RaceCar, while it inherits methods fromCarvia inheritance, has a separate and different constructor that sets the initial fuel amount to2 * g, thus in this case,fuelforfastCaris set to10initially.- The code compiles and runs with no errors, the output is: 5 6 10 11
- The code compiles correctly, and because
RaceCarextends theCarclass, all the public methods ofCarcan be used byRaceCarobjects. Also, a variableCarcan refer to aCarobject or an object of any subclass ofCar. An object always knows the class that created it, so even thoughfastCaris declared to be aCarthe constructor that is executed is the one forRaceCar. - The code compiles and runs with no errors, the output is 10 11 10 11
- The variable
caris aCarobject, so the constructor used is not the same as thefastCarobject which is aRaceCar. Thecarconstructor does not change the passed in parameter, so it is set to5initially. - The code won't compile.
RaceCarinherits from theCarclass so all the public methods inCarcan be accessed by any object of theRaceCarclass.- You get a runtime error
ClassCastException, whenfastCar.addFuel()is executed. RaceCarinherits from theCarclass so all the public methods inCarcan be accessed by any object of theRaceCarclass.
10-11-10: Given the following class declarations and code, what is the result when the code is run?
public class Car
{
private int fuel;
public Car() { fuel = 0; }
public Car(int g) { fuel = g; }
public void addFuel() { fuel++; }
public void display() { System.out.print(fuel + " "); }
}
public class RaceCar extends Car
{
public RaceCar(int g) { super(2*g); }
}
What is the result when the following code is compiled and run?
Car car = new Car(5);
Car fastCar = new RaceCar(5);
car.display()
car.addFuel();
car.display();
fastCar.display();
fastCar.addFuel();
fastCar.display();
- I only
- Both I and III are correct. I is correct because variable
bhas been declared to be an object of the classBookso you can invoke any public methods that are defined in theBookclass or in parents ofBook. II is not correct because you can't invoke methods in theDictionaryclass directly onbsincebis declared to be of typeBooknot typeDictionaryandDictionaryis a subclass ofBooknot a parent class ofBook. III is correct because you can castbto typeDictionaryand then invoke public methods inDictionary. - II only
- You can't invoke methods in the
Dictionaryclass directly onbsincebis declared to be of typeBooknot typeDictionaryandDictionaryis a subclass ofBooknot a parent class ofBook. The compiler checks that the method exists on the declared class type, not the run-time type of the object. - I and III only
- I is correct because variable
bhas been declared to be an object of the classBookso you can invoke any public methods that are defined in theBookclass or in parents ofBook. II is not correct because you can't invoke methods in theDictionaryclass directly onbsincebis declared to be of typeBooknot typeDictionaryandDictionaryis a subclass ofBooknot a parent class ofBook. III is correct because you can castbto typeDictionaryand then invoke public methods inDictionary. - III only
- I is also correct.
- I, II, and III
- You can't invoke methods in the
Dictionaryclass directly onbsincebis declared to be of typeBooknot typeDictionaryandDictionaryis a subclass ofBooknot a parent class ofBook. The compiler checks that the method exists on the declared class, not the run-time class.
10-11-11: Given the following class declarations and code, what is the result when the code is run?
public class Book
{
public String getISBN()
{
// implementation not shown
}
// constructors, fields, and other methods not shown
}
public class Dictionary extends Book
{
public String getDefinition(String word)
{
// implementation not shown
}
// constructors, fields, and methods not shown
}
Assume that the following declaration appears in a client class.
Book b = new Dictionary();
Which of the following statements would compile without error?
I. b.getISBN();
II. b.getDefinition("wonderful");
III. ((Dictionary) b).getDefinition("wonderful");
- Lasagna Meow Screeech
- The baseclass constructor runs first so Animal doesn't have one so then it goes to Cat's constructor and then Garfield's constructor
- Meow Screeech Lasagna
- The baseclass constructor runs first so Animal doesn't have one so then it goes to Cat's constructor and then Garfield's constructor
- Screeech Meow Lasagna
- The baseclass constructor runs first so Animal doesn't have one so then it goes to Cat's constructor and then Garfield's constructor
- Lasagna Screeech Meow
- The baseclass constructor runs first so Animal doesn't have one so then it goes to Cat's constructor and then Garfield's constructor
10-11-12: What is the output of the following code?
class Animal
{
void someSound()
{
System.out.print("Screeech ");
}
}
class Cat extends Animal
{
public Cat()
{
System.out.print("Meow ");
super.someSound();
}
}
class Garfield extends Cat
{
public Garfield()
{
System.out.print("Lasagna ");
}
}
public class MainClass
{
public static void main(String[] args)
{
Garfield garfield = new Garfield();
}
}
10.11.3. Hard Multiple Choice Questions¶
- ABDC
- Even though b is declared as type
Baseit is created as an object of theDerivedclass, so all methods to it will be resolved starting with theDerivedclass. So themethodOne()inDerivedwill be called. This method first callssuper.methodOneso this will invoke the method in the superclass (which isBase). So next themethodOneinBasewill execute. This prints the letter "A" and invokesthis.methodTwo(). Sincebis really aDerivedobject, we check there first to see if it has amethodTwo. It does, so execution continues in theDerivedclassmethodTwo. This method invokessuper.methodTwo. So this will invoke the method in the super class (Base) namedmethodTwo. This method prints the letter "B" and then returns. Next the execution returns from the call to thesuper.methodTwoand prints the letter "D". We return to theBaseclassmethodOneand return from that to theDerivedclassmethodOneand print the letter "C". - AB
- This would be true if the object was created of type
Base. But the object is really aDerivedobject. So all methods are looked for starting with theDerivedclass. - ABCD
- After the call to
methodOnein the super class printing "A", the code continues with the implicitthis.methodTwowhich resolves from the current object's class which isDerived. Next,methodTwoin theDerivedclass is executed which then callssuper.methodTwowhich invokesprintln"B" frommethodTwoin theBaseclass. Then the "D" in theDerivedmethodTwois printed. Finally the program returns tomethodOnein theDerivedclass are prints "C". - ABC
- The call to
methodTwoinsuper.methodOneis tothis.methodTwowhich is the method from theDerivedclass. Consequently the "D" is also printed.
10-11-13: Assume that Base b = new Derived(); appears in a client program. What is the result of the call b.methodOne();?
public class Base
{
public void methodOne()
{
System.out.print("A");
methodTwo();
}
public void methodTwo()
{
System.out.print("B");
}
}
public class Derived extends Base
{
public void methodOne()
{
super.methodOne();
System.out.print("C");
}
public void methodTwo()
{
super.methodTwo();
System.out.print("D");
}
}
- II only
Point2Ddoes have a constructor that takes anxandyvalue so this is okay. Also the call to super is the first line of code in the child constructor as required. However, both I and III are okay as well.- III only
- The
xandyvalues inPoint2Dare public and so can be directly accessed by all classes including subclasses. Also there is a no-arg constructor inPoint2Dso the super no-arg constructor will be called before the first line of code in this constructor. - I, II, and III
- I is true because
Point2Ddoes have a no-arg constructor. II is true becausePoint2Ddoes have a constructor that takesxandy. III is true becausePoint2Ddoes have a no-arg constructor which will be called before the first line of code is executed in this constructor. The fieldsxandyare public inPoint2Dand thus can be directly accessed by all classes. - I and II only
- This would be true if
xandywere private inPoint2D, but they are public. - I only
Point2Ddoes have a no-arg constructor and since the constructor inPoint3Ddoesn't have an explicit call to super as the first line of code in the constructor one will be added for the no-arg constructor. However, both II and III are okay as well.
10-11-14: If you have the following classes. Which of the following constructors would be valid for Point3D?
public class Point2D {
public int x;
public int y;
public Point2D() {}
public Point2D(int x,int y) {
this.x = x;
this.y = y;
}
// other methods
}
public class Point3D extends Point2D
{
public int z;
// other code
}
I. public Point3D() {}
II. public Point3D(int x, int y, int z)
{
super(x,y);
this.z = z;
}
III. public Point3D(int x, int y)
{
this.x = x;
this.y = y;
this.z = 0;
}