我知道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后,您可以在其声明中引用公共方法和变量,这将为您提供所需的数据,作为对调用的响应。重要的是要理解构造函数不返回任何东西——它只是创建一个实例,然后可以用来引用实例化类中声明的方法和变量(返回数据)。