我们可以在构造函数中初始化静态变量吗?

时间:2016-03-09 06:23:57

标签: java

我有以下代码段:

class Constructor {

  static String str;

  public void Constructor() {
      System.out.println("In constructor");
      str = "Hello World";
  }

  public static void main(String[] args) {
      Constructor c=new Constructor();
      System.out.println(str);
  }
}

即使在构造函数内初始化了字符串,它的输出也为null。

为什么会这样?

5 个答案:

答案 0 :(得分:9)

public void Constructor()不是构造函数..它是 void方法。如果您删除void,它应按预期工作

答案 1 :(得分:5)

正如我在评论中提到的public void Constructor(){不是构造函数,因为构造函数没有返回类型。因为Constructor是无效的,所以它不是构造函数

删除void关键字

class Constructor {

static String str;

public Constructor(){
    System.out.println("In constructor");
    str="Hello World";
}

public static void main(String[] args) {
    Constructor c=new Constructor();

    System.out.println(str);

}


}

输出:Hello World

答案 2 :(得分:1)

  

我有以下代码片段,即使字符串在构造函数内初始化,其输出也为null

构造函数 具有返回类型。您当前所谓的构造函数的返回类型为void,因此它不再是构造函数,而是您类的方法。

再试一次:

public Constructor(){  //void removed
    System.out.println("In constructor");
    str="Hello World";
}

答案 3 :(得分:1)

另外作为旁注:您可以使用静态块来初始化静态变量。在你的情况下是这样的:

static {
    str="Hello World";
}

这意味着您只需初始化变量一次,而不是每次执行构造函数时。

答案 4 :(得分:0)

是的,你可以。但你不应该。

让我详细说明一下。

在构造函数中初始化其值时;你实际上正在为它分配一些价值。无论何时创建类的对象(当你想要正确地初始化静态数据成员时,你都没想要这样做),它总会被分配。

这里有静态块来拯救我们。

只要JVM 将类加载到内存中,就会执行静态块。因此,一旦你的类被加载,你在静态块中定义的任何赋值都会在第一次和最后一次发生,直到你的类在内存中。

因此,理想的是使用静态初始化程序块始终初始化静态数据成员。

在你的案例中,在你的课程中引入下面的代码片段

static {
    str = "Hello World";
}