Java Reference
In-Depth Information
EXAMPLE: A Person Class
It is common to have instance variables of a class type. The class Person defined in Display 5.19
has two instance variables of type Date . So, the class Person has instance variables of a class type.
(The class Date was defined in Chapter 4, Display 4.11. We have reproduced the relevant por-
tions of the date class definition in Display 5.20.) In fact, all the instance variables for the class
Person are of class types. An object of the class Person has the basic data about people that is
found in such places as on tombstones and in author listings in library catalogues. It describes a
person by giving the person's name, date of birth, and date of death. If the person is still alive,
then the value null is used as the date of death. (So null is good.) A simple program illustrating
the class Person is given in Display 5.21. We will discuss a few details about the class Person
here, but most of the various methods in the class Person will be discussed as we cover the corre-
sponding topic in the following subsections.
Normally, a class definition should include a no-argument constructor. However, there are
cases where a no-argument constructor makes little sense. For example, the wrapper classes
such as Integer and Double have no no-argument constructors, as we explained in the Pitfall
subsection “A Wrapper Class Does Not Have a No-Argument Constructor,” which appeared
earlier in this chapter. The class Person also has no no-argument constructor for a reason. A
person may have no date of death, but a person always has a date of birth. A no-argument
constructor should initialize all instance variables, but there is no suitable value to initialize
the instance variable born unless it is provided as an argument to the constructor. In particu-
lar, it makes no sense to initialize the instance variable born to null ; that would indicate that
the person was never born. It makes little sense to have a person who was never born, so it
makes little sense to have a no-argument constructor for the class Person . Note that because
we defined some constructors for the class Person but did not define a no-argument construc-
tor, it follows that the class Person has no no-argument constructor.
Since we are assuming that an object of the class Person always has a birth date (which is not
null ), the following should always be true of an object of the class Person :
An object of the class Person has a date of birth (which is not null ), and if the object
has a date of death, then the date of death is equal to or later than the date of birth.
If you check the definition of the class Person , you will see that this statement is always true.
It is true of every object created by a constructor, and all the other methods preserve the truth
of this statement. In fact, the private method consistent was designed to provide a check for
this property. A statement, such as the above, that is always true for every object of the class is
called a class invariant .
Note that the definition of equals for the class Person includes an invocation of equals
for the class String and an invocation of the method equals for the class Date . Java deter-
mines which equals method is being invoked from the type of its calling object. Because the
instance variable name is of type String , the invocation name.equals(...) is an invocation of
the method equals for the class String . Because the instance variable born is of type Date , the
invocation born.equals(...) is an invocation of the method equals for the class Date .
Similarly, the definition of the method toString for the class Person includes invocations
of the method toString for the class Date .
Search WWH ::




Custom Search