Java 为什么静态最终变量在内部类中被接受?

Java 为什么静态最终变量在内部类中被接受?,java,static,inner-classes,final,Java,Static,Inner Classes,Final,我知道有可能做到以下几点: public class Indeed{ private class inner { static final int try1 = 10; } } 为什么??允许这样的声明有什么意义? 此外,在本地类中仍然可以执行相同的操作: public void doThing() { class LocalClass { static final int try1 = 10; } } 在这些代码中使用静态f

我知道有可能做到以下几点:

public class Indeed{
    private class inner {
        static final int try1 = 10;
    }
}
为什么??允许这样的声明有什么意义? 此外,在本地类中仍然可以执行相同的操作:

public void doThing() {
    class LocalClass {
         static final int try1 = 10;
    }
}
在这些代码中使用静态final有什么用? 我很确定我永远不会使用它们,但是我需要理解为什么会使用它们,因为我有一个OCPJP7考试要做


提前感谢。

静态变量的用途是由类的所有实例共享。在这两个示例中,您可以拥有私有类/本地类的多个实例,因此,按照指定,它们将在实例之间共享静态变量。如果您只能实例化一次类,那么这将是毫无意义的

内部类不能声明静态成员,除非它们是常量 变量(§4.12.4),或发生编译时错误

我在说明书中看到的是,不必回答以下难题:

  • 内部类的静态变量在同一外部类实例的所有实例之间共享(但它们在外部类实例之间可以具有不同的值)
  • 内部类的静态变量在VM中的所有现有实例之间共享,不管它们的外部类实例是什么

幸运的是,当您宣布它为final时,您知道它对于每个实例都是相同的,所以您不必担心这个问题。这就是为什么它是允许的。

静态变量的用途是由类的所有实例共享。在这两个示例中,您可以拥有私有类/本地类的多个实例,因此,按照指定,它们将在实例之间共享静态变量。如果您只能实例化一次类,那么这将是毫无意义的

内部类不能声明静态成员,除非它们是常量 变量(§4.12.4),或发生编译时错误

我在说明书中看到的是,不必回答以下难题:

  • 内部类的静态变量在同一外部类实例的所有实例之间共享(但它们在外部类实例之间可以具有不同的值)
  • 内部类的静态变量在VM中的所有现有实例之间共享,不管它们的外部类实例是什么
幸运的是,当您宣布它为final时,您知道它对于每个实例都是相同的,所以您不必担心这个问题。这就是为什么它是允许的。

对于“为什么内部类的静态字段必须是最终字段”的问题:

该限制规定如下:

内部类不能声明静态成员,除非它们是常量 变量(§4.12.4),或发生编译时错误

但这并没有告诉我们为什么。让我们考虑一下如何使用内部类。想象一下我写(试着)这个

当我这样做时会发生什么

A one = new A();
A two = new A();
one.doStuff(1);
two.doStuff(2);
one.printX();
two.printX();
应该打印什么?1次,2次还是2次?x是静态的,因此它应该只存在于一个位置(在B的
Klass
对象中),但由于B是一个内部类,它应该特定于A的实例。如果允许静态非最终字段,则需要为外部类的每个实例创建一个特定于实例的
Klass
对象。我们不想这么做

因此,允许使用静态final字段,因为它们可以愉快地生活在B的
Klass
对象中,并在外部类的所有实例中共享,因为它们永远不会更改(为final)。

对于“为什么内部类的静态字段必须是final”的问题:

该限制规定如下:

内部类不能声明静态成员,除非它们是常量 变量(§4.12.4),或发生编译时错误

但这并没有告诉我们为什么。让我们考虑一下如何使用内部类。想象一下我写(试着)这个

当我这样做时会发生什么

A one = new A();
A two = new A();
one.doStuff(1);
two.doStuff(2);
one.printX();
two.printX();
应该打印什么?1次,2次还是2次?x是静态的,因此它应该只存在于一个位置(在B的
Klass
对象中),但由于B是一个内部类,它应该特定于A的实例。如果允许静态非最终字段,则需要为外部类的每个实例创建一个特定于实例的
Klass
对象。我们不想这么做


因此,静态final字段是允许的,因为它们可以愉快地生活在B的
Klass
对象中,并且可以在外部类的所有实例中共享,因为它们永远不会更改(为final)。

我只是理解
静态
final
,当类被初始化时,静态变量将被初始化,然后它将永远不会被更改。你可以在它们的作用域内访问它们。好吧,这是一个
静态的
变量,就像其他变量一样,这里没有什么神秘之处,为什么要区分静态的最终变量是在内部类还是在主类中。它们在内部类中的使用方式与在任何普通类中的使用方式相同。@fge good catch,已更改。这个问题的临时代码很抱歉。@Rolleball“为什么它只适用于指定的final”我只是理解
静态
最终
,当类被初始化时,静态变量将被初始化,然后它将永远不会被更改。你可以在它们的作用域内访问它们。好吧,这是一个
静态的
变量,就像其他变量一样,这里没有什么神秘之处,为什么要区分静态的最终变量是在内部类还是在主类中。它们在内部类中的使用方式与在任何普通类中的使用方式相同。@fge good catch,已更改。这个问题的临时代码很抱歉。@Rolleball“为什么它只在指定的final下工作”为什么允许final?为什么允许final?