java对象的构造方法及初始化
前言上一篇我们介绍了Java中类和对象的基础知识知道了用类进行实例化对象并且通过“引用变量.成员变量名”进行访问并赋值但其实对象的初始化方式不止上一篇直接赋值那一种。今天我们详细讲一讲Java对象的构造和初始化。一、知识回顾与对比基于前期对Java基础知识的学习我们知道在方法内部定义一个局部变量时必须要在使用前进行初始化否则会编译失败。例如public static void main(String[] args){ int a; System.out.println(a); } //Error:(26,28)java:可能尚未初始化变量a //这段代码会编译失败因为a定义在main方法内部所以a是一个局部变量。 //局部变量在使用前必须要初始化而这里的a在打印前没有进行初始化。而再让我们来使用对象的成员变量来试试class Dog{ public String name; public String color; public int age; public void bark(){ System.out.println(汪汪汪); } public void printData(){ System.out.println(name/color/age); } public static void main(String[] args){ Dog dognew.Dog(); dog.printData();//输出结果是:null/null/0 } } //代码正常通过编译注释printData方法中打印的那一行涉及到的小知识点“”两侧只要有一个是字符串就执行字符串拼接把其他类型转换为字符串再拼接。本例中/是字符串所以name,color,age都会转成字符串拼接输出。❓由上述的两个例子可以发现成员变量没有进行初始化也可以正常使用不会编译失败。这是为什么呢答对于成员变量来说是定义在方法外面的不属于局部变量不初始化也不会报错它会自动被赋值为null或相对应的零值为默认值。而String对应的零值是nullint对应的零值是0这也就解释了为什么输出结果是null/null/0❓那么我们自然就会发问成员变量的默认值是谁赋的答JVM会默认提供一个隐形无参构造方法new对象时自动给所以成员变量赋默认值。二、构造方法2.1 什么是构造方法构造方法(又称构造器)是一个特殊的成员方法名字必须与类名相同每当创建新对象时由编译器自动调用并且在整个对象的生命周期内只调用一次。2.2 构造方法的特性Ⅰ.名字必须与类名同名Ⅱ.没有返回值类型设置为void也不行Ⅲ.创建对象时由编译器自动调用并且在对象的生命周期内只调用一次Ⅳ.构造方法绝大多数情况下使用public来修饰特殊场景下会被private修饰Ⅴ.如果用户没有显示定义编译器会生成一份默认的构造方法生成的默认构造方法一定时无参的。class Dog{ public String name; public String color; public int age; public void bark(){ System.out.println(汪汪汪); } public void printData(){ System.out.println(name/color/age); } /* 如果我们代码里没有手动写任何构造方法编译器编译的时候 就会自动在类中生成下面这个无参构造方法只不过不显示出来 public Dog(){ //空实现里面没有任何赋值代码 } */ public static void main(String[] args){ Dog dognew.Dog(); dog.printData();//输出结果是:null/null/0 } }Ⅵ.一旦用户手动定义了构造方法编译器则不再生成class Dog{ public String name; public String color; public int age; public void bark(){ System.out.println(汪汪汪); } public void printData(){ System.out.println(name/color/age); } //手动写了一个构造方法编译器不会再提供默认的构造方法 public Dog(String mingzi,String yanse,int nianling){ namemingzi; coloryanse; agenianling; } public static void main(String[] args){ Dog dognew.Dog(大黄,黄色,3); dog.printData();//输出结果是:大黄/黄色/3 } }Ⅶ. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)class Dog{ public String name; public String color; public int age; public void bark(){ System.out.println(汪汪汪); } public void printData(){ System.out.println(name/color/age); } //无参构造 public Dog(){ name小黑; color黑色; age4; } //有参构造 public Dog(String mingzi,String yanse,int nianling){ namemingzi; coloryanse; agenianling; } public static void main(String[] args){ //调用无参构造 Dog dog1new.Dog(); dog1.printData();//输出结果是小黑/黑色/4 //调用有参构造 Dog dognew.Dog(大黄,黄色,3); dog.printData();//输出结果是:大黄/黄色/3 } }知识需知多个方法构成重载要求方法名字相同参数列表参数个数类型不同。现在我们同时写了无参构造和有参构造这就构成了构造方法的重载。Java在执行new创建对象的时候会根据我们传入的参数数量、类型自动匹配调用对应的构造方法。Ⅷ.通过this访问当前对象的成员变量①在介绍this之前我们先举一个例子来更好的理解为什么要用this来访问当前对象的成员变量。class Dog{ public String name; public String color; public int age; public void bark(){ System.out.println(汪汪汪); } //有参构造 //注意在这里我们定义的形参和成员变量名字相同 public Dog(String name,String color,int age){ namename; colorcolor; ageage; } public void printData(){ System.out.println(name/color/age); } public static void main(String[] args){ Dog dognew.Dog(大黄,黄色,3); dog.printData();//输出结果是:null/null/0 } }明明调用有参构造传入了“大黄”“黄色”3但是运行输出却是null/null/0这是Java的就近原则导致的。当局部形参和成员变量名字相同时局部形参的优先级更高代码中“namename”(color,age同理)等号两边的name都会被识别成形参name。效果就变成形参接收了传入的“大黄”然后把这个值又赋值给它自己。整个过程。类里面真正的成员变量完全没有被赋值成员变量依旧保留JVM赋予的默认初始化所以输出null/null/0想要指定操作成员变量就需要this.关键字。②this引用指向当前对象成员方法运行时调用该成员方法的对象即哪个对象的引用调用了该方法this就代表哪个对象。在成员方法中所有成员变量的操作都是通过该引用去访问。this.name代表当前对象的成员变量。class Dog{ public String name; public String color; public int age; public void bark(){ System.out.println(汪汪汪); } //有参构造 //注意在这里我们定义的形参和成员变量名字相同 public Dog(String name,String color,int age){ this.namename; this.colorcolor; this.ageage; } public void printData(){ System.out.println(this.name/this.color/this.age); } public static void main(String[] args){ Dog dognew.Dog(大黄,黄色,3); dog.printData();//输出结果是:大黄/黄色/3 } }此时“this.namename;”就可以区分出this.name是成员变量name是形参。进而可以正确的把形参接收到的值赋给真正的成员变量。Ⅸ.通过this访问当前对象的其他构造方法来简化代码this()在构造里调用其他构造目的是复用构造里面的业务代码避免重复写一样的赋值逻辑。对比案例【不使用this()】VS【使用this()】//版本1不使用this()无参构造单独写赋值校验重复代码 public class Date { public int year; public int month; public int day; //无参构造默认1900-1-1 public Date(){ year 1900; month 1; day 1; //【重复代码】和三参构造一模一样的校验 if(month 1 || month 12){ throw new RuntimeException(月份必须是1~12); } if(day 1 || day 31){ throw new RuntimeException(日期范围非法); } } //三参构造用户自定义日期 public Date(int year, int month, int day) { this.year year; this.month month; this.day day; //同样一套校验逻辑 if(month 1 || month 12){ throw new RuntimeException(月份必须是1~12); } if(day 1 || day 31){ throw new RuntimeException(日期范围非法); } } }缺点校验代码写了两遍以后如果要修改规则比如2月最多28天两个构造里面都要改。一旦只改一处、漏改另一处就会出现bug。//版本2使用this()无参构造调用三参构造代码复用只写一次校验 public class Date { public int year; public int month; public int day; //无参构造默认1900-1-1 public Date(){ //调用本类三参构造把默认值传进去 this(1900,1,1); } //三参构造用户自定义日期 public Date(int year, int month, int day) { this.year year; this.month month; this.day day; //校验【只写这一处】 if(month 1 || month 12){ throw new RuntimeException(月份必须是1~12); } if(day 1 || day 31){ throw new RuntimeException(日期范围非法); } } }优点校验逻辑只写一份。不管是 new Date() 默认日期还是 new Date(2026,10,4)都会走这一套校验。后续修改规则只需要修改三参构造这一处不会漏改。小总结如果不使用 this(...) 调用其他构造想要无参构造也带上参数校验我们只能把校验代码复制粘贴到无参构造里面。相同逻辑写多份后续维护很麻烦很容易出现修改一处、忘记修改另一处的bug。使用 this(参数) 可以在无参构造中直接调用三参构造把默认值传给三参构造。赋值、校验的逻辑只写一次两种创建对象的方式共用同一套初始化代码消除重复代码。语法硬性规则this(...) 只能写在构造方法中并且必须是第一行代码。三、对象成员变量的初始化方法4种1. 默认初始化JVM自动执行JVM分配内存自动给所有成员变量赋默认值引用类型 null int0boolean false。最先执行我们代码看不见。2. 就地初始化声明变量的时候直接赋值写在成员变量定义处在构造方法执行之前运行。class Dog{ public String name小黑;//就地初始化 public String color黑色;//就地初始化 public int age4;//就地初始化 public void bark(){ System.out.println(汪汪汪); } public Dog(String name,String color,int age){ this.namename; this.colorcolor; this.ageage; } public void printData(){ System.out.println(this.name/this.color/this.age); } public static void main(String[] args){ Dog dognew.Dog(大黄,黄色,3); dog.printData();//输出结果是:大黄/黄色/3 } }3. 构造方法初始化本篇重点讲的new对象时触发构造方法在构造内部给成员变量赋值。包含 this() 调用其他构造这种场景本质还是构造方法初始化。4. 代码块初始化实例代码块,目前了解即可后续详细学习实例代码块每次new对象都会执行执行时机就地初始化之后构造方法代码之前。{ name小黑; color黑色; age4; }四、本篇小结本篇我们围绕Java对象的构造与初始化展开先区分了成员变量和局部变量的默认值规则认识了构造方法的定义、特征与重载机制。接着通过同名变量的案例理解就近原则学会使用 this.成员变量 访问当前对象的属性又借助 this(...) 在构造方法之间互相调用实现代码复用减少重复的校验逻辑。最后我们区分了对象初始化和对象创建完成后修改成员变量这两个概念梳理了对象初始化的几种方式。构造方法是对象诞生的入口理解初始化流程是学习面向对象的基石。后续我们会继续探索面向对象其他相关知识点。本篇就分享到这里。如果文中有错误或者疑问欢迎评论区交流。咱们下一篇再见敬请期待后续更新

