【发布时间】:2025-12-05 23:40:01
【问题描述】:
这里是 Java 和 OOP 的新手。
我试图了解何时可以使用对象的成员。具体来说,为什么在类中调用实例变量时不能将实例变量传递给构造函数?示例代码如下:
public class Point {
public String name;
{
name = "Henry";
}
public Point()
{
this(this.name); // cannot reference this before supertype constructor has been called
}
public Point(String name)
{
this.name = name;
}
}
以前有人问过这样的问题,但我不知道如何向 Google 询问我在此解释的内容。我知道我不能在 this(this.name) 调用中引用 this.name,因为尚未创建对象引用,但 Java 究竟是如何调用构造函数的?
构造函数将被执行的唯一时间是使用new Point()创建对象时,此时对象引用将可用,并且编译器将没有任何东西可以执行抱怨。如果可以将this.name 分配给一个变量,然后将其传递给this(variable),它会起作用吗?有什么巨大的区别?我在这里完全误解了一些东西。
这就是我想象的方式,这显然是不正确的:
Point myPoint = new Point();
myPoint.name 现在等于 "Henry"
在Point() 构造函数中,执行this(this.name) // which should be "Henry"
【问题讨论】:
-
无聊的细节应该主要在docs.oracle.com/javase/specs/jls/se8/html/jls-12.html (在你的情况下,如果超类已经声明了该字段并且想要在它的构造函数中设置它会发生什么?这大致就是为什么 super 必须运行在你可以使用任何东西之前)
-
当您执行
new Point()时,就像new是一个返回对刚刚在堆上构造的Point对象的引用的方法(在引擎盖下只是一点内存包含所有实例变量/引用/...dzone.com/articles/java-object-memory)。它不会首先创建Object。直接是Point。但是Point是Object(通过继承),所以Object构造函数会找到它所知道的期望。因此,当您extend时,您不能带走。
标签: java oop constructor