一文带你了解java中的构造器

宇宙之一粟 宇宙之一粟     2022-12-01     268

关键词:

C ++ 引入了构造器(constructor,也叫构造函数)的概念,它是在创建对象时被自动调用的特殊方法

Java 也采用了构造器,并且还提供了一个垃圾收集器(garbage collector),当不再使用内存资源的时候,垃圾收集器会自动将其释放。

一文带你了解


构造器定义

在 Java 中,可以通过编写构造器来确保每个对象的初始化。但是这里有两个问题:

  1. 这个构造器使用的任何名字都有可能与类里某个成员相冲突;
  2. 编译器负责调用构造器,所以它必须始终知道应该调用哪个方法。

C++ 语言采用的方案就是将构造器和类的名字定义相同,Java 也采用了这个方案。

构造器的作用是用来建立一个新的类的实例,当一个对象被创建时,JVM 使用一个构造函数,并为其分配内存空间。

语法结构

class ClassName 
ClassName()

例如,在下面的示例中,我们创建了一个名为 ​​ReLearnConstructor​​ 的构造函数。在构造函数内部,我们正在初始化 ​​hello​​ 变量的值。:


public class ReLearnConstructor

String hello; // 属性

// 构造器
public ReLearnConstructor()
hello = "Hello, Constructor!";


public static void main(String[] args)

ReLearnConstructor rc = new ReLearnConstructor();
System.out.println(rc.hello);


注意创建 ReLearnConstructor 类的对象的语句:​​ReLearnConstructor rc = new ReLearnConstructor();​

在这里,当创建对象时,调用 ​​ ReLearnConstructor​​ 构造函数。并且,​​hello​​ 变量的值被初始化。

因此打印的 ​​hello​​ 的值为:

一文带你了解

构造器目的

构造函数的目的是初始化对象的状态,为所有声明的属性赋值。如果我们没有自定义构造函数,JVM 就会为这些属性分配默认值。

原始类型的默认值:

  • 整数类型是 0
  • 浮点类型是 0.0
  • 布尔类型是 false

对于其他 Java 引用类型,默认值是null,这意味着引用类型的属性没有被分配任何值。

一文带你了解

后面可以用代码查看这些默认值。

构造器分类

一文带你了解

在 Java 中,有三种类型的构造器:

  1. 无参构造器
  2. 有参构造器
  3. 默认构造器

无参构造器

与方法类似,Java 构造函数可能有参数,也可能没有任何参数。如果构造函数不接受任何参数,则称为无参数构造器。例如上述代码中 ​​ReLearnConstructor​​ 构造器就是:

// 无参构造器
public ReLearnConstructor()
hello = "Hello, Constructor!";

有参构造器

字面理解,具有参数的构造函数称为有参数构造器。那为什么需要使用有参构造器?

有参构造器可用于为不同对象提供不同初始化的值。例如:


public class ReLearnConstructor

String languages;

// 接受单个参数的构造器
public ReLearnConstructor(String lang)
languages = lang;
System.out.println("我在学习 " + languages + " 语言!");


public static void main(String[] args)
// 向构造器中传入不同的值
ReLearnConstructor rc1 = new ReLearnConstructor("Java");
ReLearnConstructor rc2 = new ReLearnConstructor("Go");
ReLearnConstructor rc3 = new ReLearnConstructor("Python");


运行结果:

一文带你了解

默认构造器

如果我们不创建任何构造函数,Java 编译器会在程序执行期间自动创建一个无参数构造函数。这个构造函数称为默认构造函数。来看一个例子;


public class ReLearnConstructor

String languages;
int a;
boolean b;
float c;


public static void main(String[] args)

ReLearnConstructor rc = new ReLearnConstructor();
System.out.println("默认值:");
System.out.println("languages:" + rc.languages);
System.out.println("a:" + rc.a);
System.out.println("b:" + rc.b);
System.out.println("c:" + rc.c);

运行结果:

默认值:
languages:null
a:0
b:false
c:0.0

可以看到,我们还没有创建任何构造函数。因此,Java 编译器会自动创建默认构造函数。上述表格得以印证。

原生方法和构造器的区别

  • 构造函数必须与在 Java 中定义的类具有相同的名称
  • 当方法没有返回任何值时,构造函数不会返回任何类型,而方法则具有返回类型或 void
  • 在对象创建时,仅调用构造函数一次,而方法可以被调用任何次数

如果我们不用构造器来给属性赋值的话,可以先使用 new 运算符获取类的实例,并使用类的 setter 方法设置值,如下:

import java.util.Arrays;

class Person

private String name;
private int age;

@Override
public String toString()
return Arrays.asList(name, String.valueOf(age)).toString();


public void setName(String name)
this.name = name;


public void setAge(int age)
this.age = age;


// getters


// Initialize an object in Java
class Main

public static void main(String[] args)

Person person = new Person();
person.setName("Yuzhou1su");
person.setAge(22);

