|Contents | Prev | Next||Inner Classes Specification|
Initialization code introduced without the
static keyword is executed by
every constructor, just after the superclass constructor is called, in textual order
along with any instance variable initializations.
An instance initializer may not return, nor throw a checked exception, unless
that exception is explicitly declared in the
throws clause of each constructor.
An instance initializer in an anonymous class can throw any exceptions.
Instance initializers are useful when instance variables (including blank finals) must be initialized by code which must catch exceptions, or perform other kinds of control flow which cannot be expressed in a single initializer expression. Instance initializers are required if an anonymous class is to initialize itself, since an anonymous class cannot declare any constructors.
new Type Dims ArrayInitializer
The equivalence of the following two statements illustrates the new syntax:
.' and the token
class. It evaluates to an object of type
Class, the class object for the named type (or for void).
For reference types, a class literal is equivalent to a call to
with the appropriate string, except that it does not raise any checked
exceptions. (Its efficiency is likely to be comparable to that of a field access,
rather than a method call.) The class literal of a reference type can raise
NoClassDefFoundError, in much the same way that a class variable
reference can raise that error if the variable's class is not available.
The class literal of a primitive type or void is equivalent to a static variable reference to a pre-installed primitive type descriptor, according to this table:
Java APIs which require class objects as method arguments are much easier to
use when the class literal syntax is available. Note that the compiler is
responsible for taking into account the ambient
statements when processing the TypeName of a class literal.
The older usage of
Class.forName requires the programmer to figure out the
desired package prefix and write it in a class name string. The difficulty of
getting the string spelled right becomes greater in the presence of inner classes,
since their names (as processed by
Class.forName) are encoded with `
characters instead of dots.
Note that a class literal never contains an expression, only a type name.
finalvariable declaration (of any kind) which lacks an initializer. A blank final must be assigned an initial value, at most once.
The definite assignment rules are extended to record variables which are
"definitely unassigned," and an assignment to a blank final is prohibited
unless the final is definitely unassigned before the assignment statement.
Subsequently, it is definitely assigned, and, being a
final, it cannot be re-
assigned along the same execution path.
The definite unassignment rules take into account back-branches of loops, so
that a variable occurrence in a loop body may not be definitely unassigned if
the loop makes an assignment which can reach the occurrence via a back-
branch. The definite assignment checks work as if the first iteration of the loop
had been unrolled into an
A blank final class variable must be definitely assigned by a
(in the same class). This is the only context where class variables are checked
for definite assignment.
A blank final instance variable must be definitely assigned by a non-
initializer, or else by every constructor. These are the only contexts in which
definite assignment checking is done on instance variables. Within these
contexts, an assignment to
this.V is recognized as performing an assignment
to the name V for purposes of definite assignment checking.
Local variables and parameters of all sorts can now be declared
ModifiersOpt Type VariableDeclarators
ModifiersOpt Type VariableDeclaratorId
Such a variable is subject to the usual definite assignment rules governing local variables. In addition, it cannot be assigned to, except for initialization.
A method parameter or catch formal parameter may be declared
has no effect on the method signature or the caught exception type. Within the
body of the method or catch, the parameter may not be assigned to.
final declaration modifier may be used to make local variables and
parameters available to inner classes.
Contents | Prev | Next
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 firstname.lastname@example.org