任何人都可以向我推荐第1行和第2行之间的区别。哪种是首选方式?如果我们可以创建一个对象,那么为什么我们使用静态块呢? 什么是类中静态成员的执行顺序?
class Foo {
static {
// bar = new Bar();
System.out.println("IN Block");//LINE 1
}
public static Bar bar = new Bar();//LINE 2
public void doStuff() {
System.out.println("I am in Foo");
}
}
由于
答案 0 :(得分:0)
当JVM加载类时,将执行静态块。没有理由使用它来初始化静态字段,除非在某些边缘情况下。
答案 1 :(得分:0)
第一个是静态匿名块,它由类加载器调用一次。首次引用Foo时。
第二个是静态变量,bar的一个实例在所有foos之间共享。
答案 2 :(得分:0)
在您的示例中,两行之间没有太大差异。您已经创建了一个静态实例,但是如果您需要对静态实例执行更多操作,例如加载Bar
某些功能会怎样?
static {
bar = new Bar();
bar.doSomeStuff("This", "Is", "An", "Argument", "List");
}
这是static
块的目的。至于它们何时被执行,它们在JVM加载类时运行,与创建static
字段的方式非常相似。
答案 3 :(得分:0)
一个类可以有任意数量的静态初始化块,和 它们可以出现在课堂体内的任何地方。运行时系统 保证在顺序中调用静态初始化块 它们出现在源代码中。别忘了,这段代码 将在JVM加载类时执行。 JVM结合了所有这些 阻塞到一个静态块然后执行。这是一个 我想提一下几点:
If you have executable statements in the static block, JVM will automatically execute these statements when the class is loaded into JVM.
If you’re referring some static variables/methods from the static blocks, these statements will be executed after the class is loaded into JVM
i.e., now the static variables/methods referred and the static block both will be executed.
答案 4 :(得分:0)
正如我们许多人已经回复的那样,在加载类时会执行静态块。
现在创建对象,对象创建与静态块没有关系。让我们来看一个场景,有时你需要一些应该在创建实际实例之前执行的代码。 E.g。
public class Test{
static{
//Load Library
System.loadLibrary("hello");
}
void aMethod(){
//some code
}
public static void main(String str[]){
//some code for main
}
}
使用时:
>java Test
所以这里的主要意图是在你调用任何方法之前,甚至在初始化类之前,它应该将库加载到系统环境中。该库可以在整个程序的任何时间使用。这是使用静态块的一个很好的例子。它并不仅仅用于System.out等语句。
有任何问题/困惑吗?请告诉我?