文章目录
- 学习目标
- 1.面向对象的初步认识
- 1.1认识面向对象
- 1.2 区分面向对象和面向过程
- 2.类当定义与使用
- 2.1认识简单类
- 2.2 类的定义格式
- 2.3 小试身手-定义类的小练习
- 3.类的实例化
- 3.1 什么是实例化
- 3.2 实例化注意事项:
- 3.3 类和对象说明
- 4. this 引用
- 4.1为什么要用this
- 4.2 this引用的特性
- 5. 对象的构造及初始化
- 5. 1 如何初始化对象
- 5.2 构造方法
- 5.2.1构造方法特性
- 5.2.2this 调用构造方法
- 5.3 默认初始化
- 总结
✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。
学习目标
本篇我们来了解Java中的类和对象,这里与C语言会有区别,我们不再注重过程,而倾向于对象。本篇将认识面向对象,类的定义,对象的实例化,成员方法和变量的使用,对象初始化过程等。文章可能有错误,如有发现,请在评论区指正,让我们一起交流,共同进步!
本文开始
1.面向对象的初步认识
1.1认识面向对象
Java介绍:
Java是一门纯面向对象的语言(ObjectOrientedProgram,简称OOP),在面向对象的世界里,一切皆为对象。
面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
1.2 区分面向对象和面向过程
面向过程:关注的是过程
对于实现一个程序,我们需要思考,怎么实现,需要准备变量,实现选择或者循环等操作。
例如冒泡排序,我们需要考虑一共需要交换几趟排序,每趟我们需要实现几次交换,在这之前还需要考虑设几个变量等等细节操作,与思考过程。
示例:洗衣过程,考虑过程,细节操作。
面向对象: 实体(对象)之间协作完成的
我们只需要对象之间的交互完成即可。不需要关系如何具体实现操作的过程,我们只需要调用对象方法即可;
例如:我们需要实现排序,我们只需要知道Arrays这个类里面有sort(排序)方法即可;排序方法直接使用,而不是像C语言一样一步步考虑细节,与过程;
示例:直接把衣服洗衣粉放入洗衣机即可,不用考虑过程。
2.类当定义与使用
2.1认识简单类
类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥)。
例如:电脑
属性:产品品牌,型号,产品重量,外观尺寸,颜色等
功能:上网,视频等
2.2 类的定义格式
在Java中定义类是需要用到class关键字,语法格式:
class: 为定义类的关键字,Test为类的名字,{ }中为了的主体
属性:描述类的成员
方法:类具有哪些功能
class Test {
filed;// 字段、属性、成员变量
method; // 行为 、成员方法
}
【注】类名采用大驼峰
面向对象第一步,学会定义类。
2.3 小试身手-定义类的小练习
定义一个学生类:
public class Student {
public String name;//学生的属性(成员变量)
public String gender;
public short age;
public void DoHomeWork() {//学生的行为(成员方法)
System.out.println("写作业!");
}
}
【注】
1.一般我们在一个文件中只定义一个类
2.mian方法所在的类一般使用public修饰(public class)
3.public 修饰的类必须与文件名相同
4.不用轻易修改public 修饰的类
3.类的实例化
3.1 什么是实例化
我们想要实例化对象,就需要获取对象,而获取对象就需要得到类,通过类来定义实例化。而用类类型创建对象的过程,称为类的实例化。
在java中采用new关键字,配合类名来实例化对象。
new Person =>new 的对象
【注】
1.new关键字用于创建一个对象的实例(每个对象都有自己的成员,通过引用访问成员)
2.使用点(.)来访问对象中的属性和方法
3.同一个类可以创建多个实例
4.类不占内存,代码片段先存放在方法区中(以后的文章会介绍)
3.2 实例化注意事项:
1.实例化对象赋值为null=>不指向任何对象
public static void main(String[] args) {
Person person = null;
//代表person 不指向任何对象
person.name = "zhang";//err
person.age = 12;//err
//person不指向任何对象无法引用
}
报错:
2.引用能不能指向引用?=》不能
引用只能 指向引用的对象,而不是指向引用
//引用指向引用的例子;
public static void main3(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
//引用不能指向引用=》说法错误
//引用person1可以指向引用person2所指向的对象 =>正确(引用一定指向对象,而不是指向引用)
person1 = person2;
}
3.一个引用能同时指向多个对象?=》不能
一个引用能指向多个对象?=》err;可以换对象但不能有多个对象
public static void main4(String[] args) {
Person person1 = new Person();//引用的地址
// Person person1 = new Person();
// Person person1 = new Person();
// Person person1 = new Person();
}
【注】
1.属性(成员变量)没有赋值不会报错,编译器会给他们默认值
引用类型:默认null;浮点型:0;Boolean:默认false
字符型:‘\u0000’
2.局部变量必须赋值,不负责编译器报错
3.3 类和对象说明
- 类只是一个模板,用来对一个实体进行描述,限定了类有哪些成员。
- 类是一种自定义的类型,可以用来定义变量 =》自己定义
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
- 类实例化出对象:现实中使用建筑设计图建造出房子。
类就像是设计图,但是并没有实体存在,类也只是一个设计。
实例化出的对象才能实际存储数据,占用物理空间如:盖好的房子。
4. this 引用
4.1为什么要用this
我们实例化对象,可能需要创建多个对象,例如创建三个对象,代码里面是如何区分而找到正确的对象呢? =》根据this,我们来看一下!
public class DateUtil {
public int year;
public int month;
public int day;
public void setDate(int y, int m, int d) {//利用方法,多个赋值,
// 如果new对象,给对象里面一个个赋值太麻烦
year = y;
month = m;
day = d;
}
public void show() {
System.out.println("年:" + year + " 月:" + month + " 日" + day);
}
//方法前面是那个引用,就调用那个对象的方法
public static void main(String[] args) {
DateUtil dateUtil = new DateUtil();
dateUtil.setDate(2022,11,9);
dateUtil.show();
DateUtil dateUtil2 = new DateUtil();
dateUtil2.setDate(2022,11,9);
dateUtil2.show();
DateUtil dateUtil3 = new DateUtil();
dateUtil3.setDate(2022,11,9);
dateUtil3.show();
}
}
上述代码看似正确,但存在问题!
问题1:出现形参名与成员变量名相同的情况
函数体中是谁给谁赋值?参数谁给谁?
//错误代码:
public void setDate1( int year, int month, int day) {//利用方法,多个赋值
//这里的year,month,day都是形参, 等号左边是局部变量 优先使用
//实例变量int默认0,相当于形参被默认的值赋值为0;(形参被默认值覆盖)
year = year;
month = month;
day = day;
}
为了防止这种情况出现,我们使用this关键字
代码改正:加上this:给当前对象的属性赋值
//this:访问成员变量
public void setDate1( int year, int month, int day) {//利用方法,多个赋值
//这里的year,month,day都是形参,加上this:来表示给当前的对象的属性赋值
this.year = year;
this.month = month;
this.day = day;
}
问题2:为什么this能精准找到对应的对象呢?
每个成员方法的第一参数默认是this => 隐藏的参数,可不写;this可根据谁引用方法,就会找到对应的引用对象
public void setDate(DateUtil this, int y, int m, int d) {//利用方法,多个赋值,
// 如果new对象,给对象里面一个个赋值太麻烦
year = y;
month = m;
day = d;
}
4.2 this引用的特性
this作用:this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。
一般this的三种用法:
①this.成员变量
②this.成员方法
③this(…)访问构造方法:且必须是构造方法的第一句
this引用的特性:
1.this的类型:当前对象的引用。谁(对象)调用就是谁对象的引用类型
2.在"成员方法"中,this只能引用当前对象,不能再引用其他对象(this只能在成员方法中使用)
3. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收(例如:public void setDate(DateUtil this, int y, int m, int d))
5. 对象的构造及初始化
5. 1 如何初始化对象
通过引用给变量赋值的方式对变量个数多的情况下就不适用了,此时我们可以使用构造方法,为多个变量赋值。
构造方法的作用:就是对对象中的成员进行初始化,并不负责给对象开辟空间。
实例化对象时,会调用 构造方法(下面介绍),此时我们可以直接在new 的对象中直接赋值。
例如:
DateUtil dateUtil = new DateUtil(2022,11,10);
5.2 构造方法
构造方法:特殊的成员方法:①没有返回值(不能设置void)②方法名和类名一样
5.2.1构造方法特性
构造方法:无参构造与有参构造
//构造方法可以重载
//无参数的构造方法
public DateUtil(){
//如果没有构造方法,java默认空构造方法
//可以写this.year =year;
}
//有3个参的构造方法,参数是任意的个数
public DateUtil( int y, int m, int d) {
this.year = year;
this.month = month;
this.day = day;
}
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
- 构造方法可以重载(根据自己的需求提供不同参数的构造方法);重载:名字相同,参数列表不同
- 用户没有定义有参的构造方法,编译器会默认生成无参构造方法;如果设置有参构造,编译器就不会有无参构造,想要再次使用必须自己构造无参方法。
5.2.2this 调用构造方法
this(…)必须是构造方法中第一条语句
this 不能调用静态的成员方法和属性
public DateUtil(){
this(2000,11,10);//调用当前对象的构造方法
//可以写this.year =year;
}
public void setDate( int year, int month, int day) {
this.year = year ;
this.month = month;
this.day = day;//访问当前对象的成员变量
this.show();//访问成员方法
}
this()调用构造方法:循环调用的错误示范
5.3 默认初始化
1.初始化分配空间:对象空间被申请好之后,对象中包含的成员已经设置好了初始值。
2.调用构造方法,给对象各个成员赋值。
3.声明变量是,直接给出初始值
总结
✨✨✨各位读友,本篇分享到内容是否让你认识了JAVA的类和对象,如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!