课时8:构造方法与匿名对象

简介: 本此课程主要围绕Java中的构造方法与匿名对象展开讨论。详细阐述了构造方法出现的原因、定义要求、使用方式、重载特性,以及与setter方法的区别;同时介绍了匿名对象的概念、使用场景,并通过程序示例进行内存分析,帮助读者深入理解这两个重要的Java概念。

课时8:构造方法与匿名对象


摘要:本此课程主要围绕Java中的构造方法与匿名对象展开讨论。详细阐述了构造方法出现的原因、定义要求、使用方式、重载特性,以及与setter方法的区别;同时介绍了匿名对象的概念、使用场景,并通过程序示例进行内存分析,帮助读者深入理解这两个重要的Java概念。

1. 构造方法的引入

2. 构造方法的定义与使用

3. 构造方法与默认构造方法

4. 构造方法的重载

5. 构造方法与setter方法的区别

6. 匿名对象


01、 构造方法的引入


在Java程序中,通常我们在使用对象时,需经历两个步骤:先声明并实例化对象,此时对象中的属性为对应数据类型的默认值;接着通过一系列setter方法为对象属性设置内容。


若对象属性较多,如假设有8个属性,就需要调用8次setter方法,这种方式较为繁琐。为解决对象初始化的问题,Java提供了构造方法,其主要目的是实现实例化对象中的属性初始化处理。

 

02、 构造方法的定义与使用

2.1 定义要求

1.方法名称:构造方法的名称必须与类名称保持一致。

2.返回值类型:构造方法不允许设置任何返回值类型,即没有返回值定义。

3.自动调用:构造方法在使用关键字`new`实例化对象的时候自动调用。


示例代码

以`Person`类为例,定义有参构造方法:方法名称与类名称相同,并且无返回值定义

//有参构造方法
public Person(String n,in ta){
name=n;
age=a;
}
在代码中使用构造方法实例化对象:
Person per=newPerson("张三",18);

通过上述代码可以看出,构造方法为对象的属性进行了初始化。


下面针对当前的对象实例化格式与之前的对象实例化格式做一个比较:

之前的对象实例化格式:①person ②per=③new④person();

当前的对象实例化格式:①person ②per=③new④Person(“张三”.18);


“①person“:主要是定义对象的所属类型,类型决定了你可以调用的方法。

“②per“:实例化对象的名称,所有的操作通过对象来进行访问。

“③new”:开辟一块新的堆内存空间;

“④Person(“张三”.18)“:调用有参构造。” ④Person()“:调用无参构造。

 

03、 构造方法与默认构造方法


在Java程序中,为保证程序结构的完整性,所有的类都会提供构造方法。若类中没有定义任何构造方法,编译器会默认提供一个无参的、什么都不做的构造方法。这个默认构造方法在程序编译时自动创建,通过反编译工具可以看到。


但当类中明确定义了构造方法时,默认构造方法将不会被自动创建。

例如,在已经定义了有参构造方法的`Person`类中,若尝试使用无参构造方法实例化对象:

Person per=newPerson();//会报错,提示无法找到匹配的构造器

image.png

image.png

image.png

这是因为此时类中只有有参构造方法,不存在默认的无参构造方法。结论:一个类至少存在有一个构造方法,永恒存在。

构造方法不允许设置返回值类型的原因

构造方法不允许设置返回值类型,这可能会让部分开发者感到疑惑。从编译器的角度来看,编译器是根据代码结构来进行编译和执行处理的。构造方法和普通方法在结构上,如果构造方法使用`void`定义,其结构就与普通方法完全相同,编译器会将其误认为是普通方法。


而构造方法是在对象实例化的时候调用,普通方法是在对象实例化产生之后调用,两者有着本质区别,所以构造方法不能设置返回值类型。

 

04、 构造方法的重载


构造方法作为一种方法,具有重载的特点。在进行构造方法重载时,只需要考虑参数的类型及个数即可。

例如,对`Person`类进行构造方法重载:

4.1 无参构造方法

Public Person(){
Public Person(string n){ 
name=n;执行

image.png

假如

Public Person(){
Public Person(string n){ 
name=“无名氏“; 
age=-1;
}

image.png

4.2 有参构造方法

publicPerson(String n,int a){
name=n;
age=a;
}
}

在定义多个构造方法时,建议按照参数个数升序或降序排列,如先定义无参构造方法,再定义单参构造方法,最后定义多参构造方法,这样代码结构更清晰。虽然不按此顺序定义代码本身不会出错,但会影响代码的可读性和维护性。

 

05、 构造方法与setter方法的区别


构造方法和setter方法都可以进行数据设置,但它们有着不同的用途。构造方法是在对象实例化的时候为属性设置初始化内容;而setter方法除了具有设置数据的功能之外,还具有修改数据的功能。

在使用时:

Person per=new Person("张三",10);
person.setAge(18);
per.tell();//进行方法的调用


通过上述代码可以清晰地看到两者的区别。

经过了分析之后可以发现,利用构造方法可以传递属性数据,于是现在进一步分析对象的产生格式:

定义对象的名称:类名称 对象名称

实例化对象:对象名称=new类名称()


如果这个时候只是通过实例化对象来进行类的操作也是可以的。而这种形式的对象由于没有名字就称为匿名对象

 

06、 匿名对象


在Java中,当我们仅通过实例化对象来进行类的操作,且这个对象没有名字时,就称其为匿名对象。

匿名对象使用一次之后,由于没有任何引用指向它,就将成为垃圾,会被垃圾回收器(GC)回收与释放。在实际开发中,使用有名对象还是匿名对象取决于具体需求。如果某个对象只需要使用一次,并且不需要在后续代码中再次引用,就可以考虑使用匿名对象。


(1) 构造方法与匿名对象的内存分析示例

下面通过一个示例程序来分析构造方法与匿名对象在内存中的操作:

classMessage{
private String title;
 
public message (String t){
title=t;
}
Public String get Title(){
return title;
}
public void setTitle(string t)
title=t;
}
}
class Person
     private String name;
     private int age;
public Person(message,int a){
name=msg.getTitle;
age=a;
}
Public message getinfo(){
Return new message(name+“;“+age);
}
Public void tell(){
     Systyem.out.println(“姓名:“+name+”、年龄+age);
}
}
 
public class JavaDemo{//主类
public static void main(String args[]){
   Message msg=new message(“mldn”)
   person per=new person(new message(“msg,20”))
       msg=per.getinfo()
System.out.println(msg.getTitle());
}
}

image.png


通过此程序我们进行一个简短的内存分析


(2) 内存分析

image.png

咱们以一段代码为例来进行内存分析。当代码中出现“messagemsg”时,就表明必然存在一个堆栈。代码里有个msg,它指向的空间有个title,内容是“MLdn”。


接下来,person per=newperson这行代码,清晰地表明msg会接收自身title数据的引用。只要出现关键字new,就意味着要开辟新空间。在这个例子中,新开辟空间的内容通过name=mldn可知,name和title是一样的,同时年龄被设为20。


再往下,调用per.getinfo方法,这里出现了return关键字,这使得代码逻辑变得有趣。看到关键字new,就要知道它是用来开辟新空间的,这里创建的是一个匿名对象,其内容是“MLdn:20”。


这个匿名对象创建后会返回给msg,但msg原本就有引用,所以它会抛弃原本的引用,转而指向新的引用,这就产生了一个垃圾问题,原本msg指向的旧空间会成为垃圾空间。


这段程序本身没有实际意义,主要是通过构造方法展示了方法可以传递任意数据类型,包括基本数据类型和引用数据类型,像字符串就是一种特殊的引用数据类型。

image.png

image.png

