为什么 java不允许非静态内部类里定义静态成员。否则编译引起错误,求这样设计的原因!用自己的理解解答为什么匿名内部类需要访问外部类的局部变量时,则必须使用final修饰符来修饰外部类的变量,否则系统将报错的原因,求解答!

解决方案 »

  1.   

    内部类是依赖于外部类存在的,所以不允许建立静态成员。
    你在外围new内部类的实例,是需要外部类实例.new 的形式来实例化的。匿名类的final修饰符,个人认为是为了匿名类的状态不受类外部操作的影响。
      

  2.   

    但是静态内部类中可以定义静态成员和非静态成员,你说的内部类依赖于外部类存在所以不能定义静态成员,但是静态内部类也是依赖外部类,但是它可以定义静态成员。
    匿名内部类访问外部类的变量,外部类的变量必须使用final修饰符,而不是你说的:匿名类的final修饰符。
    我的意思是:为什么你们那个内部类要访问外部类的局部变量时,必须要用final修饰
      

  3.   

    为什么匿名内部类访问外部类的局部变量时,外部类的局部变量必须使用final修饰符修饰。final修饰只是让变量不可被重新赋值,为什么匿名内部类访问外部类的局部变量,就要让外部类的局部变量使用final修饰
      

  4.   

    如果内部类里有静态成员,而内部类又是依赖于外部类的。那么java自动回收垃圾时对外部类该如何操作呢?
    匿名类访问外部变量须在外部变量上加final修饰符,个人觉得是因为考虑到安全吧,不允许匿名类修改外部类的成员变量。个人之见……
      

  5.   

    这问题好多人都回答不好,也包括我。
    楼主可以自己google下,有不少比较靠谱的分析。
      

  6.   


    但是静态内部类中可以定义静态成员和非静态成员,这自然是可以的。
    这里就要看你怎么用静态内部类了。
    静态内部类一般的用法是把他理解成为可以独立与外部类存在的类,他的生命期独立于外部类。
    如果静态类存在有非静态成员,那要使用非静态成员的时候,必须实例化内部类,也就是之前说的需要外部类实例.new 的形式来实例化的。那就退化成了非静态内部类。 设计的时候,功能要明确,到底是非静态,还是静态。
      

  7.   

    java就这个地方太难理解--signature-------------------
    http://www.mowker.com/qkdq.htm