Problem 1. (6 points) Quickies.
a. A final field is set by an initializer and cannot change. Since it usually has the same value for every object in the class, there's no point in having a separate copy of that value for every object.
b. Errors that might be produced by the code line Object o = s.subString(0);
c. The switch statement is buggy because it is missing break statements at the end of each case (or at least the first two). For instance, it will always report that i/3 has a remainder of 2, regardless of the value of i.
d.
public void moveToEnd() { // Moves the first node of the list to the end of the list. if (head != null) { tail.next = head; head.prev = tail; tail = head; head = head.next; head.prev = null; tail.next = null; } } }
Problem 2. (5 points) Inheritance.
a. No changes are necessary. No code in the DateAndPlace class attempts to access any fields in the Date class.
b. The last line causes a compile-time error, because the isSamePlace method isn't part of the Date class, and there is no cast to ``reassure'' the compiler that d references a DateAndPlace object.
c. Adding this constructor will cause a compile-time error because there is already a constructor with the same signature.
Problem 3. (5 points) Fields, objects, and the stack.
Problem 4. (6 points) Counting runs.
public int countRuns() { int count = 1; int i; if (myArray.length == 0) { return 0; } for (i = 1; i < myArray.length; i++) { if (myArray[i] != myArray[i - 1]) { count++; } } return count; }To get the classes to compile, you also need to add the following abstract method declaration to the List class.
public abstract int countRuns();(Alternatively, you could have added a non-abstract method with an implementation just so there's a method to override, but the implementation must return some int or it won't compile.)