前言

理解构造器之前,首先我们需要了解Java中为什么要引入构造器,以及构造器的作用。

在很久之前,程序员们编写C程序总会忘记初始化变量(这真的是一件琐碎但必须的事),C++引入了 构造器(constructor) 的概念,这是一个在创建对象时被自动调用的特殊方法。Java也采用了构造器。

一、构造器的引入

引入构造器帮助我们解决了哪些问题呢?假设我们每定义一个类都必须定义一个initialize()方法,该方法提醒你,每次使用对象之前都要执行一次该方法,这意味着用户每次都必须记得自己去调用此方法,这和上文提到的C程序员一样,很容易就忘记了。Java构造器的出现很好的规避掉了这种问题,创建对象时,java会在使用对象之前调用相应的构造器,保证对象正确初始化。

我们来看一个简单实例:

public 

从这个例子我们看到了,构造器为 TestMain() ,创建对象时,会分配内存并调用对应的构造方法,可以看到输出结果为 默认构造器 ,它已经被正确地初始化了。

二、构造器命名规则

从上面那个例子中或许已经观察到了:类名和构造器名必须相同,所以”每个方法首字母小写“的编码风格并不适用于构造器。

三、注意事项

  • 构造器必须与主类同名
  • 构造器可以有参数
  • 构造器可以重载
  • 没有返回值
  • 不添加构造器编译器生成默认构造器

四、默认构造器

默认构造器(又名无参构造器)是没有形式参数的,它创建的是”默认对象“。举个栗子:

public 

new TestMain()创建了一个新对象,并调用了默认构造——虽然我们并没有主动定义它。Java规定了,如果没有构造会生成默认构造,如果存在了一个及以上的构造便不会自动生成。

public 

new TestMain()编译器会报错,因为我们没有定义对应的无参构造方法,编译器无法顺利创建对象。如果你没有定义构造器,编译器会认为”你需要一个构造器,我帮你造一个“;如果你自己写了一个构造器,编译器会认为”你已经有构造器了,你知道自己在做什么,我不帮你生成“。

五、构造方法重载

有默认无参构造,就有带参构造;有带参构造也就会发生方法重载。为了满足不同的初始化需求,我们通常会需要定义多个带参构造器,由于都是构造器,它们的名称必须相同,为了让方法名相同而参数不同的方法存在,我们就必须使用 方法重载 。它是构造器所必须的。

public 

从上述代码中我们可以看到,类中定义了三个不同的构造方法,main方法中,在括号里传递不同的参数,编译器会根据参数的类型寻找对应的构造方法,从而初始化三个不同的对象,这就是构造方法的重载。

涉及基本类型的重载

在使用构造方法的重载时,我们经常会遇到将基本类型传递给重载方法时的一些问题。基本类型可以从一个 较小(窄类型) 类型自动提升(转型)为一个 较大(宽类型) 类型,当涉及到方法重载时便会造成一些混淆。举个栗子:

public 

首先,我们来看一看t1对象,创建对象时传递的参数是一个float类型的数据,但是结果却显示调用了double带参构造,这是咋回事?其实在创建对象时,编译器会根据传递参数的类型自动寻找参数类型对应的构造方法,如果没有一模一样的构造方法,就会寻找类型更“宽”的构造方法。t1就是典型的例子,double类型比float更“宽”(float占4字节,double占8字节),所以会把传递的参数提升。

再来看t2对象,这个对象传递的是char类型数据,对于char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int

更多学习内容请阅读我的知乎专栏:

程序员的一切:打造全网Java高级工程师资料库(总目录)看完学的更加快,知识更牢固。你值得拥有(持续更新)~​zhuanlan.zhihu.com

