我知道 Java 的构造函数不能有任何类型,有趣的是它甚至不能是void
。对此的合理解释是构造函数返回初始化对象的引用。
MyClass myObject = new MyClass();
的构造函数myClass
现在将在实例化对象后返回对象引用并将其保存在对象变量中MyObject
这就是构造函数不能有返回类型的原因。
是对的吗?有人可以证实这一点吗?
不,实际上,构造函数被编译到类文件中就像具有名称的方法<init> and a void返回类型。 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.9你可以看到这些"<init>"
堆栈跟踪中的调用。表达方式new Type()
被编译为指令new http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.new这只是创建了实例Type
和一个附加方法调用(invokespecial http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokespecial) 到声明的构造函数之一Type
.
验证者将确保在新创建的实例上恰好一次调用这种特殊方法,并且在对该对象进行任何其他使用之前调用它。
从 Java 语言的角度来看,让构造函数没有返回类型只是一种编程语言设计决定。毕竟,new Type(…)
is计算结果为新创建的实例的表达式Type
并且您无法使用该编程语言构造从构造函数获取返回值。此外,如果添加返回类型,Java 将无条件地假定它是一个方法,即使它与类同名。
这就是它的定义方式 http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8:(它使解析类定义更容易)
ConstructorDeclarator 中的 SimpleTypeName 必须是包含构造函数声明的类的简单名称,否则会发生编译时错误。
在所有其他方面,构造函数声明看起来就像没有结果的方法声明(第 8.4.5 节)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)