路虽远,行则将至;事虽难,做则必成。
主页:趋早——Step
专栏:JAVASE
gitte:https://gitee.com/good-thg
引言:
这篇文章我们只介绍前半部分,下一篇文章会介绍剩下的部分。
目录
- 一、面向对象
- 1、什么是面向对象
- 2、面向对象与面向过程
- 二、类定义和使用
- 1、认识类
- 2、类的定义格式
- 3、定义一个学生类
- 三、类的实例化
- 1、什么是实例化
- 注意事项:
- 2、类和对象的说明
- 四、this引用
- 1、为什么要有this引用
- 2、什么是this引用
- 3、this引用的特性
- (1)this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型;
- (2)this只能在“成员方法”中使用;
- (3)在“成员方法”中,this只能引用当前对象,不能引用其他对象;
- (4)this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法的引用传递给该成员方法,this负责来接收。
- 五、对象的构造和初始化
- 1、如何初始化对象
- 2、默认初始化
- 3、就地初始化
- 4、构造方法
- (1)概念
- (2)特性
- <1> 名字必须与类名相同
- <2> 没有返回值类型,设置为void也不行
- <3> 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
- <4> 构造方法可以重载
- <5> 如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
- <6> 在构造方法中,可以通过this调用其他构造方法来简化代码。
- <7> 绝大多数情况下使用public来修饰,特殊场景下会被private修饰。
一、面向对象
1、什么是面向对象
面向对象是一种编程范式,它将程序组织成对象的集合,每个对象都有自己的状态和行为。在面向对象的编程中,程序通过定义对象的属性和方法来描述问题的解决方案。对象可以通过与其他对象进行交互来实现特定的功能。面向对象的编程主要包括封装、继承和多态三个特性,通过这些特性可以使程序更加模块化、可维护和可复用。
我们学习的Java是一门纯面向对象的语言,在面向对象的世界里,一切皆为对象,面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来设计程序,更符合人们对事物的认知,对于大型程序的设计、扩展及维护都非常友好。
2、面向对象与面向过程
我们都知道曹操称象的故事吧!我们分别用面向对象和面向过程来讲述一下这个过程:
(1)面向过程:我们要准备一艘可以装的下大象的船,接着我们将大象赶到船上,然后乘坐另一艘小船,在水位处划一条线,再把大象从船上赶下来,我们继续在同一条船上搬石头,一块,两块…,直到船的水位下降到到我们之前划的线上,然后我们准备一个称,将船上的石头卸下来分批放到称上,并且记录每一批石头的重量,最后将所有数据全部相加,这时候就可以计算出大象的重量了。
(2)面向对象:把大象赶到船上(…),在船上放上石头(…),在称上放石头(…),得到大象重量。
通过这个故事,我们知道了面向过程是把事情分成一步一步的,然后按照步骤一步一步的做出来,而面向对象是给对象相应的方法,最后得出结果。以面向对象的方式来处理,就不用关心过程了,是通过对象之间的交互来完成的。
二、类定义和使用
1、认识类
类是用来对一个实体进行描述的,主要关注该实体具有哪些属性,哪些功能,描述完成以后计算机就可以识别出结果了。
2、类的定义格式
注意事项:
1、类名采用大驼峰定义;
2、成员前写法统一为public。
3、定义一个学生类
public class Student {
// 成员变量
public String name;
public int age;
// 成员方法
public void Exam(){
}
}
三、类的实例化
1、什么是实例化
定义了一个类,就相当于在计算机中定义了一种新的类型,与int,double类似,只不过int和double是Java语言自带的内置类型,而类是用户自定义了一个新的类型,比如上面定义的Student类。有了这些自定义类型之后,就可以使用这些类来定义实例。
用类类型创建对象的过程,称为类的实例化,在Java中采用new关键字,配合类名来实例化对象。
class Student {
public String name;
public int age;
public void Exam(){
System.out.println("考试......");
}
}
public class Test {
public static void main(String[] args) {
// 通过 new 实例化对象
Student student = new Student();
student.name = "Tom";
student.age = 12;
}
}
注意事项:
(1)new 关键字用于创建一个对象的实例;
(2)使用 . 来访问对象中的属性和方法;
(3)同一个类可以创建多个实例。
2、类和对象的说明
(1)类只是一个模型一样的东西,用来对一个实体进行描述,限定了有哪些成员;
(2)类是一种自定义的类型,可以用来定义变量;
(3)一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
四、this引用
1、为什么要有this引用
在这里,我们定义一个Date类来进行演示:
public class Date {
public int year;
public int month;
public int day;
// 设置日期
public void setDate(int y, int m, int d){
year = y;
month = m;
day = d;
}
// 打印日期
public void printDate(){
System.out.println(year + "年" + month + "月" + day + "日");
}
}
这个时候,我们该如何打印他们呢?看下面代码:
运行结果如下:
但是,如果我们不想这样一个一个进行赋值,而是一次性的赋值,该怎么办呢?
我们在上面的代码中,已经定义了setDate,所以,我们可以调用setDate来进行赋值。代码如下:
运行结果如下:
通过以上的两种方法,就可以进行赋值和打印了,然而,这跟this引用有什么关系呢?我们继续往下学习。
我们想想,现在我们的setDate是这样的:
假如说,我们把setDate改成下面这样:
在这个时候,到底是谁给谁赋值,到底设置的是哪个对象呢?
我们运行代码试试:
这是什么原因呢?
这是因为局部变量优先,是形参自己改自己赋值了,没有赋值到成员变量当中。
在这个时候,我们的this就派上用处了,他可以让他赋值到成员变量当中。我们看下一部分:
2、什么是this引用
我们将this加入到我们的setDate中:
我们将main方法中写成这样:
代码运行结果如下:
这个时候,我们有问题了:成员函数执行的时候,他是怎么知到打印的是哪个对象,设置的是哪个对象?
这就是this的作用,我们认为:
this引用指向当前对象
通俗来讲,谁调用setDate,谁就是当前对象。
这时候,我们就可以知道什么是this引用了
this引用指向当前对象,在成员方法中所有成员变量的操作,都是通过该引用去访问。
3、this引用的特性
(1)this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型;
(2)this只能在“成员方法”中使用;
(3)在“成员方法”中,this只能引用当前对象,不能引用其他对象;
(4)this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法的引用传递给该成员方法,this负责来接收。
接下来,我们把完整代码展示出来:
public class Date {
public int year;
public int month;
public int day;
// 设置日期
public void setDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
// 打印日期
public void printDate() {
System.out.println(this.year + "年" + this.month + "月" + this.day + "日");
}
public static void main(String[] args) {
Date date = new Date();
// 赋值
date.setDate(2024, 5, 24);
// 打印
date.printDate();
Date date1 = new Date();
date1.setDate(2023, 5, 24);
date1.printDate();
}
}
五、对象的构造和初始化
1、如何初始化对象
我们来看下面这个代码:
运行结果如下:
这是因为没有初始化报错,但是我们来看下面的代码:
运行一下:
我们发现,每次对象创建好之后,要调用setStudent才能设置具体姓名和年龄,这是很麻烦的,但是我们到底该如何初始化呢?我们继续学习:
2、默认初始化
我们同样来看下面的代码:
在这个代码中,我们初始化了吗?没有,但是他会报错吗?我们看运行结果:
没有,这是为什么呢?
哇,好多为什么,那就让我们继续回答这一个一个的问题吧!
在这里,就是因为发生了默认初始化,所以才不会报错。我们看到的只是程序层面简单的一条语句,但是,在JVM层面就需要做好多事情,下面简单介绍:
(1)检测对象对应的类是否加载了,如果没有加载则加载;
(2)为对象分配内存空间;
(3)处理并发问题;
(4)初始化所分配的空间
就是对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:
在这里,我们暂时知道这是默认初始化就好,至于为什么,我们可以后期学习。
3、就地初始化
就地初始化就是在声明成员变量时,就直接给出了初始值。
我们看代码:
这样运行会是什么结果呢?我们运行试试:
这就是我们的就地初始化,需要注意的是:代码编译完成后,编译器会将所有给初始化的这些语句添加到各个构造函数中。
4、构造方法
在我们学习了以上两种初始化方法,我们再来学习另一种初始化方法,叫做构造方法。
(1)概念
构造方法(也称构造器)是一个特殊的成员方法,这个方法没有返回值,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的声明周期内只调用一次。
现在问题来了,我们该怎么调用该构造方法呢?我们看下面的代码并且运行:
运行结果如下:
这是什么原因呢?我们将main方法改成如下这样:
运行结果如下:
我们再来调用带两个参数的构造方法:
将main方法写为这样:
运行结果如下:
所以我们认为:当构造方法调用完成之后,对象实际上才产生了。
其实我们还需要知道,当没有提供任何构造方法的时候,编译器会默认提供一个不带参数的构造方法,但是当我们有构造方法提供的时候,编译器就不会提供了。
(2)特性
<1> 名字必须与类名相同
<2> 没有返回值类型,设置为void也不行
<3> 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
<4> 构造方法可以重载
<5> 如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
<6> 在构造方法中,可以通过this调用其他构造方法来简化代码。
运行结构如下:
我们还要注意一点,this不能形成环。看下面代码:
<7> 绝大多数情况下使用public来修饰,特殊场景下会被private修饰。
好的,JAVASE第一部分到此就结束了,让我们期待下一篇吧!