内部类的对象脱离了其 外围类的对象 就不会存在, 静态变量 的作用就是 让该类的所有对象共享一个状态。 这个类的所有对象都可以获取和修改这个状态。如果仅仅是这个目的,就可以推出这个状态也是所有外部对象所共享的状态,因此这个定义就可以提升至 外围类中定义,没有必要在内部类中定义,因此在JAVA中不允许在内部类中声明 静态变量,但是可以允许其继承父类的 静态变量,因为父类可能有很多子类,这些子类不一定是用作内部类。
你可以想象一下如何去指向这个静态成员。非静态内部类是通过外部类的this指针指向的。那么对于非静态内部类的动态成员,可以通过两个this指针确定位置。但是如果允许静态成员会出现什么情况?首先,静态成员是不能通过任何this指针的,但是为了确定这个成员,必须确定这个成员所在的类实例。但是这个实例必须通过一个this指针确定。这在语法以及处理上都会造成很大的麻烦。所以非静态内部类总是由一个外部的对象生成,既然与对象相关,就没有静态的字段和方法。
内部类的用途就是 利用外围类对象的资源做事。
我在论坛中看到其他一个关于这个问题的分析(摘抄如下):
因为这会产生歧义。
比如
class Outer {
int outerX;
Inner inner1 = new Inner();
Inner inner2 = new Inner();
class Inner {
int innerX;
}
}
Outer outer1 = new Outer();
Outer outer2 = new Outer();
假如innerX是static的,那么这个static的含义是
1:仅是同一outer实例下的不同inner实例共享:
outer1.inner1.innerX=outer1.inner2.innerX,And
outer2.inner1.innerX=outer2.inner2.innerX,But
outer1.inner1.innerX!=outer2.inner1.innerX,Hence
outer1.inner2.innerX!=outer2.inner2.innerX
这个分析是错误的,因为:
outer1.inner1.getClass() ==outer2.inner1.getClass()返回true;
所以, 假如innerX是static的,同一个类调用其静态属性获取的值是指向同一个内存位置的。
答案:
2: 所有outer实例的inner实例都共享:
outer1.inner1.innerX=outer1.inner2.innerX,And
outer2.inner1.innerX=outer2.inner2.innerX,And
outer1.inner1.innerX=outer2.inner1.innerX,Hence
outer1.inner2.innerX=outer2.inner2.innerX