日期:2014-05-20  浏览次数:20740 次

为什么内部类有静态成员那么内部类必须是静态的呢?
class Outer
{
    int x = 3;
    void method()
    {
        class Inner    
        {
            void function()  //  这个如果是静态的,Inner也必须是静态的吗?
        {
            System.out.println(x);  
        }
    }
    new Inner().function();
    }
}
为什么必须是静态的啊?
------解决方案--------------------
如果不牵扯到内部类,我想楼主应该很清楚为什么静态方法只能访问静态成员了,运到这个问题,我一开始也不太明白,经过一段时间的学习和思考,现在很容易明白了,给日楼主分享一个思路吧
1.内部类是外部类的一个成员,可以等同于外部类的一个属性或者方法。
2.非静态的内部类是外部类对象的一个成员,必须先有外部类的对象才有这个内部类,它是属于对象的。
3.内部类的静态成员不属于对象的,也就是类在加载的时候就存在了,那么这就发生冲突了,也就是说外部类还没有new对象前,这个内部类是不存在的,而这个内部类的静态成员就存在了,这就好比没有鸡就先有鸡蛋一样。

不知道我讲清楚没,祝楼主学习进步
------解决方案--------------------
java类加载顺序:
首先加载类
执行static变量初始化
接下来执行对象的创建

如果楼主要执行代码中的function方法(静态),那么必须先执行加载Outer,再加载Inner,然后执行function方法,问题就出在加载Inner上面,可以把Inner看成Outer的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载Inner必须在实例化Outer之后完成,java虚拟机要求所有的静态变量和方法必须在对象创建之前完成,这样便产生了矛盾。

希望对楼主有帮助。