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