理解类和对象

简介: 理解类和对象

一、面向对象的初步认识

       我们在学习Java语言前,我们就明白Java是面向对象的编程语言。那么,我们该如何理解面向对象呢?

       大家可这样理解:在以前科技不发达的时候,我们洗衣服是不是要亲力亲为,首先要打水,那盆,放衣服,放洗衣粉,搓洗等等。这中间少了一个环节都不行。但是,面向对象,你可以理解为到了现代,科技发展迅速,有了洗衣机,我们洗衣服时,不必像之前一样亲力亲为,只需采取以下步骤即可:把衣服放入洗衣机里,加入洗衣粉,启动洗衣机即可。

       以前洗衣服可以看做面向过程编程,现在洗衣服可看作面向对象编程。面向对象编程的特点为:不理会过程如何实现,只用找到能实现的东西即可(也就是你现在是老大,要办一件事,只需找到最适合做这件事的小弟,给他下命令,人家会为你办事)。

       注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。

二、类

       什么是类?类可以理解为:说明书。里面包含了最基本的属性。例如:洗衣机说明书里会包含:尺寸,大小,颜色,型号等等。使我们来了解这个产品。

       2.1 语法格式

       了解完什么是类,接下来我们要明白,类是怎么定义的。具体语法如下:

1. // 创建类
2. class ClassName{
3.     field; // 字段(属性) 或者 成员变量
4.     method; // 行为 或者 成员方法
5. }

       class为定义类的关键字,ClassName为类的名字,{}中为类的主体。

       类中包含的内容称为类的成员。

       属性主要是用来描述类的,称之为类的成员属性或者类成员变量。

       方法主要说明类 具有哪些功能,称为类的成员方法。

       我们来试一试定义狗这个类:

1. public class dog {
2. public String name;//名字
3. public String color;//颜色
4. // 狗的属性
5. public void barks() {
6.         System.out.println(name + ": 旺旺旺~~~");
7.     }
8. // 狗的行为
9. public void wag() {
10.         System.out.println(name + ": 摇尾巴~~~");
11.     }
12. }

        注意:

      1. 一般一个文件当中只定义一个类

       2. main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)

       3. public修饰的类必须要和文件名相同

       2.2 类的实例化

       在我们定义了一个类后,就相当与在C语言定义了一个类型,用类的类型创建对象的过程,称为类的实例化。如下:

1. class dog {
2. public String name;//名字
3. public String color;//颜色
4. // 狗的属性
5. public void barks() {
6.         System.out.println(name + ": 旺旺旺~~~");
7.     }
8. // 狗的行为
9. public void wag() {
10.         System.out.println(name + ": 摇尾巴~~~");
11.     }
12. }
13. public class Main {
14. public static void main(String[] args) {
15. dog dog = new dog();
16.     dog.name = "小明";
17.     dog.color = "黄";
18.     dog.barks();
19.     dog.wag();
20. 
21.     }
22. }

       注意事项:

       new 关键字用于创建一个对象的实例

       使用 . 来访问对象中的属性和方法

       同一个类可以创建对个实例

2.3 类和对象的联系

       在面向对象编程中,类(Class)和对象(Object)是密切相关的概念,它们之间有以下关系:

       类是对象的模板:类是用于创建对象的模板或蓝图。它定义了对象的属性和行为,描述了对象的结构和功能。

       对象是类的实例:对象是根据类定义创建的实体。通过实例化类,可以在内存中创建一个对象。对象具体化了类的属性和行为,拥有自己的状态和行为。

       类是对象的类型:类确定了对象的类型。对象属于某个类的实例,继承了类的属性和行为,并遵循类的定义。

       对象具有独立性:每个对象都是独立的实体,它们可以有自己的状态(成员变量的值)和行为(成员方法的调用)。对象之间相互独立,拥有各自的内存空间。

       类提供了对象的创建和访问方式:类定义了对象的属性和行为,并提供了对象的创建和访问方式。通过类,可以创建对象的实例,并使用对象调用类的成员变量和成员方法。

       对象是类的多个实例:一个类可以创建多个对象实例,每个实例都是类的独立副本。每个对象都可以拥有不同的状态和行为,但遵循同一个类的定义。

       简单来说,类是对象的模板和类型,描述了对象的结构和行为。对象是类的实例,具体化了类的属性和行为,拥有独立的状态和行为。通过类,可以创建多个对象的实例,并对每个对象进行操作和访问。

三、this引用

       我们为什么要有this引用?来看一个简单的例子:

