Java ';新';关键字和构造函数工作

Java ';新';关键字和构造函数工作,java,Java,好的,我正在学习我的第一个java认证,我不能完全理解当创建一个对象时在引擎盖下面发生了什么,一些解释说iv'e read声明构造函数返回对一个对象的引用,这对我来说是一个混乱的来源,因为据我所知,这是由new关键字完成的。我的问题是: 对对象的引用实际上来自哪里,“new”关键字还是构造函数 当使用“new”关键字创建对象时,它是否隐式地将该对象传递给构造函数 当使用“new”关键字创建对象时,在传递给构造函数(例如Person me=new Person())之前,它是否只是一个java对象

好的,我正在学习我的第一个java认证,我不能完全理解当创建一个对象时在引擎盖下面发生了什么,一些解释说iv'e read声明构造函数返回对一个对象的引用,这对我来说是一个混乱的来源,因为据我所知,这是由new关键字完成的。我的问题是:

  • 对对象的引用实际上来自哪里,“new”关键字还是构造函数
  • 当使用“new”关键字创建对象时,它是否隐式地将该对象传递给构造函数
  • 当使用“new”关键字创建对象时,在传递给构造函数(例如Person me=new Person())之前,它是否只是一个java对象;这个对象是在创建时就与类person关联,还是只在传递给构造函数之后才与类person关联
  • new构造函数(参数)
    的整个表达式被视为一个实例创建表达式,作为单独的
    new
    关键字和构造函数调用没有意义

    JLS描述了实例的实际创建,包括三个步骤:

  • 限定表达式(使用
    新建时不适用)
  • 在内存中为实例分配空间,并将字段设置为默认值
  • 计算构造函数的参数,并调用构造函数
  • 首先,如果类实例创建表达式是限定类 实例创建表达式,限定的主表达式为 评价的。如果限定表达式的计算结果为null,则 引发NullPointerException,并创建类实例 表达式突然完成。如果限定表达式完成 突然,类实例创建表达式突然完成 出于同样的原因

    接下来,为新类实例分配空间。如果有 空间不足,无法分配对象,无法评估类 实例创建表达式通过抛出 OutOfMemoryError

    新对象包含中声明的所有字段的新实例 指定的类类型及其所有超类。每一个新领域 实例创建后,将其初始化为默认值(§4.12.5)

    接下来,计算构造函数的实际参数, 从左到右。如果任何参数计算突然完成, 不计算其右侧的任何参数表达式,并且 实例创建表达式由于相同的原因突然完成

    接下来,调用指定类类型的选定构造函数。 这将导致为每个超类调用至少一个构造函数 类类型的。这个过程可以由显式的 构造函数调用语句(§8.8),并在 §12.5

    类实例创建表达式的值是对 指定类的新创建的对象。每次 计算表达式时,将创建一个新对象

  • 是的,作为字节码,这一切都变成了一个invokespecial调用,新实例位于传递的参数堆栈的底部。请看下面的答案。但是,从语义上讲,构造函数不会将新实例“传递”给它,但该实例在Java源代码中作为
    this
    提供

  • 这个问题在语义上没有意义,因为在构造函数返回之前,对象对外部世界“不存在”。如果构造突然终止,则对象不会实际创建并可用。但是,至少在OpenJDK JVM上的内存中,对象的类型以及它扩展/实现的任何类型都会写入内存报头。然而,并非所有实现都能保证这一点
  • 拆卸: 我编译并反汇编:

    class Test{
        public static void main(String args[]){
            Integer s = new Integer(2);
        }
    }
    
    结果是:

    public static void main(java.lang.String[]);
        Code:
           0: new           #2                  // class java/lang/Integer
           3: dup
           4: iconst_2
           5: invokespecial #3                  // Method java/lang/Integer."<init>":(I)V
           8: astore_1
           9: return
    
    然后推送我传递给构造函数的常量值:

    2
    our new Integer
    our new Integer
    

    invokespecial
    发生,它传递最上面的两个堆栈元素——新实例和构造函数的参数。

    最后一个小闭包lol,我很想怀疑我所知道的,谢谢你的消息answer@Kakarot没问题,如果有帮助,请随意投票,如果没有帮助,请进一步提问。
    2
    our new Integer
    our new Integer