java - 对象创建过程中究竟发生了什么? ( java )

标签 java oop object inheritance constructor

我一直在学习 Head First Java,目前正在学习构造函数章节。他们解释说,对象是通过在 new 关键字之后调用构造函数来创建的。

我的问题:创建新对象时运行的到底是什么?

我们以以下示例代码为例:

public class Const {

    // instance variables
    int number;
    String name;


    // Constructors
    public Const() {
        //implicit super
        System.out.println("no-arg constructor");
    }
    public Const(int i, String s) {
        //implicit super()
        number = i;
        name = s;
        System.out.println("two-arg constructor");
    }


    // test method
    public void doSomething() {
        System.out.println("I'm a test");
    }


    // Main
    public static void main(String[] args) {

        Const c1 = new Const();
        Const c2 = new Const(5, "Jerry");
    }
}

现在,我认为创建 c1 时幕后发生的事情是:

  1. public Const() 被调用
  2. super() 被调用
  3. Const 的 Object 部分已构建。
  4. public Const() 回到堆栈顶部。
  5. 现在我的麻烦来了。对象的实例变量和方法是何时以及如何创建的(添加了哪些隐式代码)?

最佳答案

What exactly happens during object creation? (Java)

  • 构造函数被调用,它将调用父类的super方法(默认为Object类,因此新类将有权访问Object类的所有成员)
  • 内存分配
  • 字段已初始化(通过分配的值或如果未给出则采用默认值)
  • 构造函数的其余代码块将被执行

所以这里唯一的区别是:

Const c1 = new Const();

这里的number将由int默认值初始化,即0,name将由null初始化,这是String的默认值

Const c2 = new Const(5, "Jerry");

这里分别是 5 和 Jerry

使用new Const(),构造函数将被调用,类将被加载到主内存。

public Const() {
        //implicit super 
        super()
    }

java中的super关键字是一个引用变量,用于引用父类对象,默认是Object类。关键字“super”随着继承的概念而出现。

现在它可以访问 Object 类的所有成员,即 toString、equals :

您可以访问

c1.toString() or c1.equals(obj)

When and how exactly are the instance variables and methods for the object created (what implicit code is added)?

我想现在您已经了解了实例变量是如何创建的,以及根据类型为其分配默认值。

如果仍然不清楚,请尝试了解内部拱门,这可能会有所帮助:

JVM Arch

关于java - 对象创建过程中究竟发生了什么? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59755973/

相关文章:

java - 将 libgdx 中的桌面应用程序转换为 android 的步骤是什么?

java - 在 XSLT 和 Java 类之间共享 XPath

C#/面向对象的设计——维护有效的对象状态

scala - 对象-功能阻抗不匹配

javascript - 当我想发布 JSON 文件 HTTP REQUEST 时,为什么会收到错误 400

java - 解析更新对象而不更改updatedAt

java - 在Java中通过长整数传递9位数字来发出增量sum=0

Java接口(interface)类型作为构造函数参数

javascript - 将现有对象检索到变量中?

python - python强制创建新的内存对象