相关新闻

温控对象传递函数辨识:从阶跃响应实验到Matlab系统辨识实战

温控对象传递函数辨识:从阶跃响应实验到Matlab系统辨识实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 6:23:15 阅读更多 →
为什么安全关键系统禁用动态内存分配?替代方案与工程实践

为什么安全关键系统禁用动态内存分配?替代方案与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 6:22:15 阅读更多 →
多租户SaaS架构入门:三种隔离模型与租户路由实践

多租户SaaS架构入门:三种隔离模型与租户路由实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 6:22:15 阅读更多 →

最新新闻

Java零基础入门:周末大总结

Java零基础入门:周末大总结

import java.util.Scanner; public class SummaryTry { public static void main(String[] args) { 综合编程题 11:简易学生成绩管理系统(控制台版)】 结合本周所有知识点,完成以下需求: 使用 Scanner 输入3名学生的姓…

2026/10/5 9:23:55 阅读更多 →
AI辅助芯片选型:从痛点拆解到实战工作流

AI辅助芯片选型:从痛点拆解到实战工作流

芯片选型的AI工具,现在其实是个“看着热闹、用着别扭”的领域。真干过硬件的人都知道,上午还在为选一颗合适的LDO翻三个分销商网站,下午就可能因为某颗MCU的交期变成52周而推翻整版方案。最近AI工具的声量很大,但能正经回答“帮我…

2026/10/5 9:23:55 阅读更多 →
自注意力+对抗生成网络:深度子空间聚类实战解析

自注意力+对抗生成网络:深度子空间聚类实战解析

简介:一份关于基于自注意力对抗的深度子空间聚类研究的Word文档,面向机器学习、计算机视觉等领域的研究者和学习者,系统阐述如何融合自注意力机制与对抗网络来提升高维数据聚类的鲁棒性。文档从聚类基础与经典算法讲起,涵盖稀疏子…

2026/10/5 9:23:55 阅读更多 →
分数阶时滞神经网络稳定性分析:Caputo导数、LMI判据与数值验证

分数阶时滞神经网络稳定性分析:Caputo导数、LMI判据与数值验证

简介:这份PDF文献《含有离散时滞及分布时滞分数阶神经网络的渐近稳定性分析》面向从事神经网络、深度学习与数据建模方向的研究生、教师及工程技术人员,聚焦分数阶神经网络在同时含离散时滞与分布时滞情形下的渐近稳定性难题。文章在Caputo导数意义下构造…

2026/10/5 9:23:55 阅读更多 →
从爬虫到可视化:豆瓣读书Top250全栈数据项目实战

从爬虫到可视化:豆瓣读书Top250全栈数据项目实战

做这个豆瓣读书 Top250 全栈数据项目,起因其实特别朴素,就是想给简历里添一个能从头讲到尾的实战项目。python爬虫负责采数据,pandas做数据清洗,MySQL落库,Java后端提供接口,前端再用ECharts把图书数据渲染…

2026/10/5 9:23:55 阅读更多 →
Google AX 开源:用声明式 YAML 编排十亿级 AI Agent 任务

Google AX 开源:用声明式 YAML 编排十亿级 AI Agent 任务

1. 从“一天一个开源项目”聊起:为什么 AX 值得单独写一篇做 Agent 开发这两年,我最大的感受就是:写一个能跑的 Agent 不难,难的是让一千个、一万个甚至更多 Agent 稳定地跑起来、跑对、跑完还能查账。单机跑个 ReAct 循环&#x…

2026/10/5 9:22:54 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →