前言:
不知道大家有没有将java方法的使用熟记入心呢?如果没有的话,可以打开博主的上一篇博文阅读哦,在这里谢谢大家一路的陪伴。也希望我的内容能够帮到你更快的掌握java语言的学习。接下来我们要讲的是java类和对象。让我们整理一下心情开冲吧,加油,兄弟们!!!!
本期目录:
1.
面向对象的初步认知
2.
类定义和使用
3.
类的实例化
4.this的使用
1. 面向对象的初步认知
1.1 什么是面向对象
Java
是一门纯面向对象的语言
(Object Oriented Program
,简称
OOP)
,在面向对象的世界里,一切皆为对象。
面
向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情
。用面向对象的思想来涉及程序,更符合人
们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
1.2 面向对象与面向过程
1.
例如传统洗衣服过程:
传统的方式:
注重的是洗衣服的过程
,少了一个环节可能都不行。
而且不同衣服洗的方式,时间长度,拧干方式都不同,处理起来就比较麻烦。如果将来要洗鞋子,那就是另一种放方式。
按照该种方式来写代码,将来
扩展或者维护起来会比较麻烦
。
2.
现代洗衣服过程
以
面向对象方式来进行处理,就不关注洗衣服的过程
,具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关
心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,
通过对象之间的交互来完成的
。
注意:
面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。
2. 类定义和使用
2.1 简单认识类
类是用来对一个实体
(
对象
)
来进行描述的
,主要描述该实体
(
对象
)
具有哪些属性
(
外观尺寸等
)
,哪些功能
(
用来干啥
)
,描述完成后计算机就可以识别了。
2.2 类的定义格式
类是一种用户自定义的数据类型,它描述了一组具有相同属性和行为的对象。通常,类的定义包括以下几个部分:
- 类名:用于标识这个类,应该具有描述性且符合命名规范。
- 属性:也称为成员变量,描述了类的状态。例如,在一个 “学生” 类中,属性可能包括姓名、年龄、学号等。
- 方法:也称为成员函数,描述了类的行为。例如,在 “学生” 类中,方法可能包括学习、考试考试、参加活动等
在
java
中定义类时需要用到
class
关键字
,具体语法如下
//
创建类
class
ClassName
{
filed
//字段(属性)或者成员变量
method
;
//
行为 或者 成员方法
}
其中class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。
采用
Java
语言将洗衣机类在计算机中定义完成,经过
javac
编译之后形成
.class
文件,在
JVM
的基础上计算机就可以识别了。
注意事项
1.类名注意采用大驼峰定义
2.成员前写法统一为
public
3.此处写的方法不带
static
关键字
2.3 类的练习
2.3.1
定义一个狗类
要求:要有狗的名字,和狗的毛发颜色 以及狗的日常行为
2.3.2
定义一个学生类
注意事项:
1.
一般一个文件当中只定义一个类
2. main
方法所在的类一般要使用
public
修饰
(
注意:
Eclipse
默认会在
public
修饰的类中找
main
方法
)
3. public
修饰的类必须要和文件名相同
4.
不要轻易去修改
public
修饰的类的名称,如果要修改,通过开发工具修改
(
给同学演示
)
。
3. 类的实例化
3.1 什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型
,与
int
,
double
类似,只不过
int
和
double
是
java
语言自带的内置类型,而类是用户自定义了一个新的类型,比如上述的:
PetDog
类和
Student
类。它们都是类
(
一种新定
义的类型
)
有了这些自定义的类型之后,就可以使用这些类来定义实例
(
或者称为对象
)
。
用类类型创建对象的过程,称为类的实例化
,在
java
中采用
new
关键字,配合类名来实例化对象。
注意事项 :
1.new
关键字用于创建一个对象的实例
.
2.使用
.
来访问对象中的属性和方法
.
3.同一个类可以创建对个实例
.
3.2 类和对象的说明
1.
类只是
一个
模型
一样的东西,用来对一个实体进行描述,限定了类有哪些成员
.
2.
类是一种自定义的类型
,可以用来定义变量
.
3.
一个类可以实例化出多个对象,
实例化出的对象 占用实际的物理空间,存储类成员变量
4.
做个比方。
类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图
,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空
间。
4. this引用
4.1 为什么要有this引用
以上代码定义了一个日期类,然后
main
方法中创建了三个对象,并通过
Date
类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。
但是细思之下有以下两个疑问:
1.
形参名不小心与成员变量名相同
:
public
void
setDay
(
int
year
,
int
month
,
int
day
){
year
=
year
;
month
=
month
;
day
=
day
;
}
那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。
2.
三个对象都在调用
setDate
和
printDate
函数,但是这两个函数中没有任何有关对象的说明,
setDate
和printDate
函数如何知道打印的是那个对象的数据呢
?
一切让this引用来揭开这层神秘的面纱。
4.2 this的讲解
1.区分成员变量与方法参数或局部变量
当方法的参数或局部名称变量与该类的成员变量相同(即命名冲突)时,this
可以用来区分它们。没有this
时,方法内的局部变量和参数会覆盖同名的成员变量,从而导致难以访问成员变量
在这个例子中,this.name
显式指代当前对象的成员变量,而name
单独出现时指的是方法的参数。如果没有this
存在,代码将无法区分这两个变量,成员变量name
可能无法正确赋值。
2.在构造方法中调用另一个构造方法
this()
用于同一类的构造方法之间相互调用。设计模式称为构造器链,它允许开发者通过调用这种其他构造函数来简化代码,提高代码复用性。
这里通过使用this(name, 0)
,避免了重复编写初始化逻辑。如果没有this
,开发者必须手动将重复的代码写入在每个构造函数中。
3.方法链调用
this
可以在方法中返回当前对象的引用,用于实现链式调用(方法链接)。这种设计使得多个操作可以在一条语句中连续执行,简化代码的调用并增强了可执行性。
如果没有this
,链式调用将无法实现,每次操作都需要单独调用,增加代码。
4.在内部类中引用外部类实例
当你使用内部类时,this
指代的是当前内部类的对象。如果需要从内部类中访问外部类的对象,可以通过来外部类名.this
显式引用外部类对象。没有this
,访问外部类成员的逻辑会变得复杂。
如果没有OuterClass.this
这个机制,内部类将无法直接访问外部类的成员。
5.引用当前对象,防止隐藏当前对象
当方法内部需要引用当前对象时,this
可以显式指代当前对象,避免对象引用被隐藏的情况。它使得代码更加明确,确保在复杂的上下文中正确操作当前对象的实例。
在上面的例子中,this
指代当前对象的引用,可以帮助理解当前对象的操作上下文。
总结
this
的主要存在是为了解决以下问题:
- 避免命名冲突:帮助区分方法的局部变量或参数与类的成员变量。
- 构造器链:使构造函数能够相互调用,简化代码结构。
- 链式调用:允许多种方法连续调用,简化操作。
- 内部类与外部类的引用:显式区分内部类与外部类的实例。
- 显式当前对象引用:防止代码中当前对象时的不一致,引入引用性和维护性。
4.3 this引用的特性
1. this
的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this
只能在"成员方法"
中使用
3.
在
"
成员方法
"
中,
this只能引用当前对象,不能再引用其他对象
4. this
是
“
成员方法
”
第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法
对象的引用传递给该成员方法,
this
负责来接收
在代码层面来简单演示
--->
注意:下图右侧中的
Date
类也是可以通过编译的
5. 对象的构造及初始化
5.1 如何初始化对象
通过前面知识点的学习知道,在
Java
方法内部定义一个局部变量时,必须要初始化,否则会编译失败。
由上我们可以看出如果没有定义a的值,则会编译失败。
要让上述代码通过编译,非常简单,只需在正式使用
a
之前,给
a
设置一个初始值即可。如果是对象:
需要调用之前写的
SetDate
方法才可以将具体的日期设置到对象中。
通过上述例子发现两个问题:
1.
每次对象创建好后调用
SetDate
方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?
5.2 构造方法
5.2.1 概念
构造方法
(
也称为构造器
)
是一个特殊的成员方法,
名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次
。
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
5.2.2 特性
1.
名字必须与类名相同
2.
没有返回值类型,设置为void也不行
3.
创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
(
相当于人的出生,每个人只能出生一次
)
4.
构造方法可以重载
(
用户根据自己的需求提供不同参数的构造方法
)
上述两个构造方法:名字相同,参数列表不同,因此构成了方法重载。
5.
如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
上述
Date
类中,没有定义任何构造方法,编译器会默认生成一个不带参数的构造方法。
注意:
一旦用户定义,编译器则不再生成。
6.
构造方法中,可以通过
this
调用其他构造方法来简化代码
注意:
1.this(...)
必须是构造方法中第一条语句
2.不能形成环
7.
绝大多数情况下使用
public
来修饰,特殊场景下会被
private
修饰
(
后序讲单例模式时会遇到
)
5.3 默认初始化
在上文中提出的第二个问题:为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
要搞清楚这个过程,就需要知道
new
关键字背后所发生的一些事情:
Date d
=
new
Date
(
2021
,
6
,
9
);
在程序层面只是简单的一条语句,在JVM
层面需要做好多事情,下面简单介绍下:
1.
检测对象对应的类是否加载了,如果没有加载则加载
2.
为对象分配内存空间
3.
处理并发安全问题
比如:多个线程同时申请对象,
JVM
要保证给对象分配的空间不冲突
4.
初始化所分配的空间
即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
5.
设置对象头信息
(
关于对象内存模型后面会介绍
)
6.
调用构造方法,给对象中各个成员赋值
5.4 就地初始化
在声明成员变量时,就直接给出了初始值。
注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中
结语:
在 Java 的世界里,类与对象就像是构建宏伟程序大厦的基石。
类,是蓝图,是模板,它定义了一种事物的属性和行为规范。通过精心设计的类,我们可以将现实世界中的各种概念和实体抽象出来,转化为代码中的可操作对象。它为我们提供了一种组织和管理代码的方式,使得程序更加清晰、易于维护和扩展。
对象,则是类的具体实例,是真实存在于程序运行时的实体。每个对象都拥有自己独立的状态和行为,可以与其他对象相互交互,共同完成复杂的任务。对象的存在让我们能够在程序中模拟现实世界的各种情况,创造出丰富多彩的应用场景。
当我们深入理解和熟练运用类与对象时,就像是掌握了一把强大的魔法钥匙,可以打开通往高效编程和创新解决方案的大门。无论是开发小型的工具软件,还是构建庞大的企业级应用系统,类与对象都是我们最可靠的伙伴。
在未来的编程旅程中,让我们继续探索类与对象的奥秘,不断提升我们的编程技能,创造出更加精彩的软件世界。