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

pgAdmin4备份恢复实战:从安装到避坑指南 本文提供了一份详尽的pgAdmin4备份恢复实战指南,涵盖从安装配置到执行备份恢复的全流程。针对Windows环境下的浏览器兼容性、二进制路径配置等常见问题,给出了具体解决方案。重点强调了使用pgAdmin4进行备份恢复的可靠性,特别是在处理包含PostGIS等扩展的数据库时,能有效避免数据类型和权限错误,确保数据迁移的完整性与安全性。 阅读详情

前言

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

“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

SerDes系列之如何选择AC耦合电容 交流耦合电容用于隔离PCB互连时的直流分量(Common-mode voltage),同时传递交流分量(Voltage swing),其作用类似于一个高通滤波器,但是,如果电容容值选取不当,使用过程中会产生信号质量问题,典型的应用场景:当包含相同的长串1或0的NRZ数据应用于该高通滤波器时,会发生低频电压跌落,导致低频模式相关抖动(PDJ)。 阅读详情

相关推荐

Linux 音频驱动(六) ALSA音频驱动之PCM Write数据传递过程

目录1. 前言2. PCM Data Flow3. 总结 1. 前言 本文,我们将以回放(Playback,播放音频)为例,讲解PCM Data是如何从用户空间到内核空间,最后传递到Codec。 在Linux 音频驱动(一) ASoC音频框架简介中,我们给出了回放(Playback)PCM数据流示意图: 对于Linux来说,由于分为 user space 和kernel space,而且两者之间不能随便互相访问。因此用户如果播放音频,则需要调用copy_from_user()将用户数据从user spa

_Modest_的博客 1万+

java构造方法

java中的构造方法

weixin_72786602的博客 3477

保姆级教程:用GMT6.1绘制专业地形起伏图(从数据下载到出图避坑)

本文提供了一份详细的GMT6.1绘制地形起伏图的保姆级教程,从环境搭建到数据下载,再到核心绘图命令解析,帮助用户避开常见错误。特别适合科研人员和地理信息爱好者快速掌握专业地形图的绘制技巧,提升工作效率。

weixin_42549723的博客 275

对象的形象理解

一、 运用类的构造方法进行实例化的过程 == 创建对象的过程 A a = new A(); a就是一个对象。

weixin_44185736的博客 979

第5.1节 构网控制:电压源特性与电压调节

摘要: 构网型变流器的核心物理本质是作为可控交流电压源,通过戴维南等效模型(受控电势源+低输出阻抗)自主建立并调节电压,增强电网电压刚度。其电压调节通过无功-电压闭环控制实现,内环为自动电压调节器(AVR),外环为无功-电压下垂特性,模拟同步发电机功能。关键技术包括自适应增益、虚拟阻抗补偿及动态限流策略,以应对弱电网稳定性、故障过流等问题。该设计满足《规范》对电压调节范围、动态无功支撑的要求,是高比例新能源电力系统电压稳定的关键解决方案。

技术工作者 1106

【推荐100个unity插件之34】在unity中实现和Live2D虚拟人物的交互——Cubism SDK for Unity

Live2D是一款2D建模的软件,常用于游戏,动态壁纸,虚拟主播,游戏公司里面是有专门的ive2D岗位的。游戏里面还有一个经常使用的软件——spine,他做的也是2d的模型,但是他更适合做一些动作,Live2D更适合人物交互方面。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4989

JAVA 构造方法

