Java中的“构造方法” 真的是 “方法” 吗?它有没有返回值? 您所在的位置:网站首页 java类的构造器是什么 Java中的“构造方法” 真的是 “方法” 吗?它有没有返回值?

Java中的“构造方法” 真的是 “方法” 吗?它有没有返回值?

2024-07-10 14:57| 来源: 网络整理| 查看: 265

前言

最近,偶然在网上看到有人在问:

“Java的构造方法到底有还是没有返回值?”

当我看到这个问题的时候,我首先的反应是“Java的构造方法是没有返回值的”,随后我也便在网上搜索了一番,发现确实是持有两种截然不同观点的人都大有人在。于是我便开始想,一个如此基本的问题,应该是大家早都“统一口径”了才对啊,毕竟Java已经是一个拥有24岁高龄的语言了。伴随着这种疑问,我开始了对这个问题的调研。

1、调研

对于Java基础的问题,最好的方法当然还是去官方的资料中去寻找。于是找到了Java语言规范的文档(Java8版本)。在标砖的语言规范中找到了一些线索,如下:

在 8.2 Class Memebers章节中,规定了类的成员的来源继承自父类、继承自父接口、自身定义这3个来源,同时里面写到了这样的内容:

Constructors, static initializers, and instance initializers are not members and therefore are not inherited. 构造方法,静态初始化器,对象初始化器,都不是类的成员,因此它们也不可以被子类继承。

在 8.8 Constructor Declarations 章节中,关于构造方法的定义有以下说明:

a constructor declaration looks just like a method declaration that has no result 一个 constructor 的定义就像是一个没有返回值的 method 的定义。

emm… 在调研之后,恍然大悟,终于意识到了问题所在:

这完全是一个英文转中文的翻译问题。

从官方的文档中,我们能够发现,对于Java中的类成员是很明确的有三种:

Filed:成员变量Method:普通方法Type:内部定义的其他类型,如内部接口、内部类等

而 Constructor 则是负责对一个对象进行初始化的,会在对象创建完成后由系统执行,它本身并不是类的成员,更不是一个“方法”,Constructor 的中文应该是构造器更合适。

构造方法是:Constructor,成员方法是:Method。

也就是说,它们两个是两个平等的概念,而不是包含的关系。

回过头来,既然Constructor 都不是个“方法”,那就没有返回值这个问题了?毕竟返回值是”方法“才有的特性。

所以,这个本质问题就是把Constructor翻译成 构造方法是不合适的。想来这个翻译应该是受到了C++的影响。

2、虚拟机层面

上面分析了语言方面的原因,接下来稍微深入下,看下Java虚拟机层面Constructor和Method的区别。

构造器在字节码层面,是对应于一个名字为 的代码块,由编译器去生成,会在对象创建完成后需要初始化的时候进行执行。

两者的执行在虚拟机层面也是有区分的,它们会使用不同的虚拟机指令来执行,对应的虚拟机指令:

Constructor:使用invokespecial 指令来执行Method: 使用 invokevirtual 指令类执行 3、构造“器”or构造“方法”

// 构造方法的声明,就像是一个没有返回值的方法声明。 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指令,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中构造器是否有返回值吗?

注:此文章来自于知乎,链接如下:

https://jiakaiyang.com/2020/03/28/java-is-constructor-a-method/#more

https://www.zhihu.com/question/335196523/answer/751020648



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有