写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。

  • 对于文章中出现的任何错误请大家批评指出,一定及时修改。
  • 有任何想要讨论和学习的问题可联系我:zhuyc@vip.163.com。
  • 发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

Java初始化对象的工具 - 构造器

本文关键字:对象、初始化、实例化、构造器、构造方法

文章目录

  • Java初始化对象的工具 - 构造器
    • 一、构造器的作用
    • 二、构造器的定义
      • 1. 构造器的别称
      • 2. 构造器定义格式
      • 3. 隐式构造器
      • 4. 构造器的重载
    • 三、构造器的调用

一、构造器的作用

明确了类与对象的关系后,我们知道:类只是一个定义的结构,用来表述我们想要描述的事物,即具备哪些属性(成员变量),可以产生哪些行为(方法)。那么具体行为的发生,也就是方法的调用要靠对象来完成,同时属性值也要附着在对象上才有意义。创建对象的过程被叫做类的实例化,或者称为对象的初始化,在这个过程中需要使用的就是new关键字和类的构造器。
对于相关概念还不清楚的同学请进传送门:Java中的基本操作单元 - 类和对象

二、构造器的定义

1. 构造器的别称

没错,他们都是同一个意思。

  • 构造器
  • 构造方法
  • 构造函数

2. 构造器定义格式

构造器本身更像一种方法,因此定义的格式与方法类似,可以区别着进行记忆。构造器同样被定义在class的大括号内,构造器的定义格式如下:

public class className{// 构造器定义开始[权限修饰符] 类名(参数列表){// 代码部分}// 构造器定义结束
}

从以上的结构我们看到,构造器的声明格式与方法类似:

  • 以权限修饰符开头
  • 不能被static、final、abstract等修饰符修饰
  • 无返回值类型
  • 方法名称与类名相同
  • 一个类中可以出现多个构造方法,区别在于参数列表不同

那么,在这个构造方法当中我们都应该写些什么呢?还是从构造器的作用入手,既然他的作用是初始化一个对象,那么对象在初始化时最需要做的就是对属性赋值,所以如果有需要我们会在调用时传入某些属性的初始值,或者在对象初始化时执行某些代码,帮助我们判断对象初始化的状态。

