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

时间:2015-06-06 07:59:07

标签: 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());
    }
}

7 个答案:

答案 0 :(得分:25)

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

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

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

答案 1 :(得分:6)

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

public Test0()
{
    this("Hello");
}

答案 2 :(得分:5)

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

new Test0("Hello"){};

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

在记忆中它就像

enter image description here

答案 3 :(得分:3)

因为你创建了一个名为“hello”的新的Test0实例,但从不使用它。

public Test() {

    new Test0("hello") // nothing is referencing this new object
}

您只需在另一个构造函数中创建一个对象,但它对第一个构造函数调用创建的实例没有任何影响。

答案 4 :(得分:3)

可以执行此操作,但此t.name用法的结果将在构造函数的末尾消失。特别是,null将为this("Hello")

使用for(...; oldCondition && ErrorCount < 20; ...) { } ValidationComplete();

答案 5 :(得分:3)

Name是实例变量。实例变量是特定于对象的。

使用新的Test0(&#34; Hello&#34;); ,您正在创建一个新的Test0实例。

如果你想让t.getName()返回&#34;你好&#34; [我的意思是与对象无关的字段值],将static String name; 字段更改为static:

?

答案 6 :(得分:0)

你可以通过下面的代码使用new关键字来显示输出。因为你在这里public Test0(){new Test("Hello){};"使用{}括号并不重要..所以当调用test0()构造函数时...在第一个构造函数中,这个构造函数test0(args);被称为bt。你没有显示输出。这将是你的&#34;你好&#34;将显示..所以只需编辑

`

public test0(String str)
{
 this.name=str;
System.out.println(str);
}`

你会得到你想要的输出。见下面的代码..

class test01{
public test01(String str)
{System.out.println(str);
   }
public test01(){

    new test01("Print");
}
}public class Const {
public static void main(String args[])
{test01 t = new test01();

    //System.out.println(t.getName());
    }}

此代码的输出将为您提供所需的字符串