2.4. Class DefinitionTo 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.
The class as template 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:
Variables and methods 2.4.1. The Riddle ClassOur definition of the Riddle class from Chapter 1 is summarized in the UML diagram in Figure 2.11. A Riddle has two attributes, question and answer. Each of these variables stores a string of characters, which Java treats as data of type String. The Riddle class contains three methods. The Riddle() constructor method assigns initial values (q and a) to its question and answer variables. The getQuestion() and getAnswer() methods return the data stored in question and answer respectively. Figure 2.11. The Riddle class.
The instance variables question and answer are designated as private (-), but the Riddle(), getQuestion() and getAnswer() methods are designated as public (+). These designations follow two important object-oriented design conventions, whose justification will become apparent as we discuss the Riddle class: Effective Design: Private Variables
Effective Design: Public Methods
Figure 2.12 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. In a Java class definition, access to a class element, such as a variable or a method, is controlled by labeling it with either the private or the public access modifier. An access modifier is a declaration that controls access to a class or one of its elements. Note that the Riddle class itself is declared public. This lets other classes have access to the class and to its public variables and methods. Figure 2.12. Definition of the Riddle class.
Access modifier Recall that a class is like a blueprint or a cookie cutter. The Riddle class defines the type of information (attributes) that each individual Riddle has, but it doesn't contain any actual values. It defines the methods (operations) that each Riddle can perform, but it doesn't actually perform the methods. In short, a class serves as a template, providing a detailed blueprint of the objects (or instances) of that class.
Class as blueprint 2.4.2. The RiddleUser ClassNow that we have defined the Riddle class, we can test whether it works correctly by creating Riddle objects and "asking" them to tell us their riddles. To do this we need to define a main() method, which can be defined either within the Riddle class itself or in a second class named something like RiddleUser. One advantage of using a second class is that it gets us in the habit of thinking about the need for a separate class to serve as a user interface, with a separate set of tasks from the Riddle class. A user interface is an object or class that handles the interaction between a program's user and the rest of the program's computational tasks. This concept is illustrated in Figure 2.13. Note that we use the general term computational object to distinguish the rest of the program's computations from the user interface. Obviously, the exact nature of the computation will vary from program to program, just as will the details of the user interface. Figure 2.13. The user interface handles interactions between the user and the rest of the program. |
public class RiddleUser { public static void main(String argv[]) { 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."); System.out.println("Here are two riddles:"); System.out.println(riddle1.getQuestion()); System.out.println(riddle2.getQuestion()); System.out.println("The answer to the first riddle is:"); System.out.println(riddle1.getAnswer()); System.out.println("The answer to the second is:"); System.out.println(riddle2.getAnswer()); } // main() } // RiddleUser class |
We will now discuss the statements that make up RiddleUser's main() method. The following statements use the Riddle() constructor to create, or instantiate, two instances of the Riddle class:
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 Strings 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, riddle1 and riddle2.
Once we have created Riddle instances with values assigned to their question and 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:
riddle1.getQuestion()
Calling (or invoking) a method is a means of executing its code. The preceding method call just gets the String value that is stored in the question instance variable of riddle1.
Method call
Java 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 the actions. |
If we want to display the value of riddle1's question, we can embed this method call within a println() statement
System.out.println(riddle1.getQuestion());
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 ?
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.
Exercise 2.2 | Identify the following elements in the Riddle class (Fig. 2.12):
|
Exercise 2.3 | Identify the following elements in the RiddleUser class (Fig. 2.15):
|