3.9. Object-Oriented Design: Inheritance and Polymorphism
This use of
Object
's
toString()
method provides our first look at Java's inheritance mechanism and how it promotes the generality and extensibility of the object-oriented approach. As a subclass of
Object
, our
OneRowNim
class automatically inherits
toString()
and any other
public
or
protected
Inheritance
One of the great benefits of the object-oriented approach is the ability to define a task, such as
toString()
, at a very high level in the class hierarchy and let the inheritance mechanism spread the task throughout the rest of the hierarchy. Because
toString()
is defined in
Object
, you can invoke this method for any Java object. Moreover, if you override
toString()
in the classes you define, you will be contributing to its
Effective Design: Inheritance
Effective Design: Overriding toString()
Obviously there is much more that needs to be explained about Java's inheritance mechanism. Therefore, we will frequently
Another important concept of object-oriented design is polymorphism. The
toString()
method is an example of a polymorphic method. The
For example, suppose we design a class, Student , as a subclass of Object and define its toString() method to return the student ID number. Given this design, then obj.toString() will return a student ID if obj is an instance of Student , but if it is an instance of OneRowNim , it will return the description of its state that we defined above. The following code segment illustrates the point:
Object obj; // obj can refer to any Object obj = new Student("12345"); // obj refers to a Student System.out.println(obj.toString()); // Prints "12345" obj = new OneRowNim(11); // obj refers to a OneRowNim System.out.println(obj.toString()); // Prints: nSticks = 11, player = 1 In this case, the variable obj is used to refer to a Student and then to a OneRowNim instance. This is okay because both classes are subclasses of Object . When toString() is invoked on obj , Java will figure out what subclass of Object the instance belongs to and invoke the appropriate toString() method. |
3.10. Drawing Lines and Defining Graphical
|
/** * DrawLineApplet demonstrates some graphics commands. * It draws a set of 12 vertical lines and a set of 7 lines. */ import java.awt.*; import java.applet.*; public class DrawSticksApplet extends Applet /** * drawSticks(g,x,y,num) will draw num vertical line * segments. The line segments are 10 pixels apart and * 50 pixels long. The top endpoint of the left most * line segment is at the point (x,y). */ public void drawSticks(Graphics g, int x, int y, int num) { int k = 0; while (k < num) { g.drawLine(x, y, x, y + 50); x = x + 10; k = k + 1; } // while } // drawSticks() public void paint(Graphics g) { drawSticks(g, 25, 25, 12); g.setColor(Color.cyan); drawSticks(g, 25, 125, 7); } // paint() } // DrawSticksApplet class |
Note that the body of
drawSticks()
uses a
while
loop to draw the lines, and declares and initializes a local variable to zero to use for counting the number of lines drawn. The statement
g.drawLine(x, y, x, y + 50);
draws a vertical line 50 pixels long. Increasing the value of
x
by 10 each time through the loop moves the
The first call to drawSticks() in the paint() method draws 12 lines with (25,25) the top point of the leftmost line. The second call to drawSticks() will draw seven cyan sticks 100 pixels lower. Note that changing the color of g before passing it as an argument to drawSticks() changes the drawing color.
To run this applet, one needs the following HTML document, which specifies the applet code as DrawSticksApplet.class :
<HTML>
<HEAD>
<TITLE> Draw Sticks Web Page</TITLE>
</HEAD>
<BODY>
<H2> DrawSticksApplet will appear below.</H2>
<APPLET CODE = "DrawSticksApplet.class"
WIDTH = 400 HEIGHT = 200>
</APPLET>
</BODY>
</HTML>
An image of the DrawSticksApplet as it appears in a browser window is shown in Figure 3.20.
As we have seen in this example, defining methods with parameters to draw an object makes the code reusable and makes it possible to draw a complex scene by calling a collection of simpler methods. It is a typical use of the divide-and-conquer principle. The
while
loop can be useful in drawing almost any