Errata: A Programmer's Guide to Java™ Certification

A Comprehensive Primer

(First Edition)

Khalid A. Mughal and Rolf W. Rasmussen

ISBN 0201596148

This is an exhaustive list of corrections, etc. for the THIRD PRINTING of the book.

Last updated October 6, 2002.

Acknowledgements:

Many thanks to the following readers for their diligent observations:
Michael F. Adolf, Tony Alicea, Kåre Auglænd, Jorge L. Barroso, Andre Beland, Darren Bruning, Paul Campbell, Roger Chang, Joanna Chappel, Laurian M Chirica, Arkadi Choufrine, Barry Colston, John Cotter, Frédéric Demers, Arthur De Souza, djc, William Ekiel, Darryl Failla, John Finlay, Christopher R. Gardner, Marco Garcia, Peter Gieser, George, Paul Graf, Shyamsundar Gururaj, Ray Ho, Leonardo Holanda, Zhu Hongjun, Kara Van Horn, Peter Horst, Nain Hwu, Kent Johnson, Samir Kanparia, Oleksiy Karpenko, Jeffrey Kenyon, Young Jin Kim, Kenneth Kisser, Billy Kutulas, Yi-Ming Lai, Robert M. Languedoc, Steve Lasley, Winser Lo, Naga Madipalli, Craig Main, Avinash Mandsaurwale, Thomas Mathai, S. Mehra, Yuan Meng, Simon Miller, William Moore, Anders Morch, George A. Murakami, Sandy Nemecek, Chun Pan, Abigail García Patiño, Anil Philip, Alfred Raouf, Peter Rorden, Christian Seifert, Gurpreet Singh, Christopher Stanwood, Swaminathan Subramanian, Siva Sundaram,  Manju Swamy, John Sweeney, Harmon Taylor, Andrew Tolopko, Ravi Verma, Per J. Walstrøm, Chun Wang, James Ward, Winky, Chun Wang, Jimmy Yang, Jennie Yip, Yanqu Zhou, Yingting Zhou.

Changes added October 6, 2002.

Page 22, Table 2.1 Keywords in Java

Add the keyword assert to the table.

Page 43, Casting

The following sentence is not correct:

"Casting the reference literal null, which is not of any type, to a reference type results in a compile time warning."

and should be replaced by:

"The reference literal null can be cast to any reference type."

Page 120, Review Question 4.17

Replace the choices with the following:

(a) Member variable i is accessible in  all classes in other packages. 
(b) Member variable j is accessible in all classes in other packages. 
(c) Member variable k is  accessible in all classes in other packages. 
(d) Member variable k is  accessible in subclasses only in other packages. 
(e) Member variable l is  accessible in all classes in other packages. 
(f) Member variable l is  accessible in subclasses only in other packages.

Page 123, final Members

In the middle of the page, replace the line beginning with:

" setKWH from the superclass ... "

with:

" setWatts() from the superclass ... "

Page 186, Review Question 6.5

Change choice (e) 

(e) The overriding method can have a different return value than the overridden method.

to (replace "value" with "type"):

(e) The overriding method can have a different return type than the overridden method.

Page 235, Example 7.6 Inheritance and Containment Hierarchy

With line (2) uncommented, the compiler distributed with J2SE 1.4 compiles the code without error. However, this is a recent change to the Sun compiler. We cannot see that the Java Language Specification (JLS) has been changed to allow such disambiguation, and other standards compliant compilers such as IBM's Jikes still reject the code. We don't know whether this is a case of misinterpreting the JLS, or a bug in the Sun Java compiler distributed with J2SE 1.4.

Page 284, Thread States

In the paragraph for Blocked state, make the following two changes:

Change "Blocking state" to "Blocked state".

Change the sentence:

"A thread also blocks if it fails ..."

to:

"A thread will be blocked if it fails ..."

Page 296, Section 10.1 Overview of the java.lang package

The bullet:

"The wrapper classes (Boolean, Character, Number, Byte, Short, Integer, Long, Float, Double)"

should read (delete Number):

"The wrapper classes (Boolean, Character, Byte, Short, Integer, Long, Float, Double)"

