关于班级中的静态成员

时间:2014-04-25 13:17:16

标签: java

任何人都可以向我推荐第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");

}
}

由于

5 个答案:

答案 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等语句。

有任何问题/困惑吗?请告诉我?