1

这是示例代码:

class A {

   static {
       int a;
       class B {
       }
   }

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

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

4

6 回答 6

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 教程中的初始化字段

于 2012-09-06T19:44:52.413 回答
2

静态 {} 块中的代码将在第一次加载类(不是此类的对象)时执行。 看到这个

于 2012-09-06T19:48:41.050 回答
1

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

JVM 加载此类时执行静态块。可以有很多这样的块,它们将按照出现的顺序执行

于 2012-09-06T19:46:19.580 回答
1

这是一个静态初始化块。这是Oracle Java SE 文档静态初始化块

在您的示例中,int a是静态初始化块的局部变量。这是关于静态初始化块中的局部变量的另一篇 Stackoverflow 帖子:Java 中静态块内声明的变量的范围是什么?. 这就是为什么您无法在 main 方法中访问它的原因。

于 2012-09-06T19:49:30.437 回答
0

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

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

于 2012-09-06T19:51:59.843 回答
0

这是静态初始化程序块。

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

于 2012-09-06T19:54:30.500 回答