Page 320, Controlling String Buffer Capacity

In the middle of the page, change "\u0000" to '\u0000'

Page 333, Section 11.4 Lists

The sentence:

"The remove() method deletes and returns the element at the specified index, contracting the list accordingly."

should read:

"The remove(int index) method deletes and returns the element at the specified index, contracting the list accordingly."

Page 379, Example 12.12 Illustrating Menus

The following import statement can be deleted: 

import java.applet.*;

Page 469, Drawing Polygons

The sentence:

"The Polygon class has the following constructors:"

should read:

"The Polygon class has the following constructor:"

Page 569, Table 18.6 Writers

In the row for the PrintWriter, change the sentence:

"A filter that allows textual representations of ..."

to:

"A writer that allows textual representations of ..."

Page 583, Section 18.5 Random Access for Files

Change the exception in the constructors:

RandomAccessFile(String name, String mode) throws IOException
RandomAccessFile(File file, String mode) throws IOException

to:

RandomAccessFile(String name, String mode) throws FileNotFoundException
RandomAccessFile(File file, String mode) throws FileNotFoundException

Changes added December 22, 2001.

Page 3, Declaring Members: Variables and Methods

In the middle of the page, replace the following:

"It also has a special method that has the same name as the class. Such methods are called constructors, ..."

with:

"It also has a special method-like declaration that has the same name as the class, (2). Such declarations are called constructors, ..."

Page 7, Section 1.5 Static Members

In the middle of the page, replace the sentence:

"Static members are distinguished from instance variables in a class definition by the keyword static in their declaration."

with:

"Static members are distinguished from instance members in a class definition by the keyword static in their declaration."

Page 24, Table 2.6 Examples of Octal and Hexadecimal Literals in Java

Replace the last row of the table:

-2147483648
-017777777777
-0x7fffffff

with:

-2147483648
-020000000000
-0x80000000

Page 48, Numeric Type Conversions on Assignment

The following paragraph is not correct any more:

"Narrowing conversions between char and byte (or short) values on assignment always require an explicit cast, even if the value is in the range of the destination datatype."

The new rules state that a narrowing primitive conversion is valid if the following conditions are fulfilled:

1. The right-hand side expression (i.e. source) is a constant expression of type byte, short, char or int.
2. The type of the left-hand variable (i.e. destination) is  byte, short, or char.
3. The value of the constant expression is in the range of the destination datatype.

Page 137, switch Statement

Replace the following sentence in the lower half of the page:

"The value LITTLE_ADVICE results in only one advice at (5) being given."

with:

"The value LITTLE_ADVICE results in only one advice at (4) being given."

Page 228, Figure 7.1 Top-level Nested Classes and Interfaces

To make the figure consistent with Example 7.2, do the following:

In the figure, add public accessibility, '+', to the class AccessInTopLevelClass.

In the figure, remove public accessibility, '+', from the interface NestedTopLevelInterface1.

Page 313, Searching for Characters and Substrings

On top of the page, replace the line:

String replace(char old, char new)

with:

String replace(char oldChar, char newChar)

Page 447, Review Question 14.18

Replace the question:

"What would be the effect of calling enableEvent(AWTEvent.KEY_EVENT_MASK) on a component?"

with:

"What would be the effect of calling enableEvents(AWTEvent.KEY_EVENT_MASK) on a component?"

Page 556, Section 18.3 Byte Streams: Input Streams and Output Streams

In the middle of the page, replace the sentence:

"Note that the first read() method read a byte, but returns an int value."

with:

"Note that the first read() method reads a byte, but returns an int value."

Page 558, Searching for Characters and Substrings

In the lower half of the page, replace the line:

FileOutputStream(File file) throws IOException

with:

FileOutputStream(File file) throws FileNotFoundException

Changes added June 29, 2001.

Page ix, Book web sites

Replace the following:

Information about the JDK and its documentation can be found at the following web site:

    <URL:http://java.sun.com/products/jdk/1.2/>

with:

Information about the Java 2 SDK Standard Edition (referred to as JDK in the book) and its documentation can be found at the following web site:

    <URL:http://java.sun.com/j2se/>

