class OuterClass {
class InnerClass {
static int i = 100; // compile error
static void f() { } // compile error
}
}
Although it's not possible to access the static field with OuterClass.InnerClass.i
, if I want to record something that should be static, e.g. the number of InnerClass objects created, it would be helpful to make that field static. So why does Java prohibit static fields/methods in inner classes?
EDIT: I know how to make the compiler happy with static nested class (or static inner class), but what I want to know is why java forbids static fields/methods inside inner classes (or ordinary inner class) from both the language design and implementation aspects, if someone knows more about it.
Best Answer
Because those inner classes are "instance" inner classes. That is, they are like an instance attribute of the enclosing object.
Since they're "instance" classes, it doesn't make any sense to allow
static
features, forstatic
is meant to work without an instance in the first place.It's like you try to create a static/instance attribute at the same time.
Take the following example:
If you create two instances of employee:
It is clear why each one has its own value for the property
name
, right?The same happens with the inner class; each inner class instance is independent of the other inner class instance.
So if you attempt to create a
counter
class attribute, there is no way to share that value across two different instances.When you create the instance
a
andb
in the example above, what would be a correct value for the static variablecount
? It is not possible to determine it, because the existence of theInnerData
class depends completely on each of the enclosing objects.That's why, when the class is declared as
static
, it doesn't need anymore a living instance, to live itself. Now that there is no dependency, you may freely declare a static attribute.I think this sounds reiterative but if you think about the differences between instance vs. class attributes, it will make sense.