The lexical scope of a declaration determines where the named entity is a valid identifier. Every declaration is associated with a lexical level that corresponds to one of the following Java constructs:
The names at this level include all of the non-nested, outer-level class and interface declarations in files that belong to the same package as the file that is being compiled. This level also includes non-nested, outer-level class and interface declarations that are declared public in other packages.
The names at this level include all of the class and interface declarations in the file, as well as all of the classes and interfaces that are imported by the file. The names declared directly in a file are defined from the beginning to the end of the file. An import statement defines simple identifiers as synonyms for names that are only fully qualified with the name of a package. These synonyms for fully qualified names are defined from the import statement that defines them to the end of the file.
The names at this level include the names of methods, variables, and classes or interfaces that are declared directly in the class or interface declaration, as well as names inherited from superclasses or super interfaces. The names declared in a class or interface are defined throughout the class or interface.
The names at this level include the formal parameters of the method. The formal parameters are defined throughout the method.
The names at this level include the local variables, local classes, and statement labels declared in the block. Statement labels are defined throughout a block, while local variables and classes are defined from their declaration to the end of the block.
The names at this level include local variables declared in the initialization of the for statement or the local variables, classes, and statement labels declared in a nested block. Local variables declared in the initialization of a for statement are defined from their declaration to the end of the for statement. Statement labels are defined throughout a nested block, while local variables and classes are defined from their declaration to the end of the nested block.
These lexical levels correspond to nested constructs. When the Java compiler encounters a name in a program, it finds the declaration for that name by first looking in the lexical level where the name is encountered. If the compiler does not find the name in that lexical level, it searches progressively higher lexical levels until it finds the declaration. If all of the lexical levels are exhausted, the compiler issues an error message.
If, however, an identifier is qualified by a class or package name, the compiler only searches that lexical level for a declaration.