2011-12-20 79 views
3

可能重复:
Why does Java prohibit static fields in inner classes?为什么只有Java中的静态内部类具有静态成员?

让我们来看看在Java中,下面的代码片段。它只是在Outer类中声明的Inner类中总结了两个数字,并且按预期工作得很好。

package staticfields; 

final class Outer 
{ 
    final public static class Inner 
    { 
     private static int x; 
     private static int y; 

     public Inner(int x, int y) 
     { 
      Inner.x=x; 
      Inner.y=y; 
     } 

     public void sum() 
     { 
      System.out.println(x+y); 
     } 
    } 
} 

final public class Main 
{ 
    public static void main(String[] args) 
    { 
     new Outer.Inner(5, 10).sum(); 
    } 
} 

当我试图从Inner类中删除静态关键字,它会发出指示内部类不能有静态声明编译时错误意味着在静态字段(x和y)在内部类中声明不起作用,如果它是非静态的。


为什么只有Java中的静态内部类具有静态成员而非静态内部类不是?

+5

http://stackoverflow.com/questions/1953530/why-does-java-prohibit-static-fields-in-inner-classes第二个答案更好:http://stackoverflow.com/a/1953570/ 738746 – 2011-12-20 00:05:22

+0

@glowcoder :)从内部类中删除static关键字并将其设置为非静态类时,会发出该错误。你有没有尝试这样做? – Lion 2011-12-20 00:06:10

+0

@Lion是的,问题在于我在那个目录中有另一个名为Outer的类,所以我称这个为OuterTest,但仍在编译Outer :) Whoopsie :) – corsiKa 2011-12-20 00:08:19

回答

0

内部类是一个嵌套类,它不是明确或隐含地声明为 声明为静态。内部类可能不会声明静态初始化程序 (第8.8节)或成员接口。内部类可以不声明静态 成员,除非他们是编译时常田”

内部类属于淘汰类的一个实例,因此它是有道理的。

1

因为“内部类不能有静态声明”:-)

但严重的是,根据定义,内部类是非静态的。 您需要了解内部和嵌套类(静态)之间的区别。

0

首先,为什么你可以声明一个内部类是静态的快速回顾:

非静态内部类只能在其声明的父类的一个实例的上下文中存在。所以如果你的Inner类是非静态的,那么它只能存在于Outer的特定实例中。即Inner取决于具有Outer的实例,并且Inner的每个实例“引用”Outer的实例(使用在此泛指的词)。

这允许一个非静态的内部类引用Outer的非静态字段和方法,而不明确地使用对Outer的引用。

为了告诉编译器和JVM这不是内部类的期望行为,需要使内部类为静态(因此它不再是“内部”类)。然后,这将打破内部类对外部类实例的依赖关系,并让您像声明任何其他常规Java类一样声明“内部”(嵌套)类。现在

,因为非静态内部类依赖于外部类的特定实例,它没有任何意义了这个内部类有非最终静态成员(因为改变一个有效地打破了内部的封装类)。我相信他们可能在技术上允许它,如果他们愿意的话,但是使用它可能是不好的编程习惯,并且指出你真正想要的是一个静态嵌套类。

相关问题