Java 使用;这";初始化实例变量时,它引用哪个对象以及它是如何工作的?
在将此标记为重复之前,请阅读问题一次。我已经阅读了与本相关的问题 我有两个java类Test2和Test,如下所示。据我所知,Java 使用;这";初始化实例变量时,它引用哪个对象以及它是如何工作的?,java,Java,在将此标记为重复之前,请阅读问题一次。我已经阅读了与本相关的问题 我有两个java类Test2和Test,如下所示。据我所知,这个指的是当前对象,可以在构造函数、非静态方法和其他问题(上面给出的链接)中给出的各种其他地方使用。但是当我在Test2中使用这个初始化实例变量时: 它指的是哪个对象,如果它指的是当前正在调用的对象,为什么它不打印helloworld 若并没有,那个么这里引用的是哪个对象,它是如何传递给实例变量的 类Test2.java public class Test2 { p
这个
指的是当前对象,可以在构造函数
、非静态方法
和其他问题(上面给出的链接)中给出的各种其他地方使用。但是当我在Test2中使用这个初始化实例变量时:
它指的是哪个对象,如果它指的是当前正在调用的对象,为什么它不打印helloworld代码>
若并没有,那个么这里引用的是哪个对象,它是如何传递给实例变量的
类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);
}
}
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;
}
}
Class Test.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);
}
}
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
com.avnet.spoj.lifeuniverse.Test2@56e5b723
Hello World!
Hello World!
注意:如果我在构造函数中移动实例变量初始化,如下所示。我能理解这一点。有人能解释一下这个
的上述行为吗
private String test2Str;
private Test test = null;
public Test2(String str){
this.test2Str = str;
test = new Test(this);
}
程序的第二个输出:
com.avnet.spoj.lifeuniverse.Test2@56e5b723
null
null
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;
}
因此,当调用newtest(this)
时,this
是正在构造的Test2实例,但在调用时,this.test2Str=str
尚未执行,因此istest2Str
为空。这就是你看到的原因
null
null
正在印刷
在第二个示例中,在执行this.test2Str=str
之后,调用newtest(this)
,这就是您看到的原因
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;
}
因此,当调用newtest(this)
时,this
是正在构造的Test2实例,但在调用时,this.test2Str=str
尚未执行,因此istest2Str
为空。这就是你看到的原因
null
null
正在印刷
在第二个示例中,在执行this.test2Str=str
之后,调用newtest(this)
,这就是您看到的原因
Hello World!
Hello World!
正在印刷
您应该真正避免将此
从构造函数泄漏到外部对象,甚至是可重写的方法:这些外部对象将看到一个部分构造的对象,因此不尊重其不变量。此
指出现在其中的类的“当前实例”,但是,在初始化过程中使用它作为第一个示例是部分未定义的。代码在构造函数运行之前运行;在构造函数完成之前引用变量实例的任何内容都必须被视为可疑。这至少是一种糟糕的编码实践。此
引用了它出现在其中的类的“当前实例”,但在初始化过程中使用它作为第一个示例是部分未定义的。代码在构造函数运行之前运行;在构造函数完成之前引用变量实例的任何内容都必须被视为可疑。至少,这是一种糟糕的编码实践。从下面的答案可以看出:
初始化器在构造函数体之前执行。(如果同时具有初始化器和构造函数,则构造函数代码将在第二个执行并重写初始化值)。由此回答:
初始化器在构造函数体之前执行。(这意味着,如果同时具有初始化器和构造函数,则构造函数代码将执行第二个并重写初始化值)。您的代码甚至不会编译。Test2中没有getStr()方法。您的代码甚至没有编译。Test2中没有getStr()方法。