java构造器_Java构造器就是这么简单!

912697d54d61f4edb1c049b53a0e4fde.png

前言

理解构造器之前,首先我们需要了解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
d5f29ab21d19778e302379c9b5d36143.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaFX技巧32:需要图标吗? 使用Ikonli!

动机 自2013年以来,我一直在编写JavaFX应用程序和库的代码,它们的共同点是,我需要找到可以用于它们的良好图标/图形。 作为前Swing开发人员,我首先使用图像文件,GIF或PNG。 通常,我会从IconExperience&…

java应用部署docker_Docker部署JavaWeb项目实战

摘要:本文主要讲了怎样在Ubuntu14.04 64位系统下来创建一个执行Java web应用程序的Docker容器。一、下载镜像、启动容器1、下载镜像先查看镜像docker images记住这个Image ID,下面我们启动容器须要用到它。假设看到以上输出,说明您能够使用“…

如何用Java创建不可变的Map

你好朋友, 在本教程中,我们将看到如何用Java创建不可变的Map。 –不可变的类或对象是什么意思? –什么是不可变地图? –如何在Java中创建不可变的Map? 不变的类或对象是什么意思? 不可变的类或对象是创…

quartz java 线程 不释放_java Quartz 内存泄漏

我用定时器启动应用的时候发现内存泄漏,具体报错如下:十月 30, 2015 2:30:12 下午 org.apache.catalina.startup.HostConfig undeploy信息: Undeploying context [/ChinaMoney Maven Webapp]十月 30, 2015 2:30:15 下午 org.apache.catalina.loader.Weba…

在ultraedit查找每行第二个单词_新手收藏!亚马逊关键字查找

亚马逊销售中最重要的是“排名”。而“关键字”对提高排名很重要。搜索结果对亚马逊的销售产生重大影响。要想让你的产品被显示在搜索结果的顶部,那你必须选择有效的关键字。搜索关键词排名一直上不去,你可能会这么想:“关键字不好吧......。…

java opencv磨皮算法_使用OPENCV简单实现具有肤质保留功能的磨皮增白算法

在一个美颜高手那里发现一个美颜算法,他写出了数学表达式,没有给出代码,正好在研究OPENCV,顺手实现之。具体过程就是一系列矩阵运算,据说是从一个PS高手那里研究 出来的,一并表示感谢。这是数学表达式&…

junit单元测试断言_简而言之,JUnit:单元测试断言

junit单元测试断言简而言之,本章涵盖了各种单元测试声明技术。 它详细说明了内置机制, Hamcrest匹配器和AssertJ断言的优缺点 。 正在进行的示例扩大了主题,并说明了如何创建和使用自定义匹配器/断言。 单元测试断言 信任但要验证 罗纳德里…

keyshot环境素材文件_KeyShot渲染,打光这么打,效果倍儿棒

有过渲染经验的小伙伴们应该知道,除了需要对渲染软件的操作熟悉外,最重要的莫过于“材质”和“灯光”。而这里,就不得不提到KeyShot,作为工业设计行业必须要掌握的技能之一,它在行业当中的地位可谓独树一帜。除了其操作…

redis种类型对应java类型_Redis的五种基本数据类型介绍

Redis作为缓存具有极其丰富的功能,比如计数器、好友关系以及排行榜等等。而Redis之所能够实现如此强大的功能,完全是依赖着它的基本数据结构。今天我们来看看Redis的五种基本的数据结构,分别是字符串(strings), 散列(hashes)&…

REST /使用提要发布事件

处理事件 当使用多个解耦的服务时(例如,在微服务体系结构中 ),很有可能需要一种将某种域事件从一个服务发布到一个或多个其他服务的方法。 许多广泛采用的解决方案依赖于单独的基础结构来解决此问题(例如事件总线或消…

hibernate自动配置_Hibernate自动冲洗的黑暗面

hibernate自动配置介绍 既然我已经描述了JPA和Hibernate刷新策略的基础知识 ,我就可以继续阐明Hibernate的AUTO刷新模式的令人惊讶的行为。 并非所有查询都会触发会话刷新 许多人会认为Hibernate 总是在执行任何查询之前先刷新Session。 虽然这可能是一种更直观的方…

slf4j注解log报错_SpringBoot自定义日志注解,用于数据库记录操作日志,你用过吗?...

大家好,我是程序员7歌!今天我将为大家讲解如何通过自定义注解记录接口访问日志。一般的开发中,有两种方式可以记录日志信息,第一种:把接口日志信息保存到日志文件中,第二种:把接口操作日志保存到…

java applet audion_java applet audion

①希罗尤尔和他的飞翼敢达也有着不少拥趸,让我们期待这位美少年在《敢达决战》中的表现吧。②颜值时代,浏览器皮肤也不能输360浏览器耳目一新的设计,高清精美的壁纸,让你上网时更添一份好心情。软件使用1、支持游戏小号2、优化小程…

markdown 流程图_Markdown 进阶技能:用代码画流程图(编程零基础也适用)

这篇文章主要介绍流程图基础以写代码的方式画流程图相比于使用画图工具拖拽画图,用代码画图有什么好处?首先,这种方式非常轻便,无需安装复杂的画图应用。Typora 等多种 Markdown 编辑器自带有画图扩展(这也是 Markdown…

java jtree_Java JTree

Java JTree1 Java JTree的介绍JTree类用于显示树结构数据或层次结构数据。JTree是一个复杂的组件。它的最顶部有一个“根节点”,它是树中所有节点的父节点。它继承了JComponent类。2 Java JTree的声明我们来看一下javax.swing.JTree类的声明。public class JTree ex…

akka和rabbitmq_Akka Notes –演员记录和测试

akka和rabbitmq在前两部分( 一 , 二 )中,我们简要讨论了Actor以及消息传递的工作方式。 在这一部分中,让我们看一下如何修复并记录我们的TeacherActor 。 回顾 这就是我们上一部分中的Actor的样子: class…

完数c++语言程序_C语言经典100题(19)

1上期答案揭晓首先给大家看看上一篇文章C语言经典100题(18)中第三部分编程题的答案:#includeint main(){ int s0,a,n,t; printf("请输入 a 和 n:\n"); scanf("%d%d",&a,&n); ta; while(n>0) { …

古巴:为生产做准备

“它可以在我的本地机器上运行!” 如今,这听起来像模因,但仍然存在“开发环境与生产环境”的问题。 作为开发人员,您应始终牢记,您的应用程序有一天将在生产环境中开始运行。 在本文中,我们将讨论一些特定于…

hibernate脏数据_Hibernate脏检查的剖析

hibernate脏数据介绍 持久性上下文使实体状态转换入队 ,该实体状态转换在刷新后转换为数据库语句。 对于托管实体,Hibernate可以代表我们自动检测传入的更改并安排SQL UPDATE。 这种机制称为自动脏检查 。 默认的脏检查策略 默认情况下,Hibe…

php组成,php接口有几部分组成?

程序接口,由一套陈述、功能、选项、其它表达程序结构的形式、以及程序师使用的程序或者程序语言提供的数据组成PHP接口(interface)的特点1、接口的方法必须是公开的。2、接口的方法默认是抽象的,所以不在方法名前面加abstract。3、接口可以定义常量&…