我一直在学习 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
时幕后发生的事情是:
public Const()
被调用super()
被调用- Const 的
Object
部分已构建。 public Const()
回到堆栈顶部。- 现在我的麻烦来了。对象的实例变量和方法是何时以及如何创建的(添加了哪些隐式代码)?
最佳答案
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)?
我想现在您已经了解了实例变量是如何创建的,以及根据类型为其分配默认值。
如果仍然不清楚,请尝试了解内部拱门,这可能会有所帮助:
关于java - 对象创建过程中究竟发生了什么? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59755973/