Page 40, Programming Exercise 2.1

A short note on creating and using packages.

A package statement can only occur as the first statement in a Java source file.
The statement

package com.acme;

instructs the compiler to place the Java byte code for all the classes (and interface) specified in the source file in the package com.acme.

Think of a package name as a path in the file system.
In this case the package name com.acme corresponds to the path name com/acme. So the Java byte code for all the classes (and interface) specified in the source file Exercise1.java will be placed under the catalog com/acme.

Question: where is com/acme?
You can choose the location of com/acme by using the -d option (d for destination) when compiling with javac. Assume that the current directory is called work, and the source code file Exercise1.java is to be found here. The command

javac -d . Exercise1.java

(note the dot after the -d option to indicate the current directory) will create com/acme under the current directory, and place the Java byte code for all the classes (and interface) in it.

                                  work
                                   |
                        ------------------------
                        |                      |
                  Exercise1.java              com
                                               |
                                              acme
                                               |
                                         Exercise1.class

How do we run the program? Since the current directory is work and we want to run Exercise1.class, the *full name* of the Exercise1 class must be specified in the java command:

java com.acme.Exercise1

This will now result in the main() method from the com.acme.Exercise1 class being executed.

Page 43, Casting

Replace the sentence in the lower part of the page:

"The same applies to the reference literal null, which is not of any type and therefore cannot be cast to any type."

with:

"Casting the reference literal null, which is not of any type, to a reference type results in a compile time warning."

Page 48, Numeric Type Conversions on Assignment

Replace the following line at the top of the page:

    float fast = (float) 100.5D; // Narrowing: double to float.

with (gives a better example of truncating):

    float fast = (float) 300.5D; // Narrowing: double to float.

Page 68, Examples of Bitwise Extended Assignment

Replace the line:

"At (1) in the examples above, both the byte value in v1 and the char value in v2 are first promoted to int."

with:

"At (1) in the examples above, both the char value in v1 and the byte value in v2 are first promoted to int."

Page 68, Shift Operators: <<, >>, >>>

Replace the sentences:

"The number of bits shifted is always in the range modulus 32 for an int value, and in the range modulus 64 for a long value."

with:

"The shift distance is calculated as the value of the expression (right operand value & (size-1)), where size is either 32 or 64 depending on whether the promoted type of the left operand is int or long. Thus the shift distance is always in the range 0 to 31 when the promoted type of left operand is int, and in the range 0 to 63 when the promoted type of left operand is long."

Page 70, The Shift-right-with-sign-fill Operator >>

Replace the following line in the middle of the page:

    = 0xfffffffa

with:

    = 0xfffffffd

Page 71, Shift Extended Assignment Operators: <<=, >>=, >>>=

Replace the following line in the middle of the page:

    = 0xc0

with:

    = 0x80

Page 88, Declaring Array Variables

At the top of the page, replace the following:

"..., and therefore does not apply to local arrays as well (Section 2.9, p. 34)."

with:

"..., and therefore does not apply to local array variables as well (Section 2.9, p. 34)."

Page 92, Figure 4.1 Arrays of Arrays

Extra horizontal line in the class diagram for matrix:double[][] should be deleted.

Page 163, throws Clause

The last sentence of this page:

"The method definition in the subclass can only specify all or none, or a subset of the exception classes (including their subclasses) specified in the throws clause of the overridden method in the superclass."

should be replaced with (insert checked ):

"The method definition in the subclass can only specify all or none, or a subset of the checked exception classes (including their subclasses) specified in the throws clause of the overridden method in the superclass."

Page 181, Variable Shadowing

In the last sentence of this section, replace the following:

"...: the variable accessed is from the class corresponding to the reference type, ..."

with:

"...: the variable accessed is declared in the class corresponding to the reference type, ..."

Page 212, Review Question 6.20

Replace the code lines:

    // Definitions: 
    interface A {}; 
    class B {};
    class C extends B implements A {};
    class D implements A {};

with (remove ;):

    // Definitions:
    interface A {}
    class B {}
    class C extends B implements A {}
    class D implements A {}