System.out.println(person);

通过构造器进行初始化就可以省去我们的 setter 方法。

如下的例子:

import java.util.Arrays;


class Person

private String name;
private int age;


// 构造器
public Person(String name, int age)
this.name = name;
this.age = age;


public String toString()

return Arrays.asList(name, String.valueOf(age)).toString();



class SimpleConstructor
public static void main(String[] args)

Person person = new Person("Yuzhou1su", 22);
System.out.println(person);

运行结果:

[Yuzhou1su, 22]

构造器重载

与 Java 方法重载类似,我们也可以创建两个或多个具有不同参数的构造函数。这称为构造函数重载。


public class ReLearnConstructor

String language;

public ReLearnConstructor()
this.language = "Java";


// 构造器
public ReLearnConstructor(String language)
this.language = language;


public void getName()
System.out.println("编程语言:" + this.language);


public static void main(String[] args)

ReLearnConstructor rc1 = new ReLearnConstructor();

ReLearnConstructor rc2 = new ReLearnConstructor("Python");

rc1.getName();
rc2.getName();

在上面的例子中,我们有两个构造函数:​​ReLearnConstructor()​​ 和 ​​ReLearnConstructor(String language)​​。在这里,两个构造函数都用不同的值初始化变量语言的值。根据创建对象时传递的参数,调用不同的构造函数,分配不同的值。

运行结果:

一文带你了解

编程语言:Java
编程语言:Python

拷贝构造器

Java 中的拷贝构造方法是一种使用该类的一个对象构造另外一个对象的构造方法。

复制构造函数是一种特殊构造函数,用于将新对象创建为现有对象的副本。它只需要一个参数,它将是同一类的另一个实例。我们可以使用 ​​this()​​ 语句从复制构造函数中显式调用另一个构造函数:


public class ReLearnConstructor

private String language;

// 构造器
public ReLearnConstructor(String language)
this.language = language;


// 拷贝构造器
public ReLearnConstructor(ReLearnConstructor rc)
this.language = rc.language;


public void getName()
System.out.println("编程语言:" + this.language);


public static void main(String[] args)

ReLearnConstructor rc = new ReLearnConstructor("Python");

ReLearnConstructor copyOfrc = new ReLearnConstructor(rc);

rc.getName();
copyOfrc.getName();

运行结果:

编程语言:Python
编程语言:Python

当需要拷贝一个带有多个成员变量的复杂对象或者想构造已存在对象的深拷贝对象时非常有用。

匿名内部类

除了上文介绍的使用构造器的方法,另一种初始化对象的方法是使用“双大括号初始化”。这将创建一个匿名内部类,其中只有一个实例初始化程序。建议不要使用这种方法。

import java.util.Arrays;

class Person

private String name;
private int age;

@Override
public String toString()
return Arrays.asList(name, String.valueOf(age)).toString();


public void setName(String name)
this.name = name;


public void setAge(int age)
this.age = age;


// getters


// Initialize an object in Java
class Main

public static void main(String[] args)

// Anonymous class
Person person = new Person()
// Initializer block
setName("Yuzhou1su");
setAge(22);
;

System.out.println(person);

总结

  • 实例化对象时会隐式调用构造函数。
  • 创建构造函数的两条规则是:构造函数的名称应与类相同。Java 构造函数不能有返回类型。
  • 如果一个类没有构造函数,Java 编译器会在运行时自动创建一个默认构造函数。默认构造函数使用默认值初始化实例变量。例如 int 变量将被初始化为 0
  • 构造函数类型:
  • 无参构造器 - 不接受任何参数的构造函数参数化构造函数
  • 接受参数的构造器 - 接受参数的构造函数
  • 默认构造器 - 如果没有明确定义,Java 编译器会自动创建一个构造函数。
  • 构造函数不能被abstractstaticfinal 修饰

编译器会报如下错误:

Illegal modifier for the constructor in type ReLearnConstructor; only public, protected & private are permitted
  • 构造函数可以重载但不能被覆盖

一文带你了解python中的继承知识点

1类继承Python是面向对象的编程语言,因此支持面向对象的三大特性之一:继承。继承是代码重用的一种途径,Python中的继承就像现实生活中的继承一样,子类可以顺利继承父类的属性或方法。允许我们再对象之间创建复杂且类... 查看详情

一文带你了解java中的垃圾回收机制(代码片段)

🌊博主简介:CSDN原力作者,华为云享专家,掘金优秀作者🌊个人博客:haiyong.site🌊粉丝专属福利:简历模板、PPT模板、学习资料、面试题库。文末领取直接跳到末尾领取资料介绍在C/C++中&#x... 查看详情

一文带你了解java中的垃圾回收机制(代码片段)

🌊博主简介:CSDN原力作者,华为云享专家,掘金优秀作者🌊个人博客:haiyong.site🌊粉丝专属福利:简历模板、PPT模板、学习资料、面试题库。文末领取直接跳到末尾领取资料介绍在C/C++中&#x... 查看详情