1. public class Date {
2. public int year;
3. public int month;
4. public int day;
5. public void setDay(int y, int m, int d){
6.         year = y;
7.         month = m;
8.         day = d;
9.     }
10. public void printDate(){
11.         System.out.println(year + "/" + month + "/" + day);
12.     }
13. public class Main {
14. public static void main(String[] args) {
15. 
16. Date D1 = new Date();
17. Date D2 = new Date();
18.     D1.setDay(2024,5,18);
19.     D2.setDay(2024,5,19);
20.     D1.printDate();
21.     D2.printDate();
22.     }
23. }

        这个例子很简单,但细看之下又会有以下问题:两个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和 printDate函数如何知道打印的是那个对象的数据呢?

       别担心,一切交给this吧!

       3.1 什么是this引用

       this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该 引用去访问。

1. public class Date {
2. public int year;
3. public int month;
4. public int day;
5. public void setDay(int year, int month, int day){
6. this.year = year;
7. this.month = month;
8. this.day = day;
9.     }
10. public void printDate(){
11.         System.out.println(this.year + "/" + this.month + "/" + this.day);
12.     }
13. }

       注意:this引用的是调用成员方法的对象。

       3.2 this引用的特性

       1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

       2. this只能在"成员方法"中使用

       3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象

四、对象

       4.1 如何初始化对象

               我们在学习编程语言时都明白,创建了一个变量就要对其初始化,你创建了一个对象,也应该对其初始化,如下:

1. public static void main(String[] args) {
2. Date d = new Date();
3.     d.printDate();
4.     d.setDate(2021,6,9);
5.     d.printDate();
6. }

       4.2 构造方法

               构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且 在整个对象的生命周期内只调用一次。

1. public class Date {
2. public int year;
3. public int month;
4. public int day;
5. // 构造方法:
6. // 名字与类名相同,没有返回值类型,设置为void也不行
7. // 一般情况下使用public修饰
8. // 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
9. public Date(int year, int month, int day){
10. this.year = year;
11. this.month = month;
12. this.day = day;
13.     System.out.println("Date(int,int,int)方法被调用了");
14. }
15. public void printDate(){
16.         System.out.println(year + "-" + month + "-" + day);
17.     }
18. public static void main(String[] args) {
19. // 此处创建了一个Date类型的对象,并没有显式调用构造方法
20. Date d = new Date(2021,6,9); // 输出Date(int,int,int)方法被调用了
21.         d.printDate(); // 2021-6-9
22.     }
23. }

       特性:

       1. 名字必须与类名相同

       2. 没有返回值类型,设置为void也不行

       3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)

       4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

       5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。

       6. 构造方法中,可以通过this调用其他构造方法来简化代码.

       4.3 默认初始化

       为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:Date date = new Date();

       原来,对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

       这就是默认初始化。

       4.4 就地初始化

       在声明成员变量时,也可以直接对成员变量赋初始值,成为就地初始化,如下:

1. public class Date {
2. public int year = 1900;
3. public int month = 1;
4. public int day = 1;
5. public Date(){
6.     }
7. public Date(int year, int month, int day) {
8.     }
9. public static void main(String[] args) {
10. Date d1 = new Date(2021,6,9);
11. Date d2 = new Date();
12.     }
13. }

       这就是就地初始化。

       好了本次学习到这里就结束了,希望能有所帮助。

完!

相关文章
|
9月前
|
安全 生物认证 网络安全
windows10无法设置默认保存位置怎么办?显示错误代码0x80070002怎么解决?
Win10系统下载文件时,默认会保存在特定位置,但用户可自行修改。若更改后仍无效,可通过删除目标磁盘中的特定文件夹、修改注册表权限、“干净启动”排除干扰软件或使用第三方修复工具等方式解决此问题。
1521 0
|
6月前
|
传感器 机器学习/深度学习 数据采集
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
448 0
|
8月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
648 0
|
机器学习/深度学习 计算机视觉
《深度剖析:残差连接如何攻克深度卷积神经网络的梯度与退化难题》
残差连接通过引入“短路”连接,解决了深度卷积神经网络(CNN)中随层数增加而出现的梯度消失和退化问题。它使网络学习输入与输出之间的残差,而非直接映射,从而加速训练、提高性能,并允许网络学习更复杂的特征。这一设计显著提升了深度学习在图像识别等领域的应用效果。
767 13
|
存储 C语言
一级指针和二级指针的区别
一级指针和二级指针的区别
467 1
|
缓存 网络协议 Linux
通过实验深入了解 TCP 连接的建立和关闭
TCP/IP 这个主题很多文章比较陈旧,且以讹传讹的东西太多,所以本文作者结合了理论和实践去写,旨在通过一系列实验帮助读者深入理解 TCP 连接的建立过程。
615 13
|
运维 Cloud Native Java
热联集团:从 APISIX 迁移到云原生网关
我们将核心业务系统从 IDC 全栈迁移到阿里云后,并采用了云原生 API 网关,通过其独有的软硬一体的加速方案,相比普通 HTTPS 请求 TLS 握手时延降低一倍,极限 QPS 提升 80% 以上,运维效率也提升了 50%,此外,我们把 Nacos 迁移到 MSE Nacos,稳定性、性能和运维成本等方面都具备了明显的优势。
|
安全 搜索推荐 Android开发
安卓与iOS:两大操作系统的比较
本文将深入探讨安卓和iOS两大操作系统的差异,包括它们的设计理念、用户界面、应用生态以及安全性等方面。通过对比分析,我们可以更好地理解这两个系统各自的优势和不足,从而为用户在选择手机时提供一些参考。
|
设计模式 算法 数据可视化
分析大型软件系统的经典方法
【6月更文挑战第19天】本文介绍ATAM(架构权衡分析方法)是一种评估大型软件系统架构的工具,着重考虑性能、可用性、安全性和可修改性等质量属性的交互。ATAM提供了一种结构化方法,确保在设计早期就能理解和平衡各种质量属性,以优化系统整体性能。
1126 2
分析大型软件系统的经典方法
|
数据可视化
R语言用igraph绘制网络图可视化
R语言用igraph绘制网络图可视化