![](/img/trans.png)
[英]Does the Java constructor return an object or an object's ID when called?
[英]Does a Java constructor return the Object reference?
我知道Java的构造函数不能有任何类型,有趣的是它甚至不能void
。 对此的逻辑解释是构造函数返回初始化对象的引用。
MyClass myObject = new MyClass();
myClass
的构造函数现在将在实例化之后返回对象引用并将其保存在对象变量MyObject
,这就是构造函数不能具有返回类型的原因。
是对的吗? 有人能证实吗?
不,实际上,构造函数被编译到类文件中, 就像具有名称<init>
和void
返回类型的方法一样。 您可以在堆栈跟踪中看到这些"<init>"
调用。 表达new Type()
被编译为一个指令new
刚刚创建的实例Type
和另外的方法invokation( invokespecial
)到中声明的构造函数之一Type
。
验证程序将确保在新创建的实例上只调用一次这样的特殊方法,并在对象的任何其他使用之前调用它。
这只是一种编程语言设计决策,让构造函数从Java语言的角度来看没有返回类型。 毕竟, new Type(…)
是一个表达式,它计算新创建的Type
实例,并且您无法从具有该编程语言结构的构造函数中获取返回值。 此外,如果添加返回类型,Java将无条件地假定它是一个方法,即使它与类具有相同的名称。
这就是它的定义方式 :(它使得解析类定义更容易)
ConstructorDeclarator中的SimpleTypeName必须是包含构造函数声明的类的简单名称,否则会发生编译时错误。
在所有其他方面,构造函数声明看起来就像没有结果的方法声明(第8.4.5节)。
我想你可以说构造函数有一个专门用于返回所需对象实例的“特殊语法”。 在这些情况下,您不指定返回类型。 new关键字与构造函数方法一起使用,以生成类类型的实例。
如果您想控制实例生成方法的返回类型,那么您可能应该考虑使用一种工厂设计模式,其中静态方法创建一个实例(使用构造函数),然后返回更明确的type(例如,超类型或接口类型)。
当您想根据某个参数决定返回哪种类型时,此模式很好,但是将实际类型隐藏给实例生成方法的使用者。
构造函数不是一个构造函数。 它没有返回任何东西。 它用于初始化目的,当这些初始化依赖于参数或者有可能抛出异常(尽管两者都是可选的)时尤其有用。
因此,与方法不同,它不是继承的,也没有返回类型(甚至不是void)。
这个想法是你通过调用构造函数本身来“构造”MyClass的一个实例。 构造函数的想法是实例化而不是返回。 创建myObject后,您可以引用其声明的公共方法和变量部分,它将为您提供作为呼叫答案返回的所需数据。 重要的是要理解构造函数不返回任何它只是创建一个实例,然后可以用它来引用在实例化类中声明的方法和变量(返回数据)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.