关于java中的非静态类

时间:2011-05-18 05:57:50

标签: java

我怀疑是在运行以下程序时

public class NonStatic
{
  class a
  {
    static  int b;
  }
}

编译器给出的错误是“内部类不能有静态声明”

好的,然后我做了一个更改而不是“static int b”到“final static int b”它的给予

相同的错误但是当我写“final static int b = 10”时意味着初始化编译器

没有抱怨,请任何机构解释一下这背后的概念是什么。

5 个答案:

答案 0 :(得分:3)

它是如此设计,只需参阅Java语言规范:Inner Classes and Enclosing Instances

  

内部类是未显式或隐式声明为静态的嵌套类。 [...]内部类可能不会声明静态成员,除非它们是编译时常量字段(第15.28节)。

答案 1 :(得分:1)

final static int b=10 被解释为常量,因此编译器可以内联它。类似地,您可以在界面中拥有静态最终常量。

final static int b 缺少初始化,这是最终成员所必需的,因此编译器无法确定您想要的内容。 出于好奇,请立即尝试下面的块:

static {
  b=10;
}

虽然它可能不起作用......

答案 2 :(得分:1)

如果某个字段是静态的,则整个类只有一个副本,而不是每个类的实例一个副本
最后一个字段就像一个常量:一旦给出一个值,它就不能再分配给它。因此,当我们使用final时,我们必须将值赋给变量 看看以下link

答案 3 :(得分:0)

因为最终的静态变量是常量,意味着它不能在运行时更改,而静态变量不是常量,可以在运行时更改。

因此在类中,内部类中不允许使用静态变量,但允许使用常量(final)。

答案 4 :(得分:0)

以下是我对此问题的看法。

  1. 内部类被定义为外部类的非静态成员,因此,如果没有外部类的实例,它的实例就不存在。
  2. 无需创建该类的实例即可访问类的静态字段。
  3. 现在,如果在内部类中添加静态字段,则意味着您可以访问该字段而不创建内部类BUT的实例,根据内部的#1实例,如果没有外部类的实例,则不能存在。所以这就是冲突,因而也就是错误。
  4. TO CROSSCHECK:只需声明内部类是静态的,它将纠正错误。