A name is used to refer to an entity declared in a Java program.
There are two forms of names: simple names and qualified names. A simple name is a single identifier. A qualified name consists of a name, a ".
" token, and an identifier.
In determining the meaning of a name (§6.5), the Java language takes into account the context in which the name appears. It distinguishes among contexts where a name must denote (refer to) a package (§6.5.3), a type (§6.5.4), a variable or value in an expression (§6.5.5), or a method (§6.5.6).
Not all identifiers in Java programs are a part of a name. Identifiers are also used in the following situations:
.
" token to indicate a member of an object that is the value of an expression or the keyword super
that appears before the ".
" token
.
" token and before a "(
" token to indicate a method to be invoked for an object that is the value of an expression or the keyword super
that appears before the ".
" token
break
(§14.13) and continue
(§14.14) statements that refer to statement labels
class Test { public static void main(String[] args) { Class c = System.out.getClass(); System.out.println(c.toString().length() + args[0].length() + args.length); } }
the identifiers Test
, main
, and the first occurrences of args
and c
are not names;
rather, they are used in declarations to specify the names of the declared entities.
The names String
, Class
, System.out.getClass,
System.out.println
,
c.toString
, args
, and args.length
appear in the example. The first occurrence of length
is not a name, but rather an identifier appearing in a method invocation expression (§15.11). The second occurrence of length
is not a name, but
rather an identifier appearing in a method invocation expression (§15.11).
The identifiers used in labeled statements and their associated break
and continue
statements are completely separate from those used in declarations. Thus, the following code is valid:
class TestString {
char[] value;
int offset, count;
int indexOf(TestString str, int fromIndex) { char[] v1 = value, v2 = str.value; int max = offset + (count - str.count); int start = offset + ((fromIndex < 0) ? 0 : fromIndex); i: for (int i = start; i <= max; i++)
{ int n = str.count, j = i, k = str.offset; while (n-- != 0) { if (v1[j++] != v2[k++]) continue i; } return i - offset; } return -1; } }
This code was taken from a version of the class String
and its method indexOf
(§20.12.26), where the label was originally called test
. Changing the label to
have the same name as the local variable i
does not hide the label in the scope of
the declaration of i
. The identifier max
could also have been used as the statement
label; the label would not hide the local variable max
within the labeled statement.