可以在类的构造函数中使用"new"来调用Java中的另一个构造函数吗?

Dex*_*ter 12 java constructor

我知道这this(...)用于从另一个构造函数调用一个类的构造函数.但我们可以使用new相同的吗?

为了更清楚这个问题,Line-2是否有效?如果是(因为编译器没有投诉),为什么输出null不是Hello?

class Test0 {
    String name;

    public Test0(String str) {
        this.name= str;
    }

    public Test0() {
        //this("Hello");    // Line-1
        new Test0("Hello"){}; // Line-2
    }

    String getName(){
        return name;
    }
}

public class Test{
    public static void main(String ags[]){
        Test0 t = new Test0();
        System.out.println(t.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

man*_*uti 25

它是有效的,但它在该构造函数中创建了一个完全独立的实例Test0(更具体地说是一个匿名子类的实例Test0),并且它没有在任何地方使用.当前实例仍将字段name设置为null.

public Test0() {
    // this creates a different instance in addition to the current instance
    new Test0("Hello"){};
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果new使用无参数构造函数调用运算符,则会得到一个StackOverflowError.

  • 实际上,它不是创建一个`Test0`本身的实例,而是创建一个`Test0`的匿名子类.(在这种情况下,这不会改变任何东西,因为无论如何都会丢弃对象.) (9认同)

use*_*421 6

您尝试做的是通过您注释掉的代码完成的:

public Test0()
{
    this("Hello");
}
Run Code Online (Sandbox Code Playgroud)


Thu*_*tne 5

第2行是有效的声明.这就是编译器没有显示任何错误的原因.但是你在那里创建一个匿名对象.退出构造函数后,它很快就会消失.因此,该值仍然为null,因为没有分配给它.

new Test0("Hello"){};
Run Code Online (Sandbox Code Playgroud)

上面的行将创建一个Test0类的匿名实例,并将name值赋给name变量.但是,由于您没有引用创建的匿名实例,它将从后续行中消失.所以你还没有为调用特定代码段的实例的name变量赋值.因此名字是null

就像在记忆中一样

在此输入图像描述