一文带你了解建造者模式及相关实例解析(代码片段)

...为每个不同类型的产品创建一个单独的ConcreteBuilder。要求构造器类是可变的。不能保证类的数据成员被初始化。依赖性注入可能不太受支持。3.相关实例?这里我们举个造房子的例子,构建一个房子需要相应的建造团队和总指挥,我... 查看详情

都java19了,还不了解java8?一文带你深入了解java8新特性

Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8,它支持函数式编程,新的JavaScript引擎,新的日期API,新的StreamAPI等。(文章很长,建议点赞收藏)新特性以下是Java8新增的部分特性,更多新特... 查看详情

一文带你了解anr(测试人员)(代码片段)

一、首先,了解一下什么是ANRANR,是“Application?Not?Responding”的缩写,即“应用程序无响应”。系统会向用户显示一个对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。在Android中,应用程序的响应是... 查看详情

一文带你了解java8之stream(代码片段)

Java8Stream流式编程简介Java8中stream是用于对集合迭代器的增强,使之能供完成更高效的聚合操作(例如过滤、排序、统计分组等)或者大批量数据操作。此外,stream与lambda表达式结合后编码效率将会大大提高,并且可以提... 查看详情

一文带你快速了解java线上问题快速诊断神器arthas(代码片段)

文章目录一、什么是Arthas二、特性一览三、Arthas能为你做什么?四、快速安装1、前提条件2、一键安装五、快速使用1、启动脚本并连接进程2、启动jar包并连接进程六、使用示例1、dashboard(当前系统的实时数据面板)2... 查看详情

一文带你认识stl序列式容器--list(代码片段)

list什么是listlist的使用构造函数接口list相关迭代器使用容量相关的操作测试链表的修改操作链表的一些其他操作list中的赋值运算符list中的迭代器失效问题vector与list区别(重点)什么是listlist是序列式容器中的一种,... 查看详情

一文带你了解2018年最流行的前端技术

2018年即将过半,前端开发这个行业又进一个台阶了。找来一个现代前端技术图谱看看,真是吓尿了——宝宝心里苦啊!点图片看大图 仔细想想,这要是全学会了还得了,也太不切实际了。还是来看看现在流行的是有哪些东... 查看详情

一文带你吃透java中的继承(代码片段)

继承继承的概念继承的格式定义父类的格式:(一个普通的类定义)publicclass父类名称 //...定义子类的格式:publicclass子类名称extends父类名称 //...举例配合理解:继承中成员变量的访问特点举例配合理解:区分子类方法中重名的三种变... 查看详情

一文带你了解java编程语言的前世今生|java核心知识点整理

他们质疑你,嘲讽你,却又想成为你,取代你本文由海拥原创,首发于CSDN,参与原力计划目录👴前言☕️一、为什么Java要叫Java(咖啡)?🍺二、Java标准划分✍三、Java语言的优点🍚四... 查看详情

一文带你了解java编程语言的前世今生|java核心知识点整理

他们质疑你,嘲讽你,却又想成为你,取代你本文由海拥原创,首发于CSDN,参与原力计划目录👴前言☕️一、为什么Java要叫Java(咖啡)?🍺二、Java标准划分✍三、Java语言的优点🍚四... 查看详情

一文带你了解java8之stream(代码片段)

Java8Stream流式编程简介Java8中stream是用于对集合迭代器的增强,使之能供完成更高效的聚合操作(例如过滤、排序、统计分组等)或者大批量数据操作。此外,stream与lambda表达式结合后编码效率将会大大提高,并且可以提... 查看详情

熬夜之作:一文带你了解cat分布式监控(代码片段)

Cat是什么?CAT(CentralApplicationTracking)是基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。CAT作为服务端项目基础组件,提供了Java,C/C++,Node.js,Python,Go等多语言客户端,已经在美团点评的基础架构中间件框架(MVC... 查看详情

一文带你了解人脸检测算法的类型及其工作原理(代码片段)

在过去的几年里,人脸识别受到了广泛的关注,被认为是图像分析领域最有前途的应用之一。人脸检测可以考虑人脸识别操作的很大一部分。根据其强度将计算资源集中在持有人脸的图像部分。图片中的人脸检测方法很... 查看详情

一文带你吃透java中的接口(代码片段)

接口接口的概述和生活举例接口定义的基本格式如何定义一个接口的格式:publicinterface接口名称 //接口内容接口的抽象方法定义/*在任何版本的Java中,接口都能定义抽象方法。格式:publicabstract返回值类型方法名称(参数列表);注意... 查看详情

windows11强势来袭,一文带你了解全部更新内容

Windows 11 Build 22000.160是微软发布的win11的第六个累积更新版本,这次更新只是带来了多项质量增强功能,但没有任何新功能或重大改进。Window11Build22000.160其他的更新内容改进了ALT+Tab、任务视图和快照辅助中的间距和... 查看详情