Java:类中间的静态关键字

时间:2012-09-06 19:43:07

标签: java class static

以下是示例代码:

class A {

   static {
       int a;
       class B {
       }
   }

   public static void main(String[] args){
       // cannot access class B and in a;
   }
}

我不知道此上下文中的static关键字是什么意思。我声明了一个int变量和一个类。但我不能在A类或主方法中使用它。我编译,它不会产生任何错误。所以,我认为这种声明有一些目的。

6 个答案:

答案 0 :(得分:7)

这是静态初始化块。您可以使用它来收集静态/类成员的初始化。

同样,您可以使用非静态初始化块为每个新对象初始化实例成员:

class A
{
    static int a;

    private int b;

    // static/class initialization:
    static
    {
        // initialize class members
        a = 5;
    }

    // instance initialization:
    {
        // initialize instance members
        b = 5;
    }
}

这个例子很简单,你只需要在它们的声明中初始化变量:static int a = 5,实际上通常会更清楚。但是在初始化是多步骤时使用初始化块,或者通常更复杂,例如,设置数据库连接。

有关更多示例,请参阅:java教程中的Initializing Fields

答案 1 :(得分:2)

第一次加载类(不是此类的对象)时,将执行static {}块内的代码。 See this

答案 2 :(得分:1)

它在Java中称为静态块。这通常用于A类可能需要的初始化目的

当JVM加载此类时,将执行

静态块。可以有许多这样的块,它们将按照出现的顺序执行

答案 3 :(得分:1)

这是一个静态初始化块。这是Oracle Java SE documentation static initialization blocks

在您的示例中,int a是静态初始化块的局部变量。这是关于静态初始化块中的局部变量的另一篇Stackoverflow帖子:What is the scope of variables declared inside a static block in java?。这就是您无法在main方法中访问它的原因。

答案 4 :(得分:0)

该定义是静态初始化块。它允许额外的逻辑初始化,在这种情况下应用于静态成员。

如果调用类A构造函数,您将能够访问块中初始化的任何内容,因为“Java编译器将初始化程序块复制到每个构造函数中”。查看docs

答案 5 :(得分:0)

这是静态初始化程序块。

无法在块外部访问int a和class B的原因是作用域。与构造函数和方法类似,在初始化程序块范围内声明的变量不能在块外部访问。