Java构造函数是否返回Object引用



我知道Java的构造函数不能有任何类型,有趣的是,它甚至不能是void。对此的逻辑解释是构造函数返回初始化对象的引用。

MyClass myObject = new MyClass();

myClass的构造函数现在将在实例化后返回对象引用,并将其保存在对象变量MyObject中,这就是构造函数不能具有返回类型的原因。

是这样吗?有人能证实吗?

不,实际上,构造函数被编译成类文件式的方法,名称为<init>,返回类型为void。您可以在堆栈跟踪中看到这些"<init>"调用。表达式new Type()被编译为指令new,该指令仅创建Type的实例和对Type中声明的构造函数之一的附加方法调用(invokespecial)。

验证器将确保在新创建的实例上一次调用这样一个特殊的方法,并且在使用对象之前调用它。

从Java语言的角度来看,让构造函数没有返回类型只是编程语言设计的决定。毕竟,new Type(…)是一个表达式,其计算结果为新创建的Type实例,并且您无法从具有该编程语言构造的构造函数中获得返回值。此外,如果添加返回类型,Java将无条件地假设它是一个方法,即使它与类具有相同的名称。

这就是它的定义:(它使解析类定义变得更容易)

ConstructorDeclarator中的SimpleTypeName必须是包含构造函数声明的类的简单名称,否则将发生编译时错误。

在所有其他方面,构造函数声明看起来就像一个没有结果的方法声明(§8.4.5)

我想你可以说构造函数有一种"特殊语法",专门用于返回所需对象的实例。在这些情况下,您不会指定返回类型。new关键字与构造函数方法一起使用,以生成类类型的实例。

如果你想控制实例生成方法的返回类型,那么你可能应该考虑使用一种类型的工厂设计模式,其中静态方法创建一个实例(使用构造函数),然后返回一个更明确的类型(例如,超类型或接口类型)。

当您希望根据某个参数决定返回哪种类型,但将实际类型隐藏给实例生成方法的使用者时,这种模式是很好的。

构造函数不是一种方法。它不会返回任何内容。它用于初始化目的,当这些初始化依赖于参数或有可能引发异常时(尽管两者都是可选的),它尤其有用。

因此,与方法不同,它不是继承的,也没有返回类型(甚至没有void)。

其思想是通过调用构造函数本身来"构造"MyClass的实例。构造函数的思想是实例化而不是返回。创建myObject后,您可以在其声明中引用公共方法和变量,这将为您提供所需的数据,作为对调用的响应。重要的是要理解构造函数不返回任何东西——它只是创建一个实例,然后可以用来引用实例化类中声明的方法和变量(返回数据)。

最新更新