Page 254, Finalizer Chaining

In the last line, replace "massage" with "message". :-)

Page 255, Invoking Garbage Collection

Replace the sentence:

"The System.gc() method can be used to force garbage collection, and the System.run Finalization() method can be used to run the finalizers (which have not been executed before) for objects eligible for garbage collection."

with:

"The System.gc() method can be used to request garbage collection, and the System.run Finalization() method can be called to suggest that the finalizers (which have not been executed before) for objects eligible for garbage collection be run."

Page 284, Thread States

In the line that starts "Dead state: ...", replace  "Runnable" with "Running". 

Page 369,  List

Delete the following lines:

    void select(String str)

    Selects the item that matches the argument string in the list.

Page 453, Figure 15.1 Coordinates of a Component

Replace the following in the figure:

    (top, left)

with:

    (left, top)

Page 454, The Graphics Class

Replace the following sentence in the middle of the page:

"The origin of the drawing region in a component is given by (getInsets().top, getInsets().left)."

with:

"The origin of the drawing region in a component is given by (getInsets().left, getInsets().top)."

Page 517, Root Containers

Replace the sentence:

"Root components JComponent, JWindow, JFrame, JDialog and JApplet all extend their respective native AWT components, as shown in Figure 17.5."

with (delete JComponent):

"Root components JWindow, JFrame, JDialog and JApplet all extend their respective native AWT components, as shown in Figure 17.5."

Page 552, Querying the File System

Replace the sentence at the top of the page:

"Also platform-dependent, the canonical path usually specifies a pathname in which all relative references have been completely resolved."

with (insert "absolute"):

"Also platform-dependent, the canonical path usually specifies an absolute pathname in which all relative references have been completely resolved."

Page 558, Table 18.2 Output Streams

Add a horizontal line between DataOutputStream and ObjectOutputStream.

Page 579, Terminal I/O

In the upper half of the page, replace the sentence:

"The PrintStream class is now mostly deprecated, but its print() methods, which act as corresponding print() methods from the PrintWriter class, can still be used to write output to System.out and System.err."

with:

"The PrintStream class offers print() methods which act as corresponding print() methods from the PrintWriter class. These methods can be used to write output to System.out and System.err."

Page 598, Specifying Hyperlinks to Members

To the existing list, add the following:

