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

时间:2014-10-29 08:47:29

标签: java constructor reference

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

MyClass myObject = new MyClass();

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

是吗?有人可以证实这一点吗?

4 个答案:

答案 0 :(得分:6)

不,实际上,构造函数被编译到类文件like methods having the name <init> and a void return type.中。您可以在堆栈跟踪中看到这些"<init>"调用。表达式new Type()被编译为指令new,它只是为{{1}中声明的构造函数之一创建Type实例和另一个方法调用(invokespecial)。 }}

验证程序将确保在新创建的实例上只调用一次这样的特殊方法,并在对象的任何其他使用之前调用它。

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

That’s simply how it was defined :(这使得解析类定义更容易)

  

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

     

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

构造函数不是一个构造函数。它没有返回任何东西。它用于初始化目的,当这些初始化依赖于参数或者有可能抛出异常时(尽管两者都是可选的),尤其有用。

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

答案 3 :(得分:0)

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