3.4 构造方法

思维导图:


3.4.1 定义构造方法
### Java中的构造方法
#### **定义与目的**
构造方法,也称为构造器,是一个特殊的成员方法,用于在实例化对象时为对象赋值或执行初始化操作。其主要目的是确保对象在被创建时具有有效和合适的初始状态。
#### **特点与规则**
1. **名称与类名相同**:构造方法的名称必须与其所在的类名完全相同。
2. **没有返回类型**:构造方法不能有返回类型,这意味着它不允许包括`void`或其他任何类型。
3. **自动调用**:在实例化对象时,构造方法会自动被调用。
4. **return的使用**:虽然不能在构造方法中使用`return`来返回一个值,但可以使用无参数的`return`语句来结束方法的执行。
#### **分类**
1. **无参构造方法**:不带任何参数的构造方法。如果没有定义任何构造方法,Java会默认提供一个无参的构造方法。
2. **有参构造方法**:带参数的构造方法,可用于在创建对象时直接为属性赋值。
#### **示例**
- **无参构造方法**
class Student {public Student() {System.out.println("调用了无参构造方法");}
}
当创建Student类的对象时,上述构造方法会被自动调用。- **有参构造方法**
class Student {private String name;private int age;public Student(String n, int a) {this.name = n;this.age = a;System.out.println("调用了有参构造方法");}public void read() {System.out.println("我是:" + name + ", 年龄:" + age);}
}
在这个例子中,通过传递参数“张三”和18来实例化Student对象时,有参构造方法会被调用,属性`name`和`age`会被赋值。
#### **重要性**
构造方法为对象提供了一种明确的初始化方式,确保对象在被创建时就有一个合适的状态。这在面向对象的编程中是非常重要的,因为它确保了数据的完整性和对象的稳定性。
3.4.2 构造方法的重载
### 3.4.2 构造方法的重载
#### **概述**
与普通方法相同,构造方法也支持重载,这允许我们在同一个类中定义多个构造方法。不过,这些构造方法必须具有不同的参数列表(即参数的个数或类型不同)。
#### **核心要点**
1. **方法的定义**:同一个类中可以有多个构造方法,每个构造方法的参数类型或参数数量必须不同。
2. **方法的调用**:在实例化对象时,可以根据提供的参数来决定调用哪个构造方法。#### **示例**
class Student {private String name;private int age;// 无参构造方法public Student() {}// 单个参数的构造方法public Student(String n) {this.name = n;System.out.println("调用了一个参数的构造方法");}// 两个参数的构造方法public Student(String n, int a) {this.name = n;this.age = a;System.out.println("调用了两个参数的构造方法");}public void read() {// ...方法内容...}
}
#### **注意事项**
- **默认构造方法**:如果在类中没有定义任何构造方法,Java会为该类提供一个默认的无参构造方法。但是,如果定义了至少一个构造方法(无论是有参还是无参),Java不会为这个类提供默认的无参构造方法。因此,在定义了有参构造方法后,如果还希望有无参构造方法,则需要显式地定义一个无参构造方法。
对于上述代码示例,如果只有`public Student(String n)`和`public Student(String n, int a)`两个构造方法,而没有定义无参构造方法,则尝试创建无参的Student对象(如`new Student()`)会导致编译错误。
- **访问修饰符**:构造方法通常使用`public`修饰符,这样在其他类中可以轻松地创建该类的对象。但在某些情况下,例如单例设计模式,构造方法可能会被声明为`private`来防止外部类创建该类的多个对象。
#### **总结**
构造方法的重载为程序员提供了灵活性,允许我们根据不同的需求来创建对象。当定义有参构造方法时,为了避免意外,最好显式地再定义一个无参构造方法。这样,当其他开发者使用该类时,他们可以选择最适合他们需求的构造方法来创建对象。
总结:
### 构造方法:重点、难点与易错点
#### **重点**:
1. **定义与用途**:构造方法是用于初始化对象的特殊方法。它的名称必须与类名相同,并且没有返回值类型(即使是`void`)。
2. **自动调用**:当使用`new`关键字实例化对象时,构造方法会自动被调用。
3. **重载**:一个类可以拥有多个构造方法,这些方法可以根据不同的参数列表进行重载。
#### **难点**:
1. **区分默认与自定义构造方法**:如果没有为类定义任何构造方法,系统会默认提供一个无参构造方法。但是,一旦为类自定义了任何构造方法(无论有参还是无参),默认的无参构造方法将不再自动提供。
2. **使用`this`关键字**:在构造方法内部,我们可以使用`this`关键字来调用其他的构造方法,但这必须是构造方法中的第一个语句。
#### **易错点**:
1. **忘记定义无参构造方法**:当为类定义了有参构造方法后,很容易忘记再定义一个无参构造方法。这可能导致在尝试无参数实例化对象时出错。
2. **混淆方法重载**:为类定义多个构造方法时,可能混淆其参数列表,导致意外的重载行为或编译错误。
3. **返回值类型的误解**:构造方法不应该有返回值类型声明,不仅是`void`,这是它与普通方法的一个显著区别。
4. **忽略访问修饰符**:默认构造方法的访问级别与类的访问级别相同。例如,如果类被声明为`protected`,那么它的默认构造方法也是`protected`的。但当显式定义构造方法时,必须为它指定适当的访问修饰符。
总的来说,理解构造方法的工作方式并正确使用它是面向对象编程的基础。需要仔细考虑何时和如何定义多个构造方法,以及如何确保它们的正确性和效率。