相关文章
|
7月前
|
JSON API 开发者
1688店铺所有商品API接口(1688API系列)
1688店铺所有商品API接口允许开发者通过输入店铺ID,获取指定店铺内的全部商品信息,包括名称、价格、库存、图片和销售数据等。该接口支持排序和分页参数,返回JSON格式数据,便于解析和应用。Python示例展示了如何使用requests库发送GET请求并处理响应,助力电商数据分析与业务拓展。
|
7月前
|
人工智能 数据可视化 Linux
插件发布新特性,让运动适配更简单。
AI运动识别插件已迭代至1.5.5版本,新增两大特性助力开发者轻松适配健身、体育等AI运动场景。一是相对位置检测,新增手部等肢体的相对位置判断,减少适配工作量;二是骨骼图绘制器偏移优化,解决全屏模式适配问题。我们致力于提供简洁、灵活的解决方案,支持AI体育、体测、AR互动等应用开发,后续还将推出UNI APP插件、私有化部署服务及可视化工具,助力全景式AI运动应用构建。
|
11月前
|
敏捷开发 监控 数据可视化
哪些任务管理工具能提升团队协作效率?2024年最佳进度管理工具推荐
随着团队合作和项目管理的数字化转型,选择合适的任务进度管理工具成为提高团队效率的关键。本文推荐5款适合团队使用、功能各异的任务管理工具:板栗看板、Airtable、ZenHub、Proofhub 和 Wrike,旨在帮助团队根据具体需求挑选最合适的软件。这些工具不仅支持任务的高效管理和追踪,还促进了团队成员间的沟通与协作,尤其适用于跨地区协作、远程办公及项目繁杂的环境。
 哪些任务管理工具能提升团队协作效率?2024年最佳进度管理工具推荐
|
7月前
|
Java C语言 C++
课时9:Java数据类型划分(数据类型划分)
课时9介绍了Java的数据类型划分及其操作。Java数据类型分为基本数据类型和引用数据类型。基本数据类型包括八种:数值型(整形、浮点型)、字符型和布尔型;引用数据类型有数组、类和接口。重点讲解了每种数据类型的默认值、适用场景及选择原则,如整数用int,小数用double,日期时间用Long等。掌握这些内容对编程至关重要。
139 4
课时9:Java数据类型划分(数据类型划分)
|
7月前
|
Java 编译器
课时9:this调用本类属性
本次分享的主题是 This 调用本类属性。主要分为一个部分: 使用 This 关键字表示或调用当前对象的属性
|
7月前
|
安全 Java
课时7:成员属性封装
我们先来了解一下属性封装。在Java中,成员由属性和方法构成,一般来说,方法是对外提供服务的,通常不会进行封装处理,而属性由于需要较高的安全性,往往要对其加以保护,也就是要用封装性来处理、保护属性。
|
7月前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
118 4
|
7月前
|
Java 编译器
课时7:Java程序基本概念(注释)
课时7介绍了Java程序中的注释。编程语言有其语法和语义,注释有助于理解代码需求,防止断档。Java支持三类注释:单行(//)、多行(/* */)和文档注释(/** */)。注释不会被编译器编译。范例中展示了如何在代码中使用注释,并强调了注释对项目文档管理的重要性。
121 3
|
7月前
|
人工智能 人机交互
清华、面壁提出创新AI Agent交互:能主动思考、预测需求
清华大学与面壁智能团队提出了一种创新的AI Agent交互模式,将基于大型语言模型的智能体从被动响应转变为主动协助。通过数据驱动的方法,研究团队开发了能够预测和主动发起任务的智能体,并创建了ProactiveBench数据集。实验结果显示,经过微调的模型在主动性方面取得了66.47%的F1分数,展示了该方法在人机协作中的潜力。论文链接:https://arxiv.org/abs/2410.12361
255 2
|
7月前
|
算法 测试技术
北大李戈团队提出新代码模型对齐方法 CodeDPO:显著提升代码准确性与执行效率
北京大学李戈团队提出CodeDPO,一种新型代码模型对齐方法,通过整合偏好学习提升代码生成的准确性和执行效率。该方法采用自我生成和验证机制,基于PageRank算法迭代优化代码片段排名,构建偏好优化数据集。CodeDPO在HumanEval基准测试中实现83.5%的通过率,显著优于现有方法,并能提高代码执行效率。其灵活性和可扩展性使其适用于多种编程任务,但训练资源需求较大,且依赖于生成测试用例的质量。论文链接:https://arxiv.org/pdf/2410.05605。
144 2