public class Student{public Student(){System.out.println("学生对象初始化成功");// 其他代码}
}
public class Test{public static void main(String[] args){Student student = new Student();// 执行效果 -> 输出:学生对象初始化成功}
}

对于创建对象时为属性赋值的用法将在构造器的重载中演示。

3. 隐式构造器

在刚刚开始学习面向对象部分时,可能都会存在一个疑问,之前定义的class都没有定义构造器呀,不是一样可以通过new来创建实例吗?这是因为当一个类被定义后,如果没有手动的创建任何的构造方法,会默认提供一个空的构造器,供初始化使用,这个过程是编译时完成的。

public class Person{}

我们对Person类进行编译,得到Person.class文件,然后我们对class文件进行反编译,就可以看到已经出现了一个空的构造器:

Java程序在执行时,加载的都是.class文件,并且所生成的.class文件与我们定义的.java文件一般都是存在差异的。所以这就能够解释,为什么明明我们在.java文件中没有定义构造器,但是在创建对象时却可以使用new调用到。
隐式构造器还有一个特点,就是如果我们已经手动创建了一个无参的构造器,或者一个有参的构造器,那么在编译时就不会生成无参构造器了。

public class Person{public Person(String name){System.out.println(name);}
}

此时,由于我们已经手动指定了一个构造器了,所以在编译时就不会再产生默认的无参构造器了,只会有自己手动定义的构造器:

那么,大家应该也注意到了一个问题,既然用new创建对象时是调用的构造器,那么现在我们自己定义了一个有参数的构造器,那么就会使得我们最常使用的new Person()这种实例化的代码报错,因为此时类中已经没有无参构造器可供调用了,也可以认为无参的构造器被覆盖了,必须要传入一个参数才能初始化对象。

public class Test{public static void main(String[] args){Person person = new Person();// 编译不通过,已经无法调用无参构造器来初始化对象}
}

那么如果我们还是想用这个无参构造器来创建对象该怎么办呢?没错,手动声明一下就好了,里面不需要写任何内容:

public class Person{// 无参构造器public Person(){}// 有参构造器,可以接收一个参数public Person(String name){System.out.println(name);}
}

我们来看一下效果,很明显,将会同时存在两个构造器,我们在使用new进行对象初始化的时候可以根据需要来使用。
`

public class Test{public static void main(String[] args){Person person1 = new Person();// 编译通过,执行后person1被成功实例化,无输出Person person2 = new Person("小明");// 编译通过,执行后person2被成功实例化,输出:小明}
}

4. 构造器的重载

从上面的例子我们已经可以看到,一个类结构中可以存在多个构造器,用于在有不同需要时被调用。而且由于构造器本身的主要作用是用于为类的属性赋初始值,所以在构造器中我们会指定一些参数,用于被调用时传入,为当前类的属性赋值。

public class Person{// 无参构造器public Person(){}// 两参构造器,可以给name和age属性赋值public Person(String name,int age){this.name = name;this.age = age;}// 三参构造器,可以给name、age和job属性赋值public Person(String name,int age,String job){this.name = name;this.age = age;this.job = job;}public String name;public int age;public String job;
}

在上面的代码中我们可以看到有三个构造器,名称相同,只有参数列表不同,这种关系被称为重载,在方法中也有类似的概念。可以看到构造器中存在部分代码,且都是赋值语句。

  • this关键字的用法

this可以指代当前对象,使用this可以调用出直接在类下定义的成员(变量和方法),其中一个最主要的作用就是可以区分同名的变量。我们在进行变量命名时,一直强调见名知意,那么问题就来了:在类中定义的成员变量名称已经确定了,而构造器中传入的参数就是为了给这些属性赋值的,那么参数的名称是不是应该和类成员变量一样才更能表达意思呢?如果这样的话就造成了参数列表中的变量名称与类成员变量的名称同名,这时就可以通过this来区分。
明确了this的用法,我们再来看构造器中的内容就很好理解了,将传入的参数赋值给当前对象的类成员变量,具体的调用过程我们看下面的例子。

三、构造器的调用

src
└──edu└──sandtower└──bean│    Person.java└──test│    Test.java

以上为实体类与测试类所在的目录结构,Person实体类所在包:edu.sandtower.bean,Test测试类所在包:edu.sandtower.test,则代码如下:

package edu.sandtower.bean;public class Person{// 无参构造器public Person(){}// 三参构造器,可以给name、age和job属性赋值public Person(String name,int age,String job){this.name = name;this.age = age;this.job = job;}public String name;public int age;public String job;
}
package edu.sandtower.test;
// 导包操作:指明需要使用的Person类的所在位置
import edu.sandtower.bean.Person;public class Test{public static void main(String[] args){Person person1 = new Person();// person1被成功实例化,各属性无初始值,可以手动赋值person1.name = "小张";person1.age = 26;person1.job = "Linux运维工程师";Person person2 = new Person("小李",25,"Java开发工程师");// person2被成功实例化,并具有如下初始值// name:小李// age:25// job:Java开发工程师// 输出进行验证System.out.println("name:" + person2.name);System.out.println("age:" + person2.age);System.out.println("job:" + person2.job);}
}

在进行对象的初始化时,可以根据需要取得一个空的对象(如:person1)后手动赋值,也可以通过有参构造器直接对属性赋值(如:person2),避免逐一赋值的麻烦。

扫描下方二维码,加入官方粉丝微信群,可以与我直接交流,还有更多福利哦~

Java初始化对象的工具 - 构造器相关推荐

  1. Java的对象和类,构造器详解

    Java的对象和类 package OPP;//学生的类,一个类中只存在属性和方法 public class Student {//属性String name;//没有赋值默认值为nullint ag ...

  2. java 打印对象属性 工具类_关于java实现任意对象输出字符串的工具类ObjectUtils用户打印日志、接口调试及监控等...

    通过该对象工具类ObjectUtils(参考org.springframework.util.ObjectUtils)实现了类集.数组及基本数据类型转换及字符串输出,常用在日志输出打印.接口联调及对象 ...

  3. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  4. JAVA构造对象的几种方式(构建器、构造器)

    大家好,我是烤鸭: 今天说一下初始化对象的几种方式:   1.    多参数构造器 2.    构建器  3.    构造器后 + get/set方法 举个例子: 这里有个机构entity,提供一个默 ...

  5. java new 删除吗,java泛型对象初始化-java泛型对象会实例化吗T t=new T()

    java泛型对象初始化--java泛型对象能实例化吗T t=new T() java中没法得到泛型参数化类型,因为在编译期没法确定泛型参数化类型,也就找不到对应的类字节码文件,自然就不行了 泛型反射的 ...

  6. java filesearcher_Java Object Searcher | java内存对象搜索辅助工具

    Java Object Searcher | java内存对象搜索辅助工具 0x01 工具简介 #################################################### ...

  7. Java 对象深拷贝工具类

    目录 1. 使用场景 1.1 场景一 1.2 场景二 2. Spring 中的对象拷贝 3. 本工具类中的对象拷贝 3.1 拷贝对象本身(单个) 3.2 拷贝对象本身(批量) 3.3 拷贝对象属性至其 ...

  8. java实用工具类——java处理对象转json工具类

    一.引言 json字符串现在是项目中很常用的了,尤其是在写接口返回数据一般都是json格式的.小编最近在看项目中,发现有多处地方用到了java对象转json,但是引用的jar包都是不统一的. 常见的有 ...

  9. 【Java生态圈技术总结】之深度剖析MapStruct对象拷贝工具

    目录导航 一.常用的对象拷贝工具基本介绍 1.1 Apache BeanUtils 1.2 Spring BeanUtils 1.3 cglib BeanCopier 1.4 HuTool BeanU ...

最新文章

  1. SpringBoot监听redis订阅监听和发布订阅
  2. android aidl文件分析
  3. 获取VirtualBox COM对象失败,Unable to start the virtual device
  4. Win7命令行局域网发消息图解
  5. OpenCV-裁剪图片
  6. [ATF]-ATF的代码学习篇-一篇就够了
  7. 使用mysqld --install命令时出现MSVCR120.dll文件丢失错误
  8. ubuntu mysql双主热备配置_MySql双主热备配置
  9. Android平台_驱动_SD_软件 概要设计说明书
  10. 单板剥皮机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. suse linux 使用教程,suse linux 命令教程
  12. 哪里可以免费下SketchUp草图插件?
  13. Android之权限(permission)大全
  14. kubernetes【工具】kind【1】入门实践
  15. 企业用企业邮箱的好处是什么?企业邮箱支持哪些功能?
  16. ccf试题1:分蛋糕
  17. 国际贸易术语解释通则(DEQ 目的港码头交货(……指定目的港))
  18. Excel简单使用宏
  19. 【 rbx1翻译 第七章、控制移动基座】第二节、运动控制级别
  20. 世界 5G 通信频段和运行模式

热门文章

  1. 游戏“出海” | 网易游戏牵手AWS
  2. Character Animator 2021新功能
  3. vivo s10怎么样?不如来看看荣耀
  4. 手机图片怎么识别文字?这些方法快来学习下
  5. CSS——选择器及优先级
  6. php 静态类与非静态类
  7. Linux进入救援模式全盘修复,linux进入救援模式的方法
  8. centos安装mysql5报错: GPG 密钥已安装,但是不适用于此软件包,请检查源的公钥 URL 是否配置正确
  9. SecureCRT 登录Ubuntu失败Key exchange failure(解决Ubutu密钥交换失败的问题)
  10. Lambda表达式用法