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

KG071 2013-10-05 01:38:14
...全文
1841 点赞 收藏 21
写回复
21 条回复
srj_java 2016年06月30日
成员内部类不能有静态成员和方法的前提是:没有static修饰 无论是静态成员还是静态方法都是和类挂钩的,与对象无关,如果要想调用内部类的static就必须要依赖于外部类来获得内部类,但是不能直接外部类.内部类(而是通过 外部类对象.new 内部类()),所以要有static来修饰内部类
回复 点赞
咯好好 2015年10月08日
引用 9 楼 crazypandariy 的回复:
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 1、static类型的属性和方法,在类加载的时候就会存在于内存中。 2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。 基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。 以上是我个人的理解和看法
讲的太好了
回复 点赞
banshurenliyaping 2015年06月11日
非静态内部类不能有静态成员: 对于java类加载顺序我们知道,首先加载类,执行static变量初始化,接下来执行对象的创建,如果我们要执行代码中的变量i初始化, 那么必须先执行加载OuterClass,再加载Innerclass,最后初始化静态变量i,问题就出在加载Innerclass上面,我们可以把InnerClass看成OuterClass的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载InnerClass必须在实例化OuterClass之后完成 ,java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。 静态内部类可以有静态成员: 我们可以把静态内部类作为外部类OuterClass的一个静态成员,在执行类加载过程中,静态内部类在加载OuterClass后会进行初始化,同样的原理,静态内部类的静态成员也将被初始化,进行内存的分配,注意到,这时无论是内部类还是外部类,对象都没有实例化,这也说明了非静态内部类为什么不能有静态成员的原因。
回复 点赞
风程序 2013年10月07日
引用 16 楼 KG071 的回复:
[quote=引用 12 楼 w215230188 的回复:] java很多想这类不能共同存在的 一般都与他们的生命周期有关。。。 比如 静态成员和静态方法是随着类的加载而存在的,也就是说内部类的静态属性是随着类的加载的,但是内部类的实例 是创建后才存在的,也就是说其静态属性优先存在于他的类实例的存在 这显然是矛盾的,所以要把内部类设为静态的 这样他们的生命周期就是相同了
就是说内部类的class文件,在运行之前就会已经加载到虚拟机,是吗?[/quote] 不是,类文件的加载 是当你第一次要用到这个类的时候 才会加载 但是只会加载一次
回复 点赞
Jacky-止涯 2013年10月07日
引用 楼主 KG071 的回复:
如题。搜了一下,没有找到好的解释。看了这两个帖子,也看不懂。 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,否则会前后冲突。
回复 点赞
KG071 2013年10月06日
引用 12 楼 w215230188 的回复:
java很多想这类不能共同存在的 一般都与他们的生命周期有关。。。 比如 静态成员和静态方法是随着类的加载而存在的,也就是说内部类的静态属性是随着类的加载的,但是内部类的实例 是创建后才存在的,也就是说其静态属性优先存在于他的类实例的存在 这显然是矛盾的,所以要把内部类设为静态的 这样他们的生命周期就是相同了
就是说内部类的class文件,在运行之前就会已经加载到虚拟机,是吗?
回复 点赞
KG071 2013年10月06日
引用 13 楼 crazypandariy 的回复:
[quote=引用 10 楼 KG071 的回复:] [quote=引用 9 楼 crazypandariy 的回复:] 非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 1、static类型的属性和方法,在类加载的时候就会存在于内存中。 2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。 基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。 以上是我个人的理解和看法
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧? [/quote] 当然,如果用final修饰的话是可以的。但是,我想你也不是为了讨论这个吧[/quote] 不是讨论final这个。非static的内部类,在外部类加载的时候,不会加载它,这个我同意。后面这句,“所以它里面不能有静态变量或者静态方法”,这个结论怎么得出的?我的意思是,虽然外部类加载的时候不会加载那个内部类,但是在new的时候classloader会不会去加载内部类,这样内部类就允许有static的成员了。 不知道这个理解对不对。我对classloader的东西不太了解,还需要再看些资料。
回复 点赞
K3v 2013年10月06日
引用 9 楼 crazypandariy 的回复:
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 1、static类型的属性和方法,在类加载的时候就会存在于内存中。 2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。 基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。 以上是我个人的理解和看法
应该就是这样吧?
回复 点赞
疯狂熊猫人 2013年10月05日
引用 10 楼 KG071 的回复:
[quote=引用 9 楼 crazypandariy 的回复:] 非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 1、static类型的属性和方法,在类加载的时候就会存在于内存中。 2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。 基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。 以上是我个人的理解和看法
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧? [/quote] 当然,如果用final修饰的话是可以的。但是,我想你也不是为了讨论这个吧
回复 点赞
风程序 2013年10月05日
java很多想这类不能共同存在的 一般都与他们的生命周期有关。。。 比如 静态成员和静态方法是随着类的加载而存在的,也就是说内部类的静态属性是随着类的加载的,但是内部类的实例 是创建后才存在的,也就是说其静态属性优先存在于他的类实例的存在 这显然是矛盾的,所以要把内部类设为静态的 这样他们的生命周期就是相同了
回复 点赞
无聊找乐 2013年10月05日
引用 10 楼 KG071 的回复:
[quote=引用 9 楼 crazypandariy 的回复:] 非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 1、static类型的属性和方法,在类加载的时候就会存在于内存中。 2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。 基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。 以上是我个人的理解和看法
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧? [/quote] static 是不需要实例化 就可以在内存中存在的。也就说不需要new就可以访问或调用的。 你new以后再去加载不是违背static的定义了吗? 那跟非static又有什么区别?
回复 点赞
KG071 2013年10月05日
引用 9 楼 crazypandariy 的回复:
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 1、static类型的属性和方法,在类加载的时候就会存在于内存中。 2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。 基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。 以上是我个人的理解和看法
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 这一点我同意,也很明确。但是可以在new外部类的对象的时候再去加载啊,好像没有充足的证据说明非static内部类中穿件static属性或方法就是错误的吧?
回复 点赞
疯狂熊猫人 2013年10月05日
非static的内部类,在外部类加载的时候,并不会加载它,所以它里面不能有静态变量或者静态方法。 1、static类型的属性和方法,在类加载的时候就会存在于内存中。 2、要使用某个类的static属性或者方法,那么这个类必须要加载到jvm中。 基于以上两点,可以看出,如果一个非static的内部类如果具有static的属性或者方法,那么就会出现一种情况:内部类未加载,但是却试图在内存中创建static的属性和方法,这当然是错误的。原因:类还不存在,但却希望操作它的属性和方法。 以上是我个人的理解和看法
回复 点赞
KG071 2013年10月05日
引用 6 楼 computerclass 的回复:
对上面的做进一步的说明,内部类类似于外部类的成员变量,如果内部类有一个静态的方法,那么内部类也必须是静态的,否则,不能保证能正确地调用内部类中的静态方法
否则,不能保证能正确地调用内部类中的静态方法 为什么?能说的更细一点吗,不想只看到结论。
回复 点赞
KG071 2013年10月05日
引用 5 楼 rainbowsix 的回复:
非static的 要实例化才会存在, 没有实例化的类里 当然不会有static的成员或方法了。
不明白,能详细一点吗?
回复 点赞
computerclass 2013年10月05日
对上面的做进一步的说明,内部类类似于外部类的成员变量,如果内部类有一个静态的方法,那么内部类也必须是静态的,否则,不能保证能正确地调用内部类中的静态方法
回复 点赞
无聊找乐 2013年10月05日
非static的 要实例化才会存在, 没有实例化的类里 当然不会有static的成员或方法了。
回复 点赞
KG071 2013年10月05日
引用 2 楼 ygycomon 的回复:
内部类要持有外部类的实例指针,换句话说,有外部实例才有内部类,内部类依附于外部类实例。 静态成员和方法是什么意思?是独立于类实例存在的,这样就和内部类的特点有矛盾之处了:内部类是一个依附,有内部类就要有外部实例,然后静态成员是独立于实例存在的,所以两个概念不能放在一起
对于这句: 内部类是一个依附,有内部类就要有外部实例,然后静态成员是独立于实例存在的,所以两个概念不能放在一起 静态成员是独立于实例存在的,这没错。内部类的静态成员可以独立于内部类的实例存在啊,为什么矛盾?
回复 点赞
KG071 2013年10月05日
引用 1 楼 rainbowsix 的回复:
可以有,内部类申明成 static 的就可以了

package study.innerclass;

public class InnerClass {

    static class Inner {
        static String name;
    }
}

我知道static inner class可以有static的成员,这不是我问的问题啊,可能我没表述清楚。 我问的是为什么非static的成员内部类不能有static的成员或方法?
回复 点赞
须等待 2013年10月05日
内部类要持有外部类的实例指针,换句话说,有外部实例才有内部类,内部类依附于外部类实例。 静态成员和方法是什么意思?是独立于类实例存在的,这样就和内部类的特点有矛盾之处了:内部类是一个依附,有内部类就要有外部实例,然后静态成员是独立于实例存在的,所以两个概念不能放在一起
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告