Contents | Prev | Next | Inner Classes Specification |
this
in Java code?
this
, or indirectly, by naming one of
the instance members of T. The idea of a current instance has been extended,
so that inner classes have more than one current instance. This allows the code
of an inner class C to execute relative to an enclosing instance of its outer class,
as well as the current instance of C.
In our first example of adapter classes, the Enumerator
code had two current
instances, the enclosing FixedStack
and the Enumerator
object itself. More
generally, within the entire body of an inner class C, there is a current instance
for C, another current instance for every inner class enclosing C, and finally a
current instance for the innermost enclosing top-level class. (A static
class is
a top-level class, not an inner class. Therefore, our enumeration of current
instances stops at the first static
keyword.)
Top-level classes do not have multiple current instances. Within the non-
static
code of a top-level class T, there is one current instance of type T.
Within the static
code of a top-level class T, there are no current instances.
This has always been true of top-level classes which are package members, and
is also true of top-level classes which are static
members of other top-level
classes. It is as if all package members have been implicitly static
all along.
In all classes, each current instance can be named explicitly or can play an
implicit part when its members are used. Any current instance can be referred
to by explicitly qualifying the keyword this
as if it were a name:
FixedStack.this
, Enumerator.this
, etc. (This notation is always
effective, since the language prohibits an inner class from having the same
name as any of its enclosing classes.) As always, the innermost current
instance can be named with the unqualified keyword this
.
Remember that an instance variable reference m has the same meaning as a
field reference expression this.
m, so the current instance is implicitly used.
In a given piece of code, all members of all current classes are in scope and
usable (except for name hiding by intervening scopes). The simple name of a
member is implicitly qualified by the current instance in whose class the name
was found. (All static
members of enclosing classes are always usable.)
In particular, Java code can directly use all methods of all current instances.
Class scoping does not influence overloading: If the inner class has one print
method, the simple method name print
refers to that method, not any of the
ten print
methods in the enclosing class.
When a constructor is invoked, the new object must be supplied with an
enclosing instance, which will become a current instance for all the code
executed by the new object. (If there are layers of enclosing instances, the
innermost is required, and it in turn determines all the others.) The enclosing
instance may be specified explicitly, by qualifying the keyword new
:
A subclass of an inner class C must pass an enclosing instance to C's
constructor. This may be done, as just shown, by explicitly qualifying the
keyword super
. By default, a current instance of the caller becomes the
enclosing instance of a new inner object. In an earlier example, the expression
new Enumerator()
is equivalent to the explicitly qualified this.new
Enumerator()
. This default is almost always correct, but some applications
(such as source code generators) may need to override it from time to time.
Inner Classes Specification (HTML generated by dkramer on March 15, 1997)
Copyright © 1996, 1997 Sun Microsystems, Inc.
All rights reserved
Please send any comments or corrections to john.rose@eng.sun.com