java 匿名块中的静态变量
Static variable in an anonymous block in java
为什么我们不能在java中的匿名块中初始化静态变量?
例如:
为什么这段代码不能编译?
public class A {
{
static int a = 1;
}
}
我得到这个编译错误
Illegal modifier for the variable a; only final is permitted
为什么只有决赛?
来自
的文档
The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.
您编写的代码将移至构造函数。局部于构造函数的静态成员没有多大意义 它们必须在 class 级别声明 而不是局部于构造函数
并且您在错误消息中看到 只允许 final,因为如果您在声明时尚未初始化它们,则可以在构造函数中修改 final 变量.
{
static int a=1;
}
代码块中不能有static
修饰符,a
这里只是一个局部变量
直接在 class
内,一个块是 instance initializer block。您不能在实例初始化程序块中声明静态变量。只需将其从块中删除:
public class A {
static int a=1;
}
在创建实例时调用实例初始化程序块,先于任何实例构造函数中的代码。所以你不能在那里声明成员(静态或其他)是有道理的。它们是代码,就像在构造函数中一样。示例:
import java.util.Random;
public class Example {
private String name;
private int x;
private int y;
{ // This is the
this.x = new Random().nextInt(); // instance
this.y = this.x * 2; // initializer
} // block
public Example() {
this.name = null;
}
public Example(String name) {
this.name = name;
}
}
在上面,无论使用哪个构造函数,首先发生的是实例初始化块中的代码,然后是使用的构造函数中的代码。
还有 static
初始化程序块,当加载 class 时,它们对静态内容执行相同的操作。它们以关键字 static
开头,更多在 link 上面。
您可以在静态块中进行静态字段初始化。但不是声明。
public class A{
static int a;
static
{
a = 1;
}
}
为什么我们不能在java中的匿名块中初始化静态变量? 例如: 为什么这段代码不能编译?
public class A {
{
static int a = 1;
}
}
我得到这个编译错误
Illegal modifier for the variable a; only final is permitted
为什么只有决赛?
来自
的文档The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.
您编写的代码将移至构造函数。局部于构造函数的静态成员没有多大意义 它们必须在 class 级别声明 而不是局部于构造函数
并且您在错误消息中看到 只允许 final,因为如果您在声明时尚未初始化它们,则可以在构造函数中修改 final 变量.
{
static int a=1;
}
代码块中不能有static
修饰符,a
这里只是一个局部变量
直接在 class
内,一个块是 instance initializer block。您不能在实例初始化程序块中声明静态变量。只需将其从块中删除:
public class A {
static int a=1;
}
在创建实例时调用实例初始化程序块,先于任何实例构造函数中的代码。所以你不能在那里声明成员(静态或其他)是有道理的。它们是代码,就像在构造函数中一样。示例:
import java.util.Random;
public class Example {
private String name;
private int x;
private int y;
{ // This is the
this.x = new Random().nextInt(); // instance
this.y = this.x * 2; // initializer
} // block
public Example() {
this.name = null;
}
public Example(String name) {
this.name = name;
}
}
在上面,无论使用哪个构造函数,首先发生的是实例初始化块中的代码,然后是使用的构造函数中的代码。
还有 static
初始化程序块,当加载 class 时,它们对静态内容执行相同的操作。它们以关键字 static
开头,更多在 link 上面。
您可以在静态块中进行静态字段初始化。但不是声明。
public class A{
static int a;
static
{
a = 1;
}
}