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

java中构造函数的返回类型是什么?,java,constructor,jvm,bytecode,Java,Constructor,Jvm,Bytecode,正如我们所知,我们不必向Java构造函数添加任何返回类型 class Sample{ ..... Sample(){ ........ } } 在目标C中,如果我们创建一个构造函数,它将返回一个指向其类的指针。但我认为这不是强制性的 AClass *anObject = [[AClass alloc] init];//init is the constructor with return type a pointer to AClass 类似地,构造函数是否转换为返回对自

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

class Sample{
  .....
  Sample(){
    ........
  }
}
在目标C中,如果我们创建一个构造函数,它将返回一个指向其类的指针。但我认为这不是强制性的

AClass *anObject = [[AClass alloc] init];//init is the constructor with return type a pointer to AClass
类似地,构造函数是否转换为返回对自己类的引用的方法

像这样:

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

      return this;
    }
}
编译器是否向构造函数添加对同一类的引用的返回类型? 构造函数发生了什么? 有没有关于这方面的参考资料

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

构造函数与方法类似,只是它们使用类的名称,并且没有返回类型。使用构造函数的全部目的是创建一个对象(类的一个实例)并在内存(堆)中分配它(通过
new
关键字),还可以初始化任何字段(如果可用)。

构造函数是通过特殊的java关键字
new
调用的,它创建(并初始化)指定具体类型的对象


我想你可以说
new
和所选构造函数的组合“返回”了一个对象,在java中,它当然是一个隐藏的指针

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

构造函数由类实例创建表达式(基本上是使用
new
)调用,由其他构造函数显式调用(使用
this(…)
super(…)
语法)调用,并由字符串连接操作符调用。没有其他方法可以调用构造函数(特别是,它们不能像其他方法一样被调用)

有关更多信息,请参阅

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

但如果指定这样做,则为是

编译器是否向构造函数添加对同一类的引用的返回类型

它没有

构造函数发生了什么事

它是在创建对象时运行的方法。通常,通过使用“new”关键字。它可能会执行一些初步任务,或者在构建过程中返回一些内容或分配一些值

有没有关于这方面的参考资料


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

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

如果您尝试只在字节码中创建对象而不调用构造函数,则会出现VerifyError。但是,在oracle JVM上,您可以使用Unsafe.allocateInstance()创建对象,而无需调用构造函数

静态初始化器称为
,不带任何参数,构造函数称为
。两者都有一个void返回类型


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

构造函数才会返回调用它的类的类引用-

class A {
    int x;
    A(int a) {
        x = a;
    }
}
class B {
    public static void main(String asd[]) {
        A a = new A(4);
        System.out.println(a);
    }
}

在调用构造函数
A(…)
后,此构造函数将向调用者返回类
A
类型的引用(即
A A=newa(4)
)。

构造函数的返回类型是对应的类类型

package com.ie.test;
import java.lang.reflect.*;

public class a {
    public  a() {
        super();
        System.out.println("*** no-arg constructor ***");
    }

    public static void main(String[] args) {

        Constructor[] constructors =  a.class.getConstructors();

        for (Constructor constructor:constructors) {

            int i =  constructor.getModifiers();
            AnnotatedType annotatedType =  constructor.getAnnotatedReturnType();
            System.out.println("***********Returntype *******"+annotatedType.getType());
            System.out.println("*******constructor *****"+Modifier.toString(i));
        }

        Method[] methods =  a.class.getDeclaredMethods();

        for (Method method:methods) {
            int i =  method.getModifiers();
            //  Class c =  method.getReturnType();
            AnnotatedType annotatedType =  method.getAnnotatedReturnType();
            System.out.println("***********Returntype *******"+annotatedType.getType());
            //   System.out.println(c);
            System.out.println("*******methods*******"+Modifier.toString(i));
        }
    }

    public int m1() {
        System.out.println("***************");
        return 0;
    }
}

我相信构造函数是特殊的,处理方法与普通方法调用不同。尽管“返回类型”是包含类型本身,但出于所有目的:尽管在代码级别从未显式返回任何内容。请给我一个参考以澄清我的错误doubt@sonuthomas是新的,,但是如果没有构造函数,就不能调用new。Ted Hopp给了我这个
构造函数是由类实例创建表达式(基本上是使用new)调用的,是由其他构造函数显式调用的(使用这个(…)或super(…)语法),通过字符串连接运算符。
@sonuthomas您仍然需要在
new
关键字之后使用构造函数,当然您可以在该构造函数中使用
this()
super()
。@praetoriandroid您说得对!但是,我更新了我的答案。我喜欢这样。这种类型的答案是我想要的…在JVM级别…请给我一个参考,让我学习more@peter“cinit”中的“c”代表什么?@Geek是“类初始值设定项”的缩写。在源代码级别,您所说的足够正确,但是公认的答案(Peter Lawrey的)根据提问者的要求,包括底层VM模型的详细信息。