gpt4 book ai didi

java - 在初始化实例变量时使用 "this",它引用哪个对象以及它是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 18:12:53 24 4
gpt4 key购买 nike

在将其标记为重复之前,请先阅读该问题一次。我已从 here 阅读了与 this 相关的问题已经。

我有两个java类Test2和Test,如下所示。据我了解 this 指的是当前对象,可以在构造函数非静态方法以及其他地方给出的各种其他地方使用问题(上面给出的链接)。但是当我使用 this 初始化 Test2 中的实例变量时:

  1. 它引用的是哪个对象,如果它引用当前调用的对象,为什么它不打印 Hello World!
  2. 如果没有,那么这里引用的是哪个对象以及它如何传递给实例变量?

类Test2.java

public class Test2 {

private String test2Str;
private Test test = new Test(this);//Please notice the instance variable init

public Test2(String str){
this.test2Str = str;
}

public Test getTest() {
return test;
}

public String getStr() {
return this.test2Str;
}

public void setTest(Test test) {
this.test = test;
}

public static void main(String[] args){
Test2 object = new Test2("Hello World!");

String thisStr = object.getTest().getStr();

System.out.println(thisStr);

}
}

类Test.java

public class Test {

String str;

public Test(Test2 test){

System.out.println(test);

System.out.println(test.getStr());

str = test.getStr();
}

public void setStr(String str){
this.str = str;
}

public String getStr(){
return this.str;
}
}

程序的第一个输出:

com.avnet.spoj.lifeuniverse.Test2@56e5b723
null
null

注意:如果我将实例变量初始化移动到构造函数内,如下所示。它按预期工作,我可以理解。有人可以解释 this 的上述行为吗?

private String test2Str;
private Test test = null;


public Test2(String str){
this.test2Str = str;
test = new Test(this);
}

程序的第二个输出:

com.avnet.spoj.lifeuniverse.Test2@56e5b723
Hello World!
Hello World!

最佳答案

第一个片段中的代码:

private String test2Str;
private Test test = new Test(this);//Please notice the instance variable init

public Test2(String str){
this.test2Str = str;
}

相当于

private String test2Str = null;
private Test test = null;

public Test2(String str){
test = new Test(this);
this.test2Str = str;
}

因此,当调用 new Test(this) 时,this 是正在构造的 Test2 实例,但在调用它时,this.test2Str = str 尚未执行,因此 test2Str 为 null。这就是为什么你会看到

null
null

正在打印。

在您的第二个示例中, new Test(this)执行后 this.test2Str = str 被调用,这就是您的原因参见

Hello World!
Hello World!

正在打印。

您确实应该避免将 this 从构造函数泄漏到外部对象,甚至泄漏到可重写的方法:这些外部对象将看到部分构造的对象,因此不会尊重其不变量。

关于java - 在初始化实例变量时使用 "this",它引用哪个对象以及它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com