@see <class-name>#<member-name> <label>
@see <class-name>#<method-signature> <label>
{@link <class-name>#<member-name> <label>}
{@link <class-name>#<method-signature> <label>}

Page 625, Answer to Review Question 2.11 

Additional explanation:

Strict adherence to the Java language specification requires the following declaration to start the execution of a Java program:

public static void main(String[] args)

This does not rule out any other legal non-accessibility modifiers like final. The Java compiler is however taking liberties with the specification allowing other declarations for starting the execution of a Java program.

Page 637, Answer to Review Question 6.2 

See also the note on Inheritance of Superclass Members at the end of this errata. 

Page 641, Answer to Review Question 6.27

Replace the line:

"... , but rather uses the public interface."

with:

"... , but rather uses the public method describe() in class Star to do that."

Page 662, Answer to Review Question 18.2

Replace the answer with:

18.2 (b)

The separator constant is of type String and contains the character used as path separator on the native platform. The most common platforms only use a single character as a path separator.

Page 668, Alternate solution to Programming Exercise 3.2

public class BinConversion {
    public static void main(String args[]) {
       System.out.println(convert(43));
    }
    public static String convert(int i) {
       String res = "";
       do {
           res = i % 2 + res;
           i /= 2;
       } while (i >= 1);
       return res;
    }
}

Page 699, Q2

Choice (d):

The value returned by >>> will never be negative as long as the value of the right operand is not divisible by 32.

should be replaced with:

The value returned by >>> will never be negative as long as the value of the right operand is not divisible by 32, and the left operand is non-negative.

Page 725, Answer to Q29

Replace the answer with:

Q29 (b), (c) and (e)

Unlike local variables, all member variables are initialized with default initial values. All numeric variables are initialized to zero, boolean values to false, char values to '\u0000' and all object reference values to null. (c) occurs when an un-initialized member variable is used in an initializer block before its declaration.

Changes added January 3, 2001.

The Mock Exam Engine

The on-line exam is missing the underscore in choice a) of question 41, page 714, in the book. It says "class" instead of "_class".

Changes added December 22, 2000.

Page 70, The Shift-right-with-sign-fill Operator >>

Replace the line:

"The value for i is shifted right with sign-fill 4 places:"

with (replace 4 with 2):

"The value for i is shifted right with sign-fill 2 places:"

Page 129, Review Question 4.25

Replace choice (d) with (delete the words "The constructor"):

            (d) MyClass() cannot be declared final.

Page 200, Review Question 6.13

Replace the question:

"Given the following variable declaration within the definition of an interface, which of these declarations are equivalent to it?"

with:

"Given the following variable declaration within the definition of an interface, which of these  declarations can be substituted for it?"

Page 230, Example 7.3 Defining Non-static Inner Classes 

Replace the code line:

private static String msg = "Shine the inner light.";     // (2)

with (delete the word static):

private String msg = "Shine the inner light.";            // (2)

Page 399, Review Question 13.11

Replace the question:

"Which of these are methods in the CardLayout class?"

with:

"Which of these method names are in the CardLayout class?"

Page 527, JTree 

Replace the first sentence of the last paragraph:

"A JTree uses an object implementing the TreeCellRenderer interface to render cells in each column of the table."

with:

"A JTree uses an object implementing the TreeCellRenderer interface to render the elements in the tree structure."

Page 632, Answer to Review Question 4.25 

Replace the sentence:

"Only methods can be declared synchronized."

with:

"Only methods and code blocks can be synchronized."

Page 716, Q49

Replace the question:

"Which modifiers and return types would be valid in the declaration of a working main() method for a Java standalone application?"

with:

"Which modifiers and return types would be valid in the declaration of a main() method which starts the execution of a Java standalone application?"

Changes added October 13, 2000.

Page 10, Example 1.3 Defining a Subclass

Replace the code line:

    for (int i = 0; i < stackArray.length; i++)

with:

    for (int i = 0; i <= topOfStack; i++)

Page 20, Exam Objectives

The last bullet (and its sub-bullet) should be deleted:

Page 39, Review Question 2.11

The question:

"Which of these are valid declarations of the main() method?"

should read:

"Which of these are valid declarations of the main() method in order to start the execution of a Java program?"

Page 73, Review Question 3.14

The question:

"Given a variable x of type int (which may contain a negative value), which are correct ways of doubling the value of x?"

should be rephrased:

 "Given a variable x of type int (which may contain a negative value), which are correct ways of doubling the value of x, barring any overflow?"

Page 95, Review Question 4.5

In choice (b), replace:

    IndexArrayOutOfBoundsException

with:

    ArrayIndexOutOfBoundsException

Page 106, Packages

Second paragraph, in the sentence:

"Subpackages do not afford anything extra when it come to accessibility of the members."

replace "come" with "comes":

"Subpackages do not afford anything extra when it comes to accessibility of the members."

Page 111, Review Question 4.15

Replace the code line:

    abstract void haunt()

with (semi-colon missing):

    abstract void haunt();

Page 117, protected Members

Replace the code line:

    objRefA.superclassVarA;               // (4) Not OK.

with:

    objRefA.superclassVarA = 10;          // (4) Not OK.

Page 136, switch Statement

The sentence:

"The <statementi> associated with the first case label that is equal to the value of the integral expression is executed."

should be changed to (delete "first"):

"The <statementi> associated with the case label that is equal to the value of the integral expression is executed."

Page 149, return Statement

The sentence:

"The first form of the return statement can also be used in constructors and initializers, as these also do not return a value."

should be changed to:

"The first form of the return statement can also be used in constructors as these also do not return a value."

Page 163, Section 5.8 throws Clause

Change the last sentence on the page:

"The method definition in the subclass can only specify all or a subset of the exception classes (including their subclasses) specified in the throws clause of the overridden method in the superclass."

to (i.e. insert "or none,"):

"The method definition in the subclass can only specify all or none, or a subset of the exception classes (including their subclasses) specified in the throws clause of the overridden method in the superclass."

Page 165, Review Question 5.16

In choice (c), replace:

    IndexOutOfBoundsException

with:

    ArrayIndexOutOfBoundsException

Page 179, Method Overriding

Change the bullet :

to (i.e. insert "or none,"):

Page 225, Table 7.1 Overview of Classes and Interfaces

Replace the last row of the table for interfaces with the following two rows:
 
Entity  Declaration Context Accessibility Modifiers Outer Instance Direct Access to Enclosing Context Defines Static or Non-static Members
Package level interface As package member public or default No N/A Static variables + non-static method prototypes
Top-level nested interface As static class member all No Static variables in enclosing context Static variables + non-static method prototypes

Page 240, Access Rules for Local Classes

Replace these 2 lines of code:

	double zz = A.this.z;
	...
	double yy = A.this.y;

with

	double zz = TopLevelA.this.z;
	...
	double yy = TopLevelA.this.y;

Page 305, Pseudo Random Number Generator

The sentence:

"The method random() returns a random number greater or equal to 0.0 and less than 1.0, where the value is selected randomly with the range according to a uniform distribution."

should be (change "with" to "from"):

"The method random() returns a random number greater or equal to 0.0 and less than 1.0, where the value is selected randomly from the range according to a uniform distribution."

Page 347, Collection Adapters

Change the code line:

	String[] uniqueJiveArray = (String[])jiveSet.toArray();

to:

	String[] uniqueJiveArray = (String[])jiveSet.toArray(new String[0]);

Page 464, Drawing Rectangles

The method prototypes:

void drawRoundRect (
    int x, int y,         // top left corner
    int width, int height // of rectangle
    int arcWidth, int arcHeight
)
void fillRoundRect (
    int x, int y,         // top left corner
    int width, int height // of rectangle
    int arcWidth, int arcHeight
)
void fill3DRect (
    int x, int y,         // top left corner
    int width, int height // of rectangle
    int arcWidth, int arcHeight,
    boolean raised
)
void draw3DRect (
    int x, int y,         // top left corner
    int width, int height // of rectangle
    int arcWidth, int arcHeight,
    boolean raised
)


void fill3DRect (
    int x, int y,         // top left corner
    int width, int height // of rectangle
    int arcWidth, int arcHeight,
    boolean raised
)

should be changed to (all of them are missing a comma, and in the last 2 prototypes a code line must be deleted):

void drawRoundRect (
    int x, int y,         // top left corner
    int width, int height, // of rectangle
    int arcWidth, int arcHeight
)
void fillRoundRect (
    int x, int y,         // top left corner
    int width, int height, // of rectangle
    int arcWidth, int arcHeight
)
void draw3DRect (
    int x, int y,         // top left corner
    int width, int height, // of rectangle
    boolean raised
)


void fill3DRect (
    int x, int y,         // top left corner
    int width, int height, // of rectangle
    boolean raised
)

Page 495 Applet Life Cycle

The paragraph:

"Although subclasses of the Applet class can provide a default constructor, it is seldom used to initialize the applet. This is instead done in the init() method of the applet."

should be changed to:

"Although subclasses of the Applet class can provide a default constructor for initialization purposes, this is usually done in the init() method of the applet.

Page 548, Chapter 18 Files and Streams

Replace the page with the following:

    Exam Objectives

    Supplementary Objectives

Page 552, Querying the File System

In the 2nd paragraph, at the end of last sentence, replace the text:

"... and "c:\documents\book\chapter1", respectively."

with (delete the text "\documents"):

"... and "c:\book\chapter1", respectively."

Page 568, Section 18.4 Character Streams: Readers and Writers

The paragraph:

 "Note that the read() methods read an int in the range 0 to 65535 (0x0000–0xFFFF), i.e. a Unicode character. The value –1 is returned if the end of file has been reached."

should read:

 "Note that the read() methods read Unicode characters which are  int values in the range 0 to 65535 (0x0000–0xFFFF). The first method returns the character read as an int. The last two methods return the number of characters read into the char array. The value –1 is returned by all methods if the end of file has been reached."

Page 594, Section 9.1 Javadoc Facility

Replace the bullet:

with:

Page 613, Forms of answers expected

In the 4th. paragraph of this section, replace the first sentence:

"For multiple choice questions, the program will present a list of answers with either radio buttons or checkboxes."

with:

"For multiple choice questions, the program will ask the candidate to select a specific number of answers from a list."

Page 616, Appendix B Objectives for the SCPJ2 Exam

Replace the URL

        <URL:http://suned.sun.com/usa/cert_test.html?content=scpj2_obj>

with the following:

    <URL:http://suned.sun.com/USA/certification/progobj.html#Java2>

Page 618, Section TitleLanguage Fundamentals (Chapter 2)

The last objective should be deleted and inserted on page 621 (see below).

Page 621, Section Title The java.awt package (Chapter 13)

The objective deleted from page 618 should be added to the objectives for this section:

Page 622, Appendix B Objectives for the SCPJ2 Exam

Add the following exam objectives which are covered in Chapter 18:

    Section Title: The java.io package (Chapter 18)

Page 622,  Section Title The java.io package (Chapter 18)

Add the following study notes after the objectives (see previous corrections for this page):

Study notes

Navigation in the file system is done using the File class. The concept of a stream is central to dealing with input and output. Input and output streams are provided for reading and writing bytes and characters. Classes FileInputStream and FileOutputStream are streams for dealing with the file content. Class RandomAccessFile allows direct access to the file content as opposed to sequential access provided by FileInputStream and FileOutputStream. Readers and writer are provided for reading from and writing characters to streams. Classes InputStreamReader and OutputStreamWriter can be used to specify a character encoding when reading from and writing characters to a stream. Streams can be chained to filters (subclasses of FilterInputStream and FilterOutputStream) to provide additional functionality (for example buffering of data, reading and writing Java primitive values).

Page 646, Review Question 9.6

The sentence:

"For each invocation of check(), each variable pair is incremented and their values are always equal when the method returns."

should be changed to

"For each invocation of doit(), each variable pair is incremented and their values are always equal when the method returns."

Page 727, Q51

The sentence:

"Mouse-motion listeners can be registered on all objects that are instances of Container."

should be changed to:

"Mouse-motion listeners can be registered on all objects that are instances of Component."

Clarification on Inheritance of Superclass Members

On page 118 (subsection private Members) and on page 173 (section 6.1 Inheritance), it is stated that ALL members of a superclass are inherited by the subclasses. Accessibility modifiers can be used to control whether the inherited members are accessible in the subclasses or not.

The Java Language Specification (JLS) states in section 8.2 that
"Members of a class that are declared private are not inherited by subclasses of that class. Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is declared.
Constructors, static initializers, and instance initializers are not members and therefore are not inherited."

According to this view, inheritance is linked to DIRECT ACCESSIBILITY of superclass members. In this sense the private members of the superclass are NOT inherited by the subclasses, but these members do EXIST in a subclass OBJECT. Private members of the superclass may be indirectly accessible from a subclass object if the superclass provides the appropriate implementation. In the example below, the private variable i in superclass A exists in object b of subclass B, but this data member is not inherited by the subclass B.

class A {
    private int i = 10; // Not inheritable
    public void printI() { // Inheritable
    System.out.println("i " + i);
    }
}

class B extends A {}

public class Inheritance {
    public static void main(String[] args) {
          B b = new B();
          b.printI();
    }
}

Output from the program:
i 10

JLS further states (section 8.4.6):

"A class inherits from its direct superclass and direct superinterfaces all the non-private methods (whether abstract or not) of the superclass and superinterfaces that are accessible to code in the class and are neither overridden (§8.4.6.1) nor hidden (§8.4.6.2) by a declaration in the class."

We will make the appropriate changes in accordance with JLS in the next edition when the time comes.

Other non-essential changes

Chapter 5 Flow Control and Exception Handling

Replace all mentions of "state diagram" with the more accurate term "activity diagram".