Java中构造函数的返回类型是什么?

2022-09-03 00:54:28

众所周知,我们不必向Java构造函数添加任何返回类型。

class Sample{
  .....
  Sample(){
    ........
  }
}

在 Objective C 中,如果我们创建一个构造函数,它将返回一个指向其类的指针。但我认为这不是强制性的。

AClass *anObject = [[AClass alloc] init];//init is the constructor with return type a pointer to AClass

类似地,构造函数是否转换为返回对其自己的类的引用的方法?

喜欢这个:

class Sample{
    .....
    Sample Sample(){
      ........

      return this;
    }
}

编译器是否将返回类型添加到构造函数中对同一类的引用?构造函数发生了什么?有什么参考来研究这个吗?

编辑:

实际上,我希望答案在字节码级别或JVM级别甚至更低。


答案 1

许多人已经回答了如何在Java中定义构造函数。

在 JVM 级别,静态初始化器和构造函数是返回 void 的方法。静态初始化器是静态方法,但是构造函数使用并且不需要返回任何内容。这是因为调用方负责创建对象(而不是构造函数)。this

如果尝试仅在字节码中创建对象而不调用构造函数,则会收到验证错误。但是,在oracle JVM上,您可以使用 Unsafe.allocateInstance()创建一个对象,而无需调用构造函数,

调用静态初始化器,它不带任何参数,构造函数称为 。两者都有 void 返回类型。<cinit><init>

在大多数情况下,这对Java开发人员是隐藏的(除非他们正在生成字节码),但是您唯一一次在堆栈跟踪中看到这些“方法”时(尽管您看不到返回类型)


答案 2

虽然构造函数类似于方法,但它们不是方法。它们没有返回类型,不被继承,并且不能被子类隐藏或覆盖。

构造函数由类实例创建表达式(基本上,使用 )、通过从其他构造函数显式调用(使用或语法)和字符串串联运算符调用。没有其他方法可以调用构造函数(特别是,它们不能像其他方法一样被调用)。newthis(...)super(...)

有关更多信息,请参见 Java 语言规范的第 8.8 节