我知道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());
}
}
答案 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
在记忆中它就像
答案 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());
}}
此代码的输出将为您提供所需的字符串