2016-03-09 81 views
4

我有下面的代码片段:我们可以初始化构造函数中的静态变量吗?

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,即使该字符串在构造函数中初始化。

这是为什么?

+2

公共无效构造函数(){不是构造函数,它的普通方法 – SpringLearner

+3

至于你的问题:你可以,但你不应该。这是非常糟糕的风格。 –

+1

但在我看来,想要在构造函数中初始化静态变量没有任何意义吗?一个静态变量可以在没有对象的情况下访问,因此如果需要在构造函数中进行初始化,该变量不应该是静态的。 – user16655

回答

4

正如我在评论中提到public void Constructor(){是不是构造,因为构造函数没有返回type.As你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); 

} 


} 

输出:你好世界

+0

非常感谢您澄清 – abhi1489

+0

@ abhi1489欢迎您。您可以接受您认为对您最有帮助的解决方案之一。 – user3437460

9

public void Constructor()不是一个构造函数..它是一个void方法。如果删除void,它应该工作打算

1

我有下面的代码片段的输出是NUL L偶数虽然该字符串的构造

构造函数内初始化不有返回类型。您当前所谓的构造函数带有返回类型void,因此它不再是构造函数,而是您的类的一种方法。

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

感谢您的帮助 – abhi1489

1

另外,作为一个侧面说明:

与再试一次,你可以使用一个静态块静态变量的初始化。在你的情况下,像这样:

static { 
    str="Hello World"; 
} 

这意味着你只能在每次执行构造时初始化变量一次,没有。

0

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

让我详细说明一下。

在构造函数中初始化它的值时;你实际上正在给它分配一些价值。当你创建你的类的对象时,它总是会被分配的(当你想要初始化静态数据成员时,你并不打算这么做)。

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

无论何时将类通过JVM加载到内存中,都会执行静态块。因此,一旦你的类被加载,你在静态块中定义的任何分配都会发生在第一次和最后一次,直到你的类在内存中。

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

在你的情况介绍下面的代码片段的类中

static { 
    str = "Hello World"; 
} 
相关问题