我有以下代码段:
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。
为什么会这样?
答案 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";
}