读书人

java为啥非静态内部类里面不能有静态成

发布时间: 2012-12-22 12:05:06 作者: rapoo

java为什么非静态内部类里面不能有静态成员

????? 内部类的对象脱离了其 外围类的对象 就不会存在, 静态变量 的作用就是 让该类的所有对象共享一个状态。 这个类的所有对象都可以获取和修改这个状态。如果仅仅是这个目的,就可以推出这个状态也是所有外部对象所共享的状态,因此这个定义就可以提升至 外围类中定义,没有必要在内部类中定义,因此在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


读书人网 >编程

热点推荐