In the following code snippet, presumably it appears that it should issue some compilation error but it doesn\'t:
class Outer {
public static class Inner {
Actually the class name is Outer$Inner.
Inner classes are essentially a hack introduced in Java 1.1. The JVM doesn't actually have any concept of an inner class, and so the compiler has to bodge it. The compiler generates class B
"outside" of class A
, but in the same package, and then adds synthetic accessors/constructors to it to allow A
to get access to it.
Checkout the following post:
Java inner class visibility puzzle
Paragraph 6.4.2 of the Java Language Specification has some information about the rules that apply in this case.
A simple name may occur in contexts where it may potentially be interpreted as the name of a variable, a type, or a package. In these situations, the rules of §6.5 specify that a variable will be chosen in preference to a type, and that a type will be chosen in preference to a package. Thus, it is may sometimes be impossible to refer to a visible type or package declaration via its simple name. We say that such a declaration is obscured.
This refers to paragraph 6.5 Determining the Meaning of a Name, which explains the rules in detail.
In your example, Outer.Inner
could refer to the type of the nested class named Inner
, or the static member variable Inner
. The rules say the variable will be chosen over the type.
Think of the inner class has actually have its own .java file. That will make it clear to you why it chooses the variable over the Inner class.