Section 2.4 Class Definition
To program in Java the main thing you do is write class definitions for the various objects that will make up the program. A class definition encapsulates its objects' data and behavior. Once a class has been defined, it serves as a template, or blueprint, for creating individual objects or instances of the class.
A class definition contains two types of elements: variables and methods. Variables are used to store the object's information. Methods are used to process the information. To design an object you need to answer five basic questions:
What role will the object perform in the program?
What data or information will it need?
What actions will it take?
What interface will it present to other objects?
What information will it hide from other objects?
Subsection 2.4.1 The
Recall our definition of the
Riddle class from Chapter 1, which is summarized in the UML diagram in Figure 2.4.1. A
Riddle has two attributes,
answer. Each of these variables stores a
String. It contains three methods, the
Riddle() constructor, the
The instance variables
answer are designated as
private(\(-\)), but the
getAnswer() methods are designated as
public (\(+\)). These designations follow two important object-oriented design conventions, whose justification will become apparent as we discuss the
Listing 2.4.2 shows the Java class definition that corresponds to the design given in the UML diagram. It contains the two
private instance variables and defines the three
public methods listed in the UML diagram.
public modifiers are known as access modifiers. They control access to an object's elements, such as its variables or methods, by other objects — preventing access to private elements and permitting access to the public elements. Note also that the
Riddle class itself is declared
public, which allows access to its objects through its public variables and methods.
Principle 2.4.3. EFFECTIVE DESIGN: Private Variables.
Instance variables are usually declared
private so that they cannot be directly accessed by other objects. This is an example of information hiding.
Principle 2.4.4. EFFECTIVE DESIGN: Public Methods.
public methods can be used by other objects to interact with the object. The
public methods and variables of an object make up its interface.
Recall that a class definition is like a blueprint or a cookie cutter. The
Riddle class defines the type of information (attributes) that each
Riddle object has, but it doesn't contain any actual values. It defines the methods (operations) that each
Riddle object can perform, but it doesn't actually perform the methods.
Subsection 2.4.2 The
Riddle we need to define a
main() method, which can be defined either within the
Riddle class itself or in a second class.
One advantage of using a second class is that it gets us in the habit of thinking about the need for a separate object to serve as a user interface. A user interface is an object that handles the interaction between a program's user and the rest of the program's tasks ("Figure 2.4.5).
We use the general term computational object to distinguish the rest of the program's tasks from its user interface. The
Riddle's task is just to manage simple riddles.
Thus, as shown in Figure 2.4.6, this program will involve interaction between two types of objects: a
RiddleUser and one or more
Riddles. The relationship between them, represented by a one-way “Uses” arrow,is that the
RiddleUser will create a
Riddle instance and use its methods to display a riddle for the user.
This design employs the divide-and-conquer principle. The problem has been divided into two distinct tasks, the user interface (
RiddleUser) and the computation (
Riddle). Each type of object manages its own task and they work together to solve a problem.
Because almost all of our programs will involve some form of a user interface, we will follow this design approach throughout the book. It will serve us well. especially as our problems and our programs become more complex.
Subsection 2.4.3 Object Instantiation: Creating
Listing 2.4.7 shows the complete definition of the
RiddleUser class, which serves as a very simple user interface. It creates two
Riddle objects, named
riddle2. It then asks each object to request each riddle's question and answer and displays them on the console.
Run the code below. Add another Riddle to RiddleUser main and print it out.
Let's now discuss the statements that make up
main() method. The following statements use the
Riddle() constructor to create, or instantiate, two instances of the
Riddle riddle1 = new Riddle( "What is black and white and red all over?", "An embarrassed zebra."); Riddle riddle2 = new Riddle( "What is black and white and read all over?", "A newspaper.");
Note how the constructor gives each object a pair of
String s that serve as the values of their two instance variables. Each object has its own
question and its own
answer, and each object has its own unique name,
Subsection 2.4.4 Interacting with
Once we have created
Riddle instances with values assigned to their
answer instance variables, we can ask each riddle to tell us either of its values. The following expression is an example of a method call:
Calling (or invoking) a method is a means of executing its code. The above method call just gets the
String value that is stored in the
question instance variable of
Principle 2.4.8. PROGRAMMING TIP:Method Call versus Method Definition.
Don't confuse method calls with method definitions. The definition specifies the method's actions. The method call takes those actions.
If we want to display the value of
question, we can embed this method call within a
This tells the
System.out object to execute its
println() method, which displays the string given to it by
riddle1 on the console. Thus, the output produced by this statement will be
What is black and white and red all over?
Subsection 2.4.5 Define, Create, Use
As our Riddle example illustrates, writing a Java program is a matter of three basic steps:
Define one or more classes (class definition).
Create objects as instances of the classes (object instantiation).
Use the objects to do tasks (object use).
The Java class definition determines what information will be stored in each object and what methods each object can perform. Instantiation creates an instance and associates a name with it in the program. The object's methods can then be called as a way of getting the object to perform certain tasks.
Exercises Self-Study Exercises
Identify the following elements in the
Riddle class (Figure 2.4.1).