课时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

相关文章
|
10月前
|
JSON API 开发者
1688店铺所有商品API接口(1688API系列)
1688店铺所有商品API接口允许开发者通过输入店铺ID,获取指定店铺内的全部商品信息,包括名称、价格、库存、图片和销售数据等。该接口支持排序和分页参数,返回JSON格式数据,便于解析和应用。Python示例展示了如何使用requests库发送GET请求并处理响应,助力电商数据分析与业务拓展。
|
10月前
|
人工智能 数据可视化 Linux
插件发布新特性,让运动适配更简单。
AI运动识别插件已迭代至1.5.5版本,新增两大特性助力开发者轻松适配健身、体育等AI运动场景。一是相对位置检测,新增手部等肢体的相对位置判断,减少适配工作量;二是骨骼图绘制器偏移优化,解决全屏模式适配问题。我们致力于提供简洁、灵活的解决方案,支持AI体育、体测、AR互动等应用开发,后续还将推出UNI APP插件、私有化部署服务及可视化工具,助力全景式AI运动应用构建。
|
10月前
|
人工智能 JavaScript 前端开发
一个支持阿里云百炼平台DeepSeek R1大模型(智能体)的Wordpress插件,AI Agent or Chatbot.
这是一个将阿里云DeepSeek AI服务集成到WordPress的聊天机器人插件,支持多轮对话、上下文记忆和自定义界面等功能。用户可通过短代码轻松添加到页面,并支持多种配置选项以满足不同需求。项目采用MIT协议授权,代码仓位于GitHub与Gitee。开发者Chi Leung为长期境外工作,代码注释以英文为主。适合需要在WordPress网站中快速部署AI助手的用户使用。
|
10月前
|
监控 算法 搜索推荐
数据中挖掘能量:能源行业效率提升的秘密
数据中挖掘能量:能源行业效率提升的秘密
173 18
|
10月前
|
Java 开发工具 uml
课时106:类图
本文介绍了UML(统一建模语言)及其在类图设计中的应用,重点讲解了使用Power Designer工具进行类图设计的具体步骤。UML通过图形化形式描述程序类关系,常见的设计工具有Rational Rose和Power Designer。文中详细说明了如何在Power Designer中新建类图、定义类的属性和方法、创建接口及其实现关系,并生成代码。此外,还介绍了将现有代码转换为类图的方法,以简化开发流程。总结指出,在实际项目中,通常会先编写代码再生成类图,以避免繁琐的设计过程。
293 2
课时106:类图
|
10月前
|
Java C语言 C++
课时9:Java数据类型划分(数据类型划分)
课时9介绍了Java的数据类型划分及其操作。Java数据类型分为基本数据类型和引用数据类型。基本数据类型包括八种:数值型(整形、浮点型)、字符型和布尔型;引用数据类型有数组、类和接口。重点讲解了每种数据类型的默认值、适用场景及选择原则,如整数用int,小数用double,日期时间用Long等。掌握这些内容对编程至关重要。
221 4
课时9:Java数据类型划分(数据类型划分)
|
10月前
|
存储 Java 编译器
课时60:子类对象实例化流程
摘要: 1.子类对象实例化要求 2.范例1:默认情况下的子类实例化 3.范例2:修改子类,显式使用 super() 4.范例3:父类仅提供有参构造方法,不使用无参构造 5.范例4:其他父类构造
186 6
|
10月前
|
Java
课时11:Java数据类型划分(浮点类型)
课时11介绍了Java中的浮点数据类型。主要内容包括:1. 定义小数,默认使用Double类型;2. 定义Float变量,需在数值后加"F"或"f"进行强制转换;3. 观察不同类型计算结果,如Int型除法会丢失精度,需至少包含一个Double或Float类型以确保准确性。总结指出,在复杂计算中推荐使用Double类型以避免精度损失。
249 5
|
10月前
|
Java 编译器
课时9:this调用本类属性
本次分享的主题是 This 调用本类属性。主要分为一个部分: 使用 This 关键字表示或调用当前对象的属性
|
10月前
|
安全 Java
课时7:成员属性封装
我们先来了解一下属性封装。在Java中,成员由属性和方法构成,一般来说,方法是对外提供服务的,通常不会进行封装处理,而属性由于需要较高的安全性,往往要对其加以保护,也就是要用封装性来处理、保护属性。
117 3

热门文章

最新文章