【问题标题】:What exactly happens during object creation? (Java)在对象创建过程中究竟发生了什么? (爪哇)
【发布时间】:2020-05-02 11:44:30
【问题描述】:

我一直在学习 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. 现在我的麻烦来了。对象的实例变量和方法是何时以及如何创建的(添加了哪些隐式代码)?

【问题讨论】:

  • 你似乎问了 4 个问题而不是 1 个
  • 具体细节因实现而异。但实际上,发生的情况是对象首先在内存中分配,包括所有内容、所有字段和所需的引用。然后调用初始化器和构造器。
  • 我怀疑docs.oracle.com/javase/specs/jls/se10/html/jls-12.html#jls-12.5 会回答你的大部分问题。
  • 抱歉,问题已修改。 @JonSkeet 感谢您的文档。有点清除它:)
  • @JonSkeet 发言了!!!!!

标签: java oop object inheritance constructor


【解决方案1】:

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

  • 被调用的构造函数,会调用父类的super方法(默认是Object类,所以新的Class可以访问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,等于:

你可以访问

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

实例变量和方法何时以及如何准确 创建的对象(添加了什么隐式代码)?

我想你现在明白了如何创建实例变量,并根据类型为它们分配默认值。

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

JVM Arch

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多