以下是示例代码:
class A {
static {
int a;
class B {
}
}
public static void main(String[] args){
// cannot access class B and in a;
}
}
我不知道此上下文中的static
关键字是什么意思。我声明了一个int
变量和一个类。但我不能在A类或主方法中使用它。我编译,它不会产生任何错误。所以,我认为这种声明有一些目的。
答案 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
的原因是作用域。与构造函数和方法类似,在初始化程序块范围内声明的变量不能在块外部访问。