在Java中创建对对象的引用时?

在Java中创建对对象的引用时?,java,constructor,Java,Constructor,对对象a的引用何时停止为null? 一旦调用构造函数或当构造函数完成时?行a=new myClass;有几件事正在发生: 新myClass;创建新对象的实例。此时a仍然为空。严格地说,它甚至不是null,它不是初始化状态。 Assignment operator=指定一个新值,该值是指向在步骤1中创建的对象的链接 所以a只有在赋值完成后才有合适的值 如果您查看字节码,您可以看到实际的赋值发生在第13行。 字节码: class myClass{ public myClass(){

对对象a的引用何时停止为null? 一旦调用构造函数或当构造函数完成时?

行a=new myClass;有几件事正在发生:

新myClass;创建新对象的实例。此时a仍然为空。严格地说,它甚至不是null,它不是初始化状态。 Assignment operator=指定一个新值,该值是指向在步骤1中创建的对象的链接 所以a只有在赋值完成后才有合适的值

如果您查看字节码,您可以看到实际的赋值发生在第13行。 字节码:

class myClass{
    public myClass(){
        // INITIALIZATION
    }
    ...
}
...
myClass a;
...
a = new myClass();
在单独的行中声明变量只是一种语法上的糖分,对字节码没有影响。javac编译器将以与myClass a=new myClass;相同的方式处理您的代码

考虑以下示例,添加System.out作为示例代码:

Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: new           #2                  // class a$MyClass
       7: dup
       8: aload_0
       9: aconst_null
      10: invokespecial #3                  // Method a$MyClass."<init>":(La;La$1;)V
      13: astore_1
      14: return
它生成以下字节码javap-v Main.class:

代码: 堆栈=2,局部变量=2,参数大小=1 0:getstatic 7//Field java/lang/System.out:Ljava/io/PrintStream; 3:ldc 13//字符串b 5:invokeVirtual15//方法java/io/PrintStream.println:Ljava/lang/String;v 8:新21//class myClass 11:dup 12:invokespecial 23//方法myClass.:V 15:astore_1 16:返回
在处理之前执行System.out。

您可以通过使用静态字段在构造期间打印出对象的值来测试这一点

myClass a;
System.out.println("b");
a = new myClass();
输出:

空的

测试。Test@7852e922


由于静态对象t尚未分配,因此从构造函数内部的打印结果来看,输出显示为null,但在完成t=new测试后,现在似乎已经分配了t。

分配表达式完成后。这必须在new myClass完成之后进行。当构造函数从该线程的角度成功返回时,这是在构造完成之后。这感觉像是一个问题:你想做什么需要你知道?@Luigi2405如果你分享这些原因,你可能会得到一个更有用的答案:那是针对具有默认值的类字段。方法体中的正则变量不会。我知道该字段将有一个默认值,这只是为了表明在新测试完成之前不会分配t,我并不意味着t的初始值将始终为空。
class Test {    
    public static Test t;
    
    public Test() {
        System.out.println(t);
    }
    
    public static void main(String[] args) 
    {
        t = new Test();
        System.out.println(t);
    }
}