java中成员内部类内为什么不允许有任何静态声明
看下内部类Eclipse给的错误我们可以看出一部分,静态的属性或者方法不允许声明在非静态的对象中.
下面我们看下think in java 中谈内部类
内部类自动获得对其外围类所有成员的访问权,这是如何做到的?
当某个外围类创建了一个内部类对象时,此内部类对象必定秘密捕获一个指向那个外围类对象的引用.然后,在你访问此外围类的成员时.就是用那个引用来选择外围类的成员,幸运的是,编译器会帮你处理所有的细节,但你现在可以看到:内部类的对象只能在于其外围类的对象相关联的情况下才能被创建(非static内部类).
下面说下我自己想法和综合网上的想法
重点在于内部类比如和外部类有联系,如果我们创建了static的方法或者字段就破坏了这种耦合,和java的设定背道而驰.如果一个非静态内部类有了静态成员,静态成员不依托于任何内部类实例,那结果也就是此内部类不需要外部类实例就初始化了变量,严重侵害了内部类的定向
内部类的对象 脱离了其外围类的对象 就不会存在, 静态变量 的作用就是 让该类的所有对象共享一个状态。 这个类的所有对象都可以获取和修改这个状态。如果仅仅是这个目的,就可以推出这个状态也是所有外部对象所共享的状态,因此这个定义就可以提升至 外围类中定义,没有必要在内部类中定义,因此在JAVA中不允许在内部类中声明 静态变量
如果我们不从抽象的语义方面去理解, 可以这么想:
public class Outter {
class Inner{
static Inner a1=new Inner();
}
}如果上面的代码编译无误, 我们可以直接 Outter.Inner.a来拿到Inner类的实例, 而内部类的实例是一定要绑定到一个外部类的实例的. 然后java里试图用final来为上述限制松绑, 以提供更多的灵活性.
感觉没有语法什么方面的问题,主要还是为了内部类的定义,不想超脱原来的范围
另外说下final 那个成功的原因:
不是你声明了final就可以成功的,只能是编译器知道其值,然后编译器把他当做编译期常量来使用,其实说白了就是和这个类没啥关系了,只是你写那里了,但是没啥卵用,如果你改成可变的就是运行期确定值这个就是不能被编译通过的