Java Reference
In-Depth Information
12.4
Nested classes
Thus far, we have said that each class may contain variable declarations and
method definitions, and method bodies may contain local variable declarations.
We have always placed the definition of a class
C
(say) in a file
C.java
.
We now state that a class may be defined in another class, and even in a
method body. Such a class is called a
nested class
. In this section, we explain
why nested classes are useful, explain restrictions on them, and give examples.
Lesson page
12-5
12.4.1
Static nested classes
We look first at a
static nested class
: a class that is declared with attribute
stat-
ic
within another class. Consider writing a class
WireForm
, as in Fig. 12.10,
whose instances represent three-dimensional wire models. The model consists of
a bunch of wires, or straight lines.
The components of class
WireForm
are of no interest in this discussion, and
we have placed three components in it only to illustrate. However,
WireForm
will
probably use something like class
Line
, shown also in Fig. 12.10, which has
three fields to describe the beginning of a line and another three to describe the
end of the line. Class
Line
would be placed in its own file,
Line.java
.
This organization has a big disadvantage. There is a proliferation of classes
for users of
WireForm
to contend with. Why should users have to see class
Line
when it is used only by class
WireForm
, and not directly by users? In fact, the
designers of
WireForm
may not
want
users to see class
Line
. The principle of
information hiding (see Sec. 3.1.1) says to make visible only what users need to
see, and this principle is violated here.
We can move toward the principle of information hiding by placing the def-
inition of class
Line
within class
WireForm
instead of in its own file, as shown
in Fig. 12.11. We make class
Line
a static class, as shown in Fig. 12.12, so it is
a
static nested class
.
Activity
12-5.2
/**
A wire form
*/
public class
WireForm {
public static int
x;
private int
y;
public int
meth(...) {...}
...
}
/**
An instance represents a line in 3 dimensions
*/
public class
Line {
double
x1, y1, z1; //
Coordinates of start of line
double
x2, y2, z2; //
Coordinates of end of line
}
Program 12.10:
Classes
WireForm
and
Line
(in different files)
Search WWH ::
Custom Search