相关文章:
3.4 构造方法
思维导图: 3.4.1 定义构造方法 ### Java中的构造方法 #### **定义与目的** 构造方法,也称为构造器,是一个特殊的成员方法,用于在实例化对象时为对象赋值或执行初始化操作。其主要目的是确保对象在被创建时具有有效和合适的初始状…...
代码随想录
前言 代码随想录算法训练营day43 一、Leetcode 1049. 最后一块石头的重量 II 1.题目 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分…...
2核4G游戏服务器推荐(阿里云/腾讯云/华为云)
2核4G游戏服务器推荐,首选腾讯云2核4G5M带宽轻量应用服务器218元一年、阿里云2核4G4M带宽轻量应用服务器297元一年,华为云2核2G3M云耀L服务器95元一年,阿腾云来详细说下2核4G游戏服务器推荐配置大全: 目录 2核4G游戏服务器推荐 …...
SQL标识列实现自动编号的步骤和技巧以及优势
目录 前言: 过程: 1.步骤: 2.标识种子和表示增量: 效果展示: 优势: 总结: 前言: 在.NET中的例子里面遇到这么一个问题,不能将NULL插入列‘ID’,表Login.dbo.Scores’;列不允许有NULL值。INSERT失败。这个问题很明显,我在SQL数据库中…...
【Debian】报错:su: Authentication failure
项目场景: 今天我重新刷了一个debian系统。 系统版本: # 查看系统版本 lsb_release -a 我的系统版本: No LSB modules are available. Distributor ID:Debian Description: Debian GNU/Linux 12 (bookwormÿ…...
我测试用的mark down教程
Markdown 教程 欢迎使用 Markdown 你好,Markdown是一种类似 Word 的排版工具,你需要仔细阅读这篇文章,了解一下 Markdown 基础知识。 Markdown 功能和列表演示 Markdown 有以下功能,帮助你用它写博客: 数学公式代码高亮导航功能等等Markdown 的优点: 间接高效大厂支持…...
网络编程基础知识总结——IP,端口,协议
目录 1. 什么是网络编程? 2. 网络编程的三要素 3. IP 3.1 IP地址的概念 3.2 IP地址的分类 3.3 IPv4解析 3.4 Ipv6解析 4. IPv4 的使用细节 5. 特殊IP地址 4. 端口号 5. 协议 5.1 UDP协议 5.2 TCP协议 1. 什么是网络编程? 总的来说就是一句…...
【LeetCode力扣】297. 二叉树的序列化与反序列化
目录 1、题目介绍 2、解题思路 2.1、详细过程图解 2.2、代码描述 2.3、完整代码 1、题目介绍 原题链接:297. 二叉树的序列化与反序列化 - 力扣(LeetCode) 示例 1: 输入:root [1,2,3,null,null,4,5] 输出&#…...
Linux寄存器+Linux2.6内核进程调度队列+命令行参数+环境变量
目录 一、寄存器 二、Linux2.6内核进程调度队列 (一)优先级 (二)活动队列 (三)过期队列 (四)active指针和expired指针 三、命令行参数 (一)举例一 &…...
组合数(2)获取C(n,k)组合数列表的QT实现
1)工程文件 QT coreCONFIG c17 cmdline# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.…...
SparkCore编程RDD
RDD概述 中文名为弹性分布式数据集,是数据处理基本单位。代表一个弹性的,不可变,可分区,里面的数据可并行计算的集合。 RDD和Hadoop MR 的区别: RDD是先明确数据处理流程,数据在行动算子执行前实际上并未…...
VBA技术资料MF69:添加和删除工作表中的分页符
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...
数字技术助力智慧公厕,让公厕变身为全新创新应用
在如今数字化的时代,数字技术的集成应用已经渗透到了生活的方方面面。其中一个令人瞩目的领域就是智慧公厕。以前只是简单的厕所,如今借助数字技术的力量,智慧公厕变得功能强大、智能高效。接下来,我们将以智慧公厕源头领航厂家广…...
electron 升级 v22 遇到问题
Electron 漏洞 https://mp.weixin.qq.com/s/5LpSJb_5uV8EIDOl3fz9Tw 由于 23以上不在支持win 7 8 8.1 所以我选择安装 v22.3.24 electron 22.3.24 node-sass 6.0.1 sass-loader 10.4.1 对应的版本 npm i node-sass6.0.1 --sass_binary_sitehttps://npm.taobao.org/mirrors…...
跟我学c++中级篇——Pimpl
一、前向声明 前向声明或者前置声明(forward declaration),这个在c中用得还是比较多的。一般的框架或者库中,经常可以看到在一个类的前面声明了一个类,类似下面这样: class useclass; class mycall{...useclass *us; };前向声明…...
[补题记录] Atcoder Beginner Contest 295(E)
URL:https://atcoder.jp/contests/abc295 目录 E Problem/题意 Thought/思路 Code/代码 E Problem/题意 给定长度为 N 的数组 A。进行如下操作: 若 Ai 0,将 Ai 等概率地变为 1 ~ M 中的任意一个数;对 A 排序; …...
解决git在window11操作很慢,占用很大cpu的问题
【git在window11操作很慢,占用很大cpu,最后也执行失败】 在谷歌输入:git very slow in window 11。通过下面链接终于找到了解决方案: https://www.reddit.com/r/vscode/comments/sulebx/slow_git_in_wsl_after_updating_to_window…...
C++智能指针(二)——weak_ptr初探
文章目录 1. shared_ptr 存在的问题2. 使用weak_ptr2.1 初始化 weak_ptr2.2 访问数据 3. 附录4. 参考文献 1. shared_ptr 存在的问题 与 shared_ptr 的引入要解决普通指针存在的一些问题一样,weak_ptr 的引入,也是因为 shared_ptr 本身在某些情况下&…...
540 - Team Queue (UVA)
题目链接如下: Online Judge 对比刘汝佳的代码,我没有用queue来排整个队伍,因为那样的话遍历整个队伍太麻烦,vector比较方便。但vector删除元素比较耗时,所以就不删了,仅仅用pivot来指代目前队伍的开始。…...
投资组合之如何估值
文章目录 如何估值一、PE估值法1、PE估值法的定义2、参考标准(1)常规标准:25倍合理市盈率。(2)同行业对比。(3)跟历史市盈率相比。 3、PE估值法的适用范围4、PE估值法的优势5、PE估值法的劣势&a…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
