如题。搜了一下,没有找到好的解释。看了这两个帖子,也看不懂。
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希望有人能帮忙解惑。内部类内存context静态

解决方案 »

  1.   

    可以有,内部类申明成 static 的就可以了package study.innerclass;public class InnerClass {    static class Inner {
            static String name;
        }
    }
      

  2.   


    我知道static inner class可以有static的成员,这不是我问的问题啊,可能我没表述清楚。我问的是为什么非static的成员内部类不能有static的成员或方法?
      

  3.   

    非static的 要实例化才会存在,没有实例化的类里 当然不会有static的成员或方法了。
      

  4.   

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

  5.   


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

  6.   


    非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
    这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧?static 是不需要实例化 就可以在内存中存在的。也就说不需要new就可以访问或调用的。 
    你new以后再去加载不是违背static的定义了吗? 那跟非static又有什么区别?
      

  7.   

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

  8.   


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

  9.   


    非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。
    这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧?
    当然,如果用final修饰的话是可以的。但是,我想你也不是为了讨论这个吧不是讨论final这个。非static的内部类,在外部类加载的时候,不会加载它,这个我同意。后面这句,“所以它里面不能有静态变量或者静态方法”,这个结论怎么得出的?我的意思是,虽然外部类加载的时候不会加载那个内部类,但是在new的时候classloader会不会去加载内部类,这样内部类就允许有static的成员了。
    不知道这个理解对不对。我对classloader的东西不太了解,还需要再看些资料。
      

  10.   


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

  11.   


    就是说内部类的class文件,在运行之前就会已经加载到虚拟机,是吗?
    不是,类文件的加载 是当你第一次要用到这个类的时候 才会加载 但是只会加载一次
      

  12.   


    “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,否则会前后冲突。