首先,先说结论,按照最简单的方式理解就行了:构造方法没有 return 任何东西,所以没有返回值。

// 构造方法的声明,就像是一个没有返回值的方法声明。

a constructor declaration looks just like a method declaration that has no result

按照这个说法来说,应该认为构造方法是没有返回值的。而且请注意,构造方法“就像是”一个没有返回值的方法声明。

其次,如果往底层深究,假设有以下代码:

package footest;
public class Test {
private void foo() {
String s = new String("Hello World");
System.out.print(s);
}

}new 关键词对应于JVM中的 new指令(对于数组来说是 newarray),new指令会在堆内存中创建一个String 类型的对象(假设新创建的对象叫A),并把它的引用放在当前的栈顶;

JVM调用String类对应的构造方法进行初始化;

取出栈顶的值,并将它放在本地变量表中 `s` 对应的位置(完成赋值);

所有的这些,都是根据Java语言规范来的,按照 https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.9 里面规定的,new关键字对应的是一个 Class Instance Creation Expressions(类示例化表达式),这个 类实例化表达式是用来创建对象的,而构造方法正式在类创建的期间被执行用于对象初始化的,只有在构造方法执行完了,类示例化表达式 才算是完成了。

最后,其实这个问题有很大一部分是翻译的问题,因为“构造方法”这个中文翻译给太容易让人以为它是一个“成员方法”了。其实不然,构造方法在Java语言规范里面叫 “Constructor” ,并不是一个成员方法(成员方法叫 Method),其实应该叫 “构造器”更合适。

那么,这其实就是个翻译问题了,因为所谓的“构造方法(Constructot)”其实也不是一个“方法(Method)”,那么它自然就没有返回值不返回值的说法了。

破除了翻译带来的问题之后,再来看这个问题,你还会问“java中构造器是否有返回值吗?”?