Java 使用;这";初始化实例变量时,它引用哪个对象以及它是如何工作的?

Java 使用;这";初始化实例变量时,它引用哪个对象以及它是如何工作的?,java,Java,在将此标记为重复之前,请阅读问题一次。我已经阅读了与本相关的问题 我有两个java类Test2和Test,如下所示。据我所知,这个指的是当前对象,可以在构造函数、非静态方法和其他问题(上面给出的链接)中给出的各种其他地方使用。但是当我在Test2中使用这个初始化实例变量时: 它指的是哪个对象,如果它指的是当前正在调用的对象,为什么它不打印helloworld 若并没有,那个么这里引用的是哪个对象,它是如何传递给实例变量的 类Test2.java public class Test2 { p

在将此标记为重复之前,请阅读问题一次。我已经阅读了与本相关的问题

我有两个java类Test2和Test,如下所示。据我所知,
这个
指的是当前对象,可以在
构造函数
非静态方法
和其他问题(上面给出的链接)中给出的各种其他地方使用。但是当我在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
    尚未执行,因此is
    test2Str
    为空。这就是你看到的原因

    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
    尚未执行,因此is
    test2Str
    为空。这就是你看到的原因

    null
    null
    
    正在印刷

    在第二个示例中,在执行
    this.test2Str=str
    之后,调用
    newtest(this)
    ,这就是您看到的原因

    Hello World!
    Hello World!
    
    正在印刷


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

    指出现在其中的类的“当前实例”,但是,在初始化过程中使用它作为第一个示例是部分未定义的。代码在构造函数运行之前运行;在构造函数完成之前引用变量实例的任何内容都必须被视为可疑。这至少是一种糟糕的编码实践。

    引用了它出现在其中的类的“当前实例”,但在初始化过程中使用它作为第一个示例是部分未定义的。代码在构造函数运行之前运行;在构造函数完成之前引用变量实例的任何内容都必须被视为可疑。至少,这是一种糟糕的编码实践。

    从下面的答案可以看出:

    初始化器在构造函数体之前执行。(如果同时具有初始化器和构造函数,则构造函数代码将在第二个执行并重写初始化值)。

    由此回答:


    初始化器在构造函数体之前执行。(这意味着,如果同时具有初始化器和构造函数,则构造函数代码将执行第二个并重写初始化值)。

    您的代码甚至不会编译。Test2中没有getStr()方法。您的代码甚至没有编译。Test2中没有getStr()方法。