java构造器_Java构造器就是这么简单!相关推荐

  1. java级联_Java构造器:级联调用,调用兄弟构造器

    级联调用: classFather{ Father(){ System.out.println("Father birth"); }public voidannounce(){ S ...

  2. java 围棋_Java.awt实现一个简单的围棋

    目录 0.前言 我小时候学过一段时间的围棋,可惜脑子不好使,是个臭棋篓子,到现在也有十多年的时间没有下过棋了,但是近几年围棋AI的出现,又让我重新关注了围棋 围棋真的很有意思,千变万化,有人简明的围空 ...

  3. java 重试_Java实现几种简单的重试机制

    背景 当业务执行失败之后,进行重试是一个非常常见的场景,那么如何在业务代码中优雅的实现重试机制呢? 设计 我们的目标是实现一个优雅的重试机制,那么先来看下怎么样才算是优雅 无侵入:这个好理解,不改动当 ...

  4. soap java实现_java使用soap方式简单实现webservice (二)

    [调用webservice,可以首先根据wsdl文件生成客户端,或者直接根据地址调用,下面讨论直接调用地址的两种不同方式:axis和Soap,soap方式主要是用在websphere下 axis方式调 ...

  5. java必知必会_Java构造器必知必会

    在面向对象编程中,编程人员应该在意"资源".比如 String hello = "hello": 在代码中,我们很在意在内存中String类型的hello,它是 ...

  6. [JAVA基础] 了解构造器Constructor———你真的会用构造器吗?

    引言 相信大家对于java里的构造器应该都是有了解的,这次我们来了解一些构造器的不同使用方式,了解构造器的调用顺序,最后可以灵活的在各种情况下定义使用构造器,进一步优化我们的代码: 构造器简介 还是简 ...

  7. Java中的构造器的作用?(构造方法的作用与特点)

    Java中的构造器的作用是什么? 今天看到一个问题,那就是Java中的构造器的作用是什么,第一反应是:嗯?构造器?不就是构造方法嘛,只是只是叫法不一样,但是习惯喊构造方法的我还是忍不住吐槽了,回归正题 ...

  8. Java基础03 构造器与方法重载

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initial ...

  9. Java 面向对象:构造器详解

    Java 面向对象:构造器详解 构造器: 和类名相同 没有返回值,也不能写void 作用: new本质是调用构造方法 初始化对象的值 注意点: 定义有参构造之后,如果想使用无参构造,显示的定义一个无参 ...

最新文章

  1. 再回首数据结构—链表
  2. 介绍理想工作计算机 英语作文,我的理想工作英语作文(精选5篇)
  3. 【收藏】Linux系统常用命令速查手册(附PDF下载链接)
  4. matplotlib输出图形到网页_必学python库Matplotlib教程分享
  5. echarts2.2.7入门
  6. Tesla P100
  7. ASN.1编解码:ORAN-E2AP分析
  8. Halcon缺陷检测——差分
  9. Python Socket模块实现服务端与客户端通信
  10. 如何利用 RPA 实现自动化获客?
  11. 做一个有意境的女人难上加难
  12. MTK OTG 功能总结(UVC)
  13. 使用wifi网卡笔记1----网卡选型、开发环境搭建、内核配置
  14. Unity3D在windows10下小问题解决
  15. 单元测试之moles
  16. 值得学习的C/C++开源项目
  17. 转【JMeter】--JMeter下载及使用
  18. 转:管理的能力不能代替领导力
  19. Python imgaug库 安装与使用 (图片加模糊光雨雪雾等特效)
  20. 室内定位UWB全方位保障井下安全

热门文章

  1. 将EntityManager.refresh添加到所有Spring数据存储库
  2. 使用Spring Boot自动发布和监视API
  3. javaee和javaee_JavaEE概念简介
  4. 垃圾收集中的代际差异
  5. jpa 查询 列表_终极JPA查询和技巧列表–第2部分
  6. 如何在Hibernate Search 5.5.2 / Apache Lucene 5.4.x中处理停用词?
  7. jmeter数据库负载测试_JMeter:负载测试关系数据库
  8. 一时冲动:“通往瓦尔哈拉之路的冒险”
  9. gwt-2.8.2下载_GWT EJB3 Maven JBoss 5.1集成教程
  10. Quasar和Akka –比较