news 2026/10/20 5:51:14

爆肝一个月,Java 从入门到精通08 - 构造方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
爆肝一个月,Java 从入门到精通08 - 构造方法

创建实例的时候,我们经常需要同时初始化这个实例的字段,例如:

Person ming = new Person(); ming.setName("小明"); ming.setAge(12);

初始化对象实例需要3行代码,而且,如果忘了调用setName()或者setAge(),这个实例内部的状态就是不正确的。

能否在创建对象实例时就把内部字段全部初始化为合适的值?

完全可以。

这时,我们就需要构造方法。

创建实例的时候,实际上是通过构造方法来初始化实例的。我们先来定义一个构造方法,能在创建Person实例的时候,一次性传入name和age,完成初始化:

// 构造方法 public class Main { public static void main(String[] args) { Person p = new Person("Xiao Ming", 15); System.out.println(p.getName()); System.out.println(p.getAge()); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } }

由于构造方法是如此特殊,所以构造方法的名称就是类名。构造方法的参数没有限制,在方法内部,也可以编写任意语句。但是,和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。

默认构造方法

是不是任何class都有构造方法?是的。

那前面我们并没有为Person类编写构造方法,为什么可以调用new Person()?

原因是如果一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法,它没有参数,也没有执行语句,类似这样:

class Person { public Person() { } }

要特别注意的是,如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法:

// 构造方法 public class Main { public static void main(String[] args) { Person p = new Person(); // 编译错误:找不到这个构造方法 } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } }

如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么只能把两个构造方法都定义出来:

// 构造方法 public class Main { public static void main(String[] args) { Person p1 = new Person("Xiao Ming", 15); // 既可以调用带参数的构造方法 Person p2 = new Person(); // 也可以调用无参数构造方法 } } class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } }

没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false:

class Person { private String name; // 默认初始化为null private int age; // 默认初始化为0 public Person() { } }

也可以对字段直接进行初始化:

class Person { private String name = "Unamed"; private int age = 10; }

那么问题来了:既对字段进行初始化,又在构造方法中对字段进行初始化:

class Person { private String name = "Unamed"; private int age = 10; public Person(String name, int age) { this.name = name; this.age = age; } }

当我们创建对象的时候,new Person("Xiao Ming", 12)得到的对象实例,字段的初始值是啥?

在Java中,创建对象实例的时候,按照如下顺序进行初始化:

  1. 先初始化字段,例如,int age = 10;表示字段初始化为10,double salary;表示字段默认初始化为0,String s;表示引用类型字段默认初始化为null;
  2. 执行构造方法的代码进行初始化。

因此,构造方法的代码由于后运行,所以,new Person("Xiao Ming", 12)的字段值最终由构造方法的代码确定。

多个构造方法

可以定义多个构造方法,在通过new操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分:

class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this.name = name; this.age = 12; } public Person() { } }

如果调用new Person("Xiao Ming", 20);,会自动匹配到构造方法public Person(String, int)。

如果调用new Person("Xiao Ming");,会自动匹配到构造方法public Person(String)。

如果调用new Person();,会自动匹配到构造方法public Person()。

一个构造方法可以调用其他构造方法,这样做的目的是便于代码复用。调用其他构造方法的语法是this(…):

class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this(name, 18); // 调用另一个构造方法Person(String, int) } public Person() { this("Unnamed"); // 调用另一个构造方法Person(String) } }

喜欢这个系列的同学可以关注我:

爆肝一个月,Python 从入门到精通

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 5:51:08

爆肝一个月,Java 从入门到精通07 - 方法

一个class可以包含多个field,例如,我们给Person类就定义了两个field: class Person {public String name;public int age; }但是,直接把field用public暴露给外部可能会破坏封装性。比如,代码可以这样写: …

作者头像 李华
网站建设 2026/10/20 5:50:46

ICMP模块化探测:网络层主动测绘的工程实践

1. 项目概述:这不是“Ping”那么简单,而是网络层主动测绘的底层逻辑“2.ICMP模块探测”这个标题乍看像一串编号加技术缩写,容易被误读为某个课程第二讲的课件名称,或者某份内部文档的章节索引。但如果你在一线做过网络运维、安全评…

作者头像 李华
网站建设 2026/10/20 5:50:36

可维护图表设计体系:文本化图表与自动化渲染实践

1. 从“diagram-design”这个标题里,我读出了什么第一次看到“diagram-design”这个标题时,我脑子里蹦出来的不是某个具体工具,而是一类非常典型的工程需求:把脑子里那张模糊的架构图、流程图、关系图,变成一张能直接贴…

作者头像 李华
网站建设 2026/10/20 5:50:23

基于Python的PPT自动化生成:模板与数据分离架构实战

1. 项目缘起与核心定位第一次看到“ppt-master”这个命名,我的直觉是:这大概率是一个围绕演示文稿自动化生成或批量处理的工具型项目。在办公自动化领域摸爬滚打这些年,我见过太多团队被PPT制作拖慢节奏——周报要统一模板、产品发布要批量套…

作者头像 李华
网站建设 2026/10/20 5:50:23

超市进销存系统用例图设计:从角色权限到表结构与代码落地

简介:面向超市运营与管理系统学习者,这份资源提供完整的进销存系统源码与设计文档。系统覆盖商品进货、销售管理、库存统计、订单追踪等核心模块,配套用例图清晰展示员工、顾客、供应商与系统间的交互关系,并定义管理员、收银员、…

作者头像 李华
网站建设 2026/10/20 5:50:22

生成式AI如何从工具变成精神秩序:反馈回路与边界设防

最近有位朋友跟我说了一句让我愣住的话:“现在我写什么东西之前,都会先问一遍AI,看到它的回答之后,心里才踏实。”他说得云淡风轻,但这句话我琢磨了很久。因为我自己也发现,生成式AI的使用方式正在悄悄变味…

作者头像 李华