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

时间:2012-01-15 07:08:19

标签: java constructor jvm bytecode

我们知道我们不必向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级别甚至更低。

8 个答案:

答案 0 :(得分:17)

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

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

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

静态初始化程序称为<cinit>,它不带参数,构造函数名为<init>。两者都有一个void返回类型。

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

答案 1 :(得分:3)

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

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

有关详细信息,请参阅Section 8.8 of the Java Language Specification

答案 2 :(得分:3)

  

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

但是,如果指定这样做的话。

  

编译器是否将返回类型引用到同一个类的构造函数??

它没有

  

构造函数发生了什么?

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

  

任何参考研究这个。??

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

构造函数返回被调用的类的类引用。例如.-

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 = new A(4))。

答案 6 :(得分:0)

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

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;
    }
}

答案 7 :(得分:-1)

构造函数仅用于初始化类成员和

  • 构造函数名称和类名相同
  • 构造函数不能有返回类型
  • 在创建对象时始终调用构造函数
  • 构造函数始终公开