![零基础Java学习笔记](https://wfqqreader-1252317822.image.myqcloud.com/cover/177/36710177/b_36710177.jpg)
4.3 构造方法与对象
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_20.jpg?sign=1738836789-xUdoQdsgTRGMjYbyPUky2zf8xwqr7fKs-0-87a1186e50b453a060c1dee3adc636ff)
构造方法用于将对象中的所有成员变量进行初始化。对象的属性通过变量来刻画,也就是类的成员变量,而对象的行为通过方法来体现,也就是类的成员方法。方法可以通过操作属性形成一定的算法来实现一个具体的功能。类可以把属性和方法封装成一个整体。
4.3.1 构造方法的概念及用途
构造方法是一种特殊的方法,它的名字必须与它所在类的名字完全相同,而且没有返回值,也不需要使用关键字void 进行标识。例如:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_21.jpg?sign=1738836789-KIvWlOZqnDk2e9atdNkPfIktWk34wQpA-0-e43c8c09037f45f186e0d87ac5e7a1cc)
构造方法用于将对象中的所有成员变量进行初始化,在创建对象时立即被调用。
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_22.jpg?sign=1738836789-jxTuUVsCPLb3fvTL53cpSQ01Ps3BLGJ4-0-f2b958394bd995e803ae555267933765)
图4.5 Tiger 类的UML 图
1.默认构造方法和自定义构造方法
如果类中定义了一个或多个构造方法,则Java 中不提供默认的构造方法。
【例4.2】 定义Apple 类,在该类的构造方法中初始化成员变量,具体代码如下:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_23.jpg?sign=1738836789-cEKQ7YPeDm484Lo6fTZvzlhy0veQ2gjl-0-53af0d2aac0fb7baacc42d75d6414938)
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_24.jpg?sign=1738836789-J6e00znphM3tbnK4SLKxJc0sO9taCi85-0-b29fac4f928d1752cb990bec2a76f29e)
图4.6 类初始化成员变量的值
程序运行结果如图4.6 所示。
2.构造方法没有返回值
需要注意的是,构造方法没有返回值,例如,下面这段代码,如果强行添加返回值类型则会报错:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_25.jpg?sign=1738836789-ssMPFZfldk5VkTWFqh30xXoUkmu3JwFj-0-f51414e5246ec2fc9c9bd9df703c0829)
需要注意的是,如果用户没有定义构造方法,Java 会自动提供一个默认的构造方法,用来实现成员变量的初始化。在Java 中,各种类型变量的初始值如表4.1 所示。
表4.1 各种类型变量的初始值
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_26.jpg?sign=1738836789-IRcv6LgWzR020Kn3It2pJMFPrkRdSo3l-0-69c947bf117c0d583ae70f6b00f27abc)
4.3.2 对象的概述
在面向对象语言中,对象是对类的一个具体描述,是一个客观存在的实体。“万物皆对象”,也就是说,任何事物都可以被看作对象,如一个人、一个动物,或者没有生命体的轮船、汽车、飞机,甚至概念性的抽象,如公司业绩等。
一个对象在Java 中的生命周期包括创建、使用和销毁3 个阶段。
4.3.3 对象的创建
对象是类的实例。Java 定义任何变量都需要指定变量类型,因此,在创建对象之前,一定要先声明该对象。
1.对象的声明
声明对象的一般格式如下:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_27.jpg?sign=1738836789-mnZQVoqCMmA5sqJN2Rl9I4O6mNBzbiRZ-0-955522cde1a1a55c583a8046b06eeba1)
●类名:必选参数,用于指定一个已经被定义的类。
●对象名:必选参数,用于指定对象的名称。对象名必须是合法的Java 标识符。
例如,声明Apple 类的一个对象redApple 的具体代码如下:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_28.jpg?sign=1738836789-xJqsSpuWGlWCnMJ5EvIFqxDL0Gtefi6R-0-2410017e9c85144c2ecc78ebfdd291b6)
2.实例化对象
在声明对象时,只是在内存中为其建立一个引用,并设置初始值为null,表示不指向任何内存空间。
在声明对象后,需要为对象分配内存,这个过程被称为实例化对象。在Java 中使用关键字new 来实例化对象,具体语法格式如下:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_29.jpg?sign=1738836789-vtVptLEtp5VuMRU8C8P9gNv0ipO3Xnr7-0-232120bb66cf55c7da08b691ce5c1a8d)
●对象名:必选参数,用于指定已经被声明的对象名。
●类名:必选参数,用于指定构造方法名,即类名,因为构造方法名与类名相同。
●参数列表:可选参数,用于指定构造方法的入口参数。如果构造方法无参数,则可以省略。
在声明Apple 类的一个对象redApple 后,可以通过以下代码为对象redApple 分配内存(即创建该对象):
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_30.jpg?sign=1738836789-8BlkXpFw0dcjJ9E08OTGSe7Z7Jj55TyM-0-8821441cd7e74de30f8ac27c871c9d3e)
这相当于同时执行了对象声明和创建对象:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_31.jpg?sign=1738836789-7WFLHaEcvX0v1acLjO2id3E4pkMjxOmh-0-c41ea2e3495e727845f535a790fb814e)
4.3.4 对象的使用
在创建对象之后,不仅可以访问对象的成员变量,并改变成员变量的值,而且可以调用对象的成员方法。通过使用运算符 “.” 实现对成员变量的访问和成员方法的调用。
其语法格式如下:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_32.jpg?sign=1738836789-2XIqSgso6OyE9gU9jvmCA8VMSvEFwmoz-0-819a266366544bf7fa8333bcc0490557)
【例4.3】 定义一个类,创建该类的对象,同时改变对象的成员变量的值并调用该对象的成员方法。例如,创建一个名称为Round 的类,在该类中定义一个常量PI、一个成员变量r、一个不带参数的方法getArea() 和一个带参数的方法getCircumference()。Round类的具体代码如下:
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_33.jpg?sign=1738836789-yVqpCQo9SxvqVBIxe7Hu03SpvIHnQE7B-0-f3c24609ca5dec7128fa2b40115a1218)
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_34.jpg?sign=1738836789-UbdBKkFbWdlcCBtBcTcatHXKCPG8zAAz-0-7cc8097efe1a7f424fc4075cee0776e5)
程序运行结果如图4.7 所示。
![img](https://epubservercos.yuewen.com/06B79A/19471983008810406/epubprivate/OEBPS/Images/txt005_35.jpg?sign=1738836789-Fe4kxM4SuutJOL0K8kQtRFkW8CkCWnaz-0-06761364230e44b058916adc39c2190a)
图4.7 圆面积和圆周长的计算结果
4.3.5 对象的销毁
在许多程序设计语言中,需要手动释放对象所占用的内存,而在Java 中不需要手动完成这项工作。Java 提供的垃圾回收机制可以自动判断对象是否还在使用,并且能够自动销毁不再使用的对象,回收被销毁的对象所占用的资源。
Java 提供了一个名称为finalize() 的方法,用于在对象被垃圾回收机制销毁之前执行一些资源回收工作,并由垃圾回收系统调用。但是垃圾回收系统的运行是不可预测的。finalize() 方法没有任何参数和返回值,每个类有且只有一个finalize() 方法。