当前位置: 代码迷 >> J2SE >> 成员内部类里头为什么不能有静态成员和方法
  详细解决方案

成员内部类里头为什么不能有静态成员和方法

热度:198   发布时间:2016-04-23 19:46:50.0
成员内部类里面为什么不能有静态成员和方法?
如题。搜了一下,没有找到好的解释。看了这两个帖子,也看不懂。
http://stackoverflow.com/questions/5944448/what-exactly-is-the-reason-that-we-cannot-declare-static-methods-in-public-inn
http://stackoverflow.com/questions/975134/why-cant-we-have-static-method-in-an-inner-class

希望有人能帮忙解惑。
------解决思路----------------------
内部类要持有外部类的实例指针,换句话说,有外部实例才有内部类,内部类依附于外部类实例。

静态成员和方法是什么意思?是独立于类实例存在的,这样就和内部类的特点有矛盾之处了:内部类是一个依附,有内部类就要有外部实例,然后静态成员是独立于实例存在的,所以两个概念不能放在一起
------解决思路----------------------
非static的 要实例化才会存在,

没有实例化的类里 当然不会有static的成员或方法了。
------解决思路----------------------
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
1、static类型的属性和方法,在类加载的时候就会存在于内存中。
2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。
基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。
以上是我个人的理解和看法
------解决思路----------------------
引用:
Quote: 引用:

非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
1、static类型的属性和方法,在类加载的时候就会存在于内存中。
2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。
基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。
以上是我个人的理解和看法


非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧?



static 是不需要实例化 就可以在内存中存在的。也就说不需要new就可以访问或调用的。 
你new以后再去加载不是违背static的定义了吗? 那跟非static又有什么区别?
------解决思路----------------------
java很多想这类不能共同存在的 一般都与他们的生命周期有关。。。
比如 静态成员和静态方法是随着类的加载而存在的,也就是说内部类的静态属性是随着类的加载的,但是内部类的实例 是创建后才存在的,也就是说其静态属性优先存在于他的类实例的存在 这显然是矛盾的,所以要把内部类设为静态的 这样他们的生命周期就是相同了
------解决思路----------------------
引用:
Quote: 引用:

非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
1、static类型的属性和方法,在类加载的时候就会存在于内存中。
2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。
基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。
以上是我个人的理解和看法


非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧?


当然,如果用final修饰的话是可以的。但是,我想你也不是为了讨论这个吧
------解决思路----------------------
引用:
Quote: 引用:

java很多想这类不能共同存在的 一般都与他们的生命周期有关。。。
比如 静态成员和静态方法是随着类的加载而存在的,也就是说内部类的静态属性是随着类的加载的,但是内部类的实例 是创建后才存在的,也就是说其静态属性优先存在于他的类实例的存在 这显然是矛盾的,所以要把内部类设为静态的 这样他们的生命周期就是相同了


就是说内部类的class文件,在运行之前就会已经加载到虚拟机,是吗?

不是,类文件的加载 是当你第一次要用到这个类的时候 才会加载 但是只会加载一次
------解决思路----------------------
引用:
如题。搜了一下,没有找到好的解释。看了这两个帖子,也看不懂。
http://stackoverflow.com/questions/5944448/what-exactly-is-the-reason-that-we-cannot-declare-static-methods-in-public-inn
http://stackoverflow.com/questions/975134/why-cant-we-have-static-method-in-an-inner-class

希望有人能帮忙解惑。


“if you're going to have a static method, the whole inner class has to be static. Without doing that, you couldn't guarantee that the inner class existed when you attempted to call the static method. ”
楼主的那个连接说的蛮清楚的,如果内部类没有static的话,就需要实例化内部类才能调用,说明非static的内部类不是自动跟随主类加载的,而是被实例化的时候才会加载。
而static的语义,就是主类能直接通过内部类名来访问内部类中的static方法,而非static的内部类又是不会自动加载的,所以这时候内部类也要static,否则会前后冲突。
  相关解决方案