构造方法是类当中的一种特殊方法,用来初始化一个类对象,在创建对象之后(new之后)自动调用。 Java中的每个类都有一个默认的构造方法,并且可以拥有一个以上的构造方法。 Java构造方法有以下特点: 1.方法名必须和类名相同。 2.可以有一个或多个参数,也可以没有参数。 3.无返回值,包括void。 4.默认返回类型就是对象类型本身。 5.只能与new运算符结合使用。 构造方法主要有无参和有参俩种 public class demo01Person { private int m; // 定义

shuyv的博客 1957

【AI大模型应用开发】3.2 RAG实战 - RAG应用+UI实现加载本地文件并对话

前面我们实现了RAG基本流程,今天我们在此基础上给它加个UI界面,在浏览器打开,实现上传本地文件、解析,并用大模型实现与该文档的对话。也就是一个阉割版demo版的ChatPDF或知识库对话系统。

同学小张的博客 3053

详解JAVA中的构造方法

三千字详解JAVA中的构造方法

m0_70322372的博客 4万+

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

Robot_PLC_HMI_Automation 3574

Calibre LVS 问题解析

LVS常见问题与解决办法

m0_61544122的博客 2万+

java构造方法的返回值类型_Java构造方法

构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。Java 构造方法有以下特点:方法名必须与类名相同可以有 0 个、1 个或多个参数没有任何返回值,包括 void默认返回类型就是对象类型本身只能与 new 运算符结合使用值得注意的是,如果为构造方法定义了返回值类型或使...

weixin_30091863的博客 1万+

【错误解决】本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止

转载请注明出处:http://blog.youkuaiyun.com/qq_26525215 本文源自【大学之旅_谙忆的博客】 在启动mysql服务时出现该错误: 本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止。mysql 版本 5.7.14 系统 win 7后来经过一系列的百度,谷歌,总算是解决了。首先,你需要把原来的服务删除:mysqld --remove mysq

谙忆-陈浩翔 12万+

Java中构造方法与普通方法的区别

普通方法 定义:简单的说方法就是完成特定功能的代码块。 普通方法定义格式 修饰符 返回值类型 方法名 (参数类型 参数名1,参数类型 参数名2,.........) { 函数体; return 返回值; } 返回值类型用于限定返回值的数据类型。 普通方法分为:有明确返回值的方法和没有明确返回值的方法。 A.有明确返回值的方法的调用 可以单独调用(无意义)、输出调用、赋值调用(推荐)。 public static int sum (int a ,

weixin_44229783的博客 4823

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java中的构造方法

1. Java中构造方法的介绍 构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。 换个角度说:构造方法负责对应对象的初始化工作,为实例变量赋予合适的初始值。 2. 构造方法必须满足的语法规则 方法名必须与类名相同。 方法没有任何返回类型,包括...

calm_encode的博客 3729

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java中普通方法与构造方法

相信很多初步接触Java方法的小伙伴都对普通方法和构造方法理解不到位,希望本文对读者有所启示 一、方法的简介: Java方法是语句的集合,它们在一起执行一个功能。 (1)方法是解决一类问题的步骤的有序组合 (2)方法包含于类或对象中 (3)方法在程序中被创建,在其他地方被引用 1、构造方法: 构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。 Java 构造方法有以下特点: 1、方法名必

DavidGarrett的博客 2277

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java中的构造方法总结

构造方法和实例方法的区别: 一、主要的区别在于三个方面:修饰符、返回值、命名 1、和实例方法一样,构造器可以有任何访问的修饰符,public、private、protected或者没有修饰符   ,都可以对构造方法进行修饰。不同于实例方法的是构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract等都不能修饰构造方法。 解释:构造

Android Explorer 4万+

构造方法可以有返回值吗_Java中的方法 构造方法及返回值

Java中的函数被叫做方法,是实现功能处理数据的唯一方式。最基本的方法就是main方法了。在说方法前先说说返回值,返回值就是一个方法实现了功能会有一个结果,然后把这个结果返回给方法的调用者。需不需要返回都必须写出来,不需要返回结果就写void ,需要返回就要看返回的值是什么类型了。至于需不需要返回就看需求,一般来说一个方法处理的的结果在其他地方要使用就需要返回,举个列子:我们需要在沙漠中制造水出来...

weixin_39608748的博客 8526

JAVA的构造方法是什么

JAVA构造方法 1.在JAVA语言中,构造方法也叫做构造器,它是一种比较特殊的方法,主要用于创建实例(也就是对象)的时候进行初始化操作。 Person p=new Person(); 这里的Person就是一个构造方法,构造方法是默认不可见的。 在没有手动定义构造方法的时候,采用的是系统为操作类提供的一个无参数的默认的构造方式(这就是为什么new一个对象后面要加上()的原因就是要调用系统默认的无参的构造方法),它的形式就是public 类名()[]。 class Box{ //构造方法没有返回值

weixin_48377363的博客 5573

java构造方法怎么分辨_Java中的构造方法总结

今天写代码突然发现Java的构造方法也有不少说法呢,闲来无事,总结一下:构造方法和实例方法的区别:一、主要的区别在于三个方面:修饰符、返回值、命名1、和实例方法一样,构造器可以有任何访问的修饰符,public、private、protected或者没有修饰符 ,都可以对构造方法进行修饰。不同于实例方法的是构造方法不能有任何非访问性质的修饰符修饰,例如static、final、synchroni...

weixin_31295867的博客 2748

java构造方法的返回值类型_崤云说 | JAVA面向对象

点击上面“蓝字”关注我们今天的崤云说,是研发部的周浩宇为大家带来一篇JAVA技术分享内容介绍u构造方法1.1构造方法介绍在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名、年龄等属性信息。那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建对象的时候就要做的事情,当使用new关键字创建对象时,怎么给对象的属性初始化值呢?这就要学习Java另外一门小...

weixin_42504279的博客 2012

深入了解JAVA中的构造方法

学习时间: 2020-11-23 学习内容: 一、什么是构造函数、 java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与相同,无返回值。 二、构造函数的作用: 一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。 在现实生活中,很多事物刚一出现,就具有某些属性和行为。比如人刚生下来就有诸多属性:如性别等。还会有诸多的行为,如呼吸、吮吸。 我们就可以将这些天然的属性和行为定义在构造函数中,当new实例化人这个对象时,他也就具有这些属性和方法了,没必要再去重新定义

加油学JAVA的博客 1407

Java 中的构造方法

构造方法(Constructor)是与类同名、没有返回值类型(连void都没有)的特殊方法,用于在创建对象时对对象进行初始化。换句话说,当你用new关键字来实例化一个类时,构造方法会被自动调用,从而完成初始化的操作。// 构造方法System.out.println("Person 对象被创建!");Person 对象被创建!这行信息就是构造方法中打印的,它表明构造方法被成功调用。构造方法是 Java 类中非常基础且重要的概念,用于对象的初始化。

chen的博客 1480

java中构造方法和普通方法的区别_java中构造方法和普通方法的区别

java中构造方法和普通方法的区别一、普通方法是有修饰符修饰的成员方法,根据关键字static的有无分为静态方法和非静态方法;一旦使用static修饰成员方法,就成为了静态方法,静态方法不属于对象,而是属于类的;如果没有static修饰的成员方法,那么必须先创建对象,然后通过对象调用它;普通方法可以有返回值也可以没有返回值,而构造方法不能有返回值;普通方法是不能通过new来创建的,可以通过对象名来...

weixin_29607629的博客 6005

构造方法可以有返回值吗_Java的日常之走进构造方法

从前面谈到的内容可以发现,当我们实例化一个类的对象后,如果想要为成员变量或者实例变量赋值,就必须通过这节访问对象的属性或者调用setter方法来设置。如果我们想在实例化对象的同时就为这个对象的属性赋值,这就可以通过构造方法来实现。接下来就解决两个问题。构造方法的定义是什么?构造方法的重载又该如何理解?先来看第一个问题,构造方法也被称为是构造器,它是一个类的特殊成员会在类实例化对象的时候被...

weixin_39612653的博客 900
上一篇: Java I/O流详解
下一篇: Web项目部署到Linux操作系统
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值