Java构造器,一文带你了解
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
前言
理解构造器之前,首先我们需要了解Java中为什么要引入构造器,以及构造器的作用。
在很久之前,程序员们编写C程序总会忘记初始化变量(这真的是一件琐碎但必须的事),C++引入了 构造器(constructor) 的概念,这是一个在创建对象时被自动调用的特殊方法。Java也采用了构造器。
一、构造器的引入
引入构造器帮助我们解决了哪些问题呢?假设我们每定义一个类都必须定义一个initialize()方法,该方法提醒你,每次使用对象之前都要执行一次该方法,这意味着用户每次都必须记得自己去调用此方法,这和上文提到的C程序员一样,很容易就忘记了。Java构造器的出现很好的规避掉了这种问题,创建对象时,java会在使用对象之前调用相应的构造器,保证对象正确初始化。
我们来看一个简单实例:
public class TestMain { TestMain() { //默认构造器 System.out.println("默认构造器"); } public static void main(String[] args) { new TestMain(); } } //输出 默认构造器
从这个例子我们看到了,构造器为 TestMain() ,创建对象时,会分配内存并调用对应的构造方法,可以看到输出结果为 默认构造器 ,它已经被正确地初始化了。
二、构造器命名规则
从上面那个例子中或许已经观察到了:类名和构造器名必须相同,所以”每个方法首字母小写“的编码风格并不适用于构造器。
三、注意事项
- 构造器必须与主类同名
- 构造器可以有参数
- 构造器可以重载
- 没有返回值
- 不添加构造器编译器生成默认构造器
四、默认构造器
默认构造器(又名无参构造器)是没有形式参数的,它创建的是”默认对象“。举个栗子:
public class TestMain { //没有指定构造器,Java编译器会自动生成默认构造 public static void main(String[] args) { new TestMain(); } } //输出
new TestMain()创建了一个新对象,并调用了默认构造——虽然我们并没有主动定义它。Java规定了,如果没有构造会生成默认构造,如果存在了一个及以上的构造便不会自动生成。
public class TestMain { TestMain(int i) {} TestMain(float f) {} public static void main(String[] args) { TestMain t1 = new TestMain(); //会报错,没有对应的构造方法 TestMain t2 = new TestMain(1); TestMain t3 = new TestMain(2.0f); } } //输出
new TestMain()编译器会报错,因为我们没有定义对应的无参构造方法,编译器无法顺利创建对象。如果你没有定义构造器,编译器会认为”你需要一个构造器,我帮你造一个“;如果你自己写了一个构造器,编译器会认为”你已经有构造器了,你知道自己在做什么,我不帮你生成“。
五、构造方法重载
有默认无参构造,就有带参构造;有带参构造也就会发生方法重载。为了满足不同的初始化需求,我们通常会需要定义多个带参构造器,由于都是构造器,它们的名称必须相同,为了让方法名相同而参数不同的方法存在,我们就必须使用 方法重载 。它是构造器所必须的。
public class TestMain { TestMain() { System.out.println("默认构造"); } TestMain(int i) { System.out.println("int带参构造"); } TestMain(float f) { System.out.println("float带参构造"); } public static void main(String[] args) { TestMain t1 = new TestMain(); TestMain t2 = new TestMain(1); TestMain t3 = new TestMain(2.0f); } } //输出 默认构造 int带参构造 float带参构造
从上述代码中我们可以看到,类中定义了三个不同的构造方法,main方法中,在括号里传递不同的参数,编译器会根据参数的类型寻找对应的构造方法,从而初始化三个不同的对象,这就是构造方法的重载。
涉及基本类型的重载
在使用构造方法的重载时,我们经常会遇到将基本类型传递给重载方法时的一些问题。基本类型可以从一个 较小(窄类型) 类型自动提升(转型)为一个 较大(宽类型) 类型,当涉及到方法重载时便会造成一些混淆。举个栗子:
public class TestMain { TestMain(int i) { System.out.println("int带参构造"); } TestMain(long l) { System.out.println("long带参构造"); } TestMain(double d) { System.out.println("double带参构造"); } public static void main(String[] args) { TestMain t1 = new TestMain(2.0f); TestMain t2 = new TestMain('菌'); } } //输出 double带参构造 int带参构造
首先,我们来看一看t1对象,创建对象时传递的参数是一个float类型的数据,但是结果却显示调用了double带参构造,这是咋回事?其实在创建对象时,编译器会根据传递参数的类型自动寻找参数类型对应的构造方法,如果没有一模一样的构造方法,就会寻找类型更“宽”的构造方法。t1就是典型的例子,double类型比float更“宽”(float占4字节,double占8字节),所以会把传递的参数提升。
再来看t2对象,这个对象传递的是char类型数据,对于char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-06-10
本文作者:Aime菌
本文来自:“掘金”,了解相关信息可以关注“掘金”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
5G迎来周岁:技术、设备双发力,应用仍存问题
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 时间飞逝,我国5G迎来了「发牌」一周年的日子。 6月6日,工信部信息通信管理局副局长鲁春丛在新闻发布会上公布了今年的5G目标:「5G手机达到1.8亿部出货量,5G基站落地60万座」。 虽然新冠疫情让大家生活停摆了1个季度,但5G的建设却始终还在如火如荼的进行当中。作为通讯史上速度最快、应用范围最广的通信技术,5G被寄予了推动经济发展、引领科技变革和振兴国家软件实力等多重期盼。 过去一年来,5G套餐用户已超过5000多万人,5G基站部署超过25万个,国内厂商5G手机出货量已经超过5成,大部分手机厂商都相继宣布将不在国内发布4G手机。 相比手机等通讯设备的影响,5G在宏观层面带来了更多的变革,让我们一起来看看。 经济增长新引擎 随着5G的牌照的落地,我国5G产业在稳投资、促消费、助升级、培育经济发展新动能等方面表现出巨大潜力,成为驱动我国经济增长的新引擎。 据相关数据显示,截止5月我国已建成5G基站超过25万个。预计到2020年底,5G基站建设将完成相关目标,数量达到60万个,能够覆盖全国所...
- 下一篇
C# 9: 迈向支持脚本编程的第一步
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 不需要任何样板代码是脚本语言的一个显著特征,你可以直接在文件的第一行编写声明和语句,就像在函数内部一样。相反,诸如 VB,C#或者 Java 之类的非脚本语言,在类文件中就必须包含类似“main”方法的样板代码。 微软的 C#开发经理 Mads Torgersen 在 3117 提案中建议 C# 9 支持顶层语句和函数的功能。该提案允许在文件中直接编写语句和函数,而无需使用类(Class)进行包装。Torgersen 声称该提案的初衷是: C#编译器目前支持一种可用于各种脚本开发和交互目的的语言方言,使用该方言,可以直接在顶层编写语句和非虚成员,而不需要使用成员体或类型进行包装。虽然脚本方言很少被使用,且在某些方面上,它还没有跟上“主流”的 C #语言,但是通过 Try.NET 和其他技术的使用场景却在快速增加,因此我担心 C#未来会出现两种不兼容的脚本方言。 虽然当前版本的 C#脚本还没有被广泛使用,但 Torgersen 预测未来这个局面会被打破: 除了 Try.NET 之外,C#脚...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7