目录
🐱💻前言:
🤔本章节将从Java中面向过程和面向对象开始介绍,又浅到深介绍类和对象。本章节涉及知识稍多,将拆分成几个小章节介绍。
本节目标:
1、面向过程和面向对象的抽象理解
2、掌握类的定义方式以及对象的实例化
一、面向对象和面向过程的初步认识
1、💥什么是面向对象
Java是一门纯面向对象的语言(Object Oriented Program,OOP),在面向对象的世界里,一切皆为对象。💥【OOP这个词稍微了解一下,别连这个词都不认识!】💥
【注意】:不是说面向对象的只有Java这一门语言,其他语言也有一些有面向对象!
面向对象是解决问题的一种思想,说到底也就是对象和对象之间进行交互的一个过程。用面向对象的思想来涉及程序,更符合人 们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。
2、💥什么是面向过程
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。就是分析出解决问题所需要的步骤,然后用方法把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
说白了,就是对一个问题进行分析后的步骤进行细分,然后一步步实现这些步骤,最终解决该问题。
3、💥面向对象和面向过程的区别
我们可以抽象理解一下面向对象和面向过程。
以日常生活的一些事例作为例子:
比如生活中我们洗衣服,(1)如果选择自己洗的过程,而这个过程我们会进行很多个步骤,如:拿个盆子、接水、放衣服、放洗衣液、揉洗、换水、漂净、拧干、晾晒。
这便是一个正常手洗衣服的过程,任何一个步骤都不能缺失。按照该种方式来写代码,将来扩展或者维护起来会比较麻烦。
(2)如果以面向对象的方式对洗衣服这个过程进行处理,我们不必如手洗的过程麻烦,也就无需关注洗衣服的过程。通过洗衣机我们可以很方便的完成这件事,期间洗衣机如何清洗衣服,我们是不必关心的。
而在用洗衣机洗的过程中,只有四个对象:自己、衣服、洗衣机、洗衣服。这个过程是对象和对象之间相互交互的过程。
【注意】:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。
二、类的定义和使用
1、💥初识“类”
所谓“类”,是一种比较抽象的东西,也是一种自定义类型。实体事物都是从一个,“类”抽象出来的,类中会包含该实体事物的属性,特征,使用方法,应用方法等等。通过“类”,来对一个具体的对象进行描述,描述该实体所具备的属性,方法。
“类”的实质是一种引用数据类型,类似于byte、int、short、(char)long、float、double 等基本数据类型,不同的是它是一种复杂的数据类型。
以上述洗衣机为例:
面相对象程序设计关注的是对象,而对象是现实生活中的实体 。洗衣机是一个总的汇称,不同的洗衣机其参数和功能也有所不同,对洗衣机的描述,该描述过程也就是对洗衣机这个实体对象进行抽象,但是这些抽象结果计算机并不能识别出来,开发人员可以采用某种面相对象的编程语言来进行具体地描述,比如:Java语 言。
2、💥类的定义格式
在java中定义类时需要用到class关键字,具体语法如下:
// 创建类 class ClassName{ field; // 字段(属性) 或者 成员变量 method; // 行为 或者 成员方法 }
class为定义类的关键字,ClassName为类的名字,{ }中为类的主体。
“类”中的属性主要用来描述类的,而“类”中的内容称为“类”的成员,因此“类”的属性又可以被称为“成员变量”,“类”内的方法主要用来说明该“类”所具有的功能,又被称为“成员方法”。
以下是以人作为类创建代码示例:
class People { public String name; //名字 public int age; //年龄 public String sex; //性别 public void sleep(){ System.out.println("睡觉!"); } public void eat(){ System.out.println("吃饭!"); } }
采用Java语言将人这个类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以 识别了。
【注意】:
- 类名采用大驼峰形式命名
- main方法所在的类一般要使用public修饰
- 一般类前不加public,一个Java文件建议最多一个public修饰的类(一般一个文件当中只定义一个类)。public修饰的类名和和文件名是一样的。【在Java中,一个源文件只能有一个public类,这是因为Java编译器需要将每个类编译为单独的.class文件,并且需要使用public类的名称作为文件名。如果有多个public类,编译器将无法确定哪个类应该用于文件名。】
- 如果想更改文件名(public 修饰的类名),不建议直接修改。可以通过集成开发工具内部功能修改,如下:
🤔但如果一个程序里面有多个类的话,编译器是识别不出你是要具体更改哪个类,只会改变文件名,代码内的public修饰的类需要自己手动修改。
3、💥类的实例化
3.1、什么是类的实例化
💥定义了一个类,就相当于在计算机中定义了一种新的类型。“类”相当于是用户自己定义的一个新类型,虽然与int、short、float等类型相似(但都是java语言内置的数据类型)。比如我们自己定义一个Person类或Student类,有了这些自定义类型,就可以用这些类来实例化对象。
代码示例:
class Student{ //字段(成员变量/属性) public String name; //学生名字 public int age; //学生年龄 public String sex; //学生性别 public int score; //学生分数 //行为(成员方法) public void setStudent(String Myname,int Myage){ Myname=name; Myage=age; } public void show(){ //打印学生情况 System.out.println("学生姓名:"+name+" "+"年龄:"+age);// } } public class File { public static void main(String[] args) { //实例化对象 Student student=new Student(); Student student1=new Student(); Student student2=new Student(); student.setStudent("某某",20); student.show(); } }
打印结果:
【注意】 :
- 通过new关键字实例化对象( 语法格式【类名】+“.”=new 【类名】(); )
- 同一个类可以实例化多个对象
- 可以通过引用变量名加"."访问对象。
3.2、“类”和对象的说明
1、关于“类”和对象如果还是难以理解是什么样东西,我们不妨可以想象以下。
“类”其实只是一个我们脑中假设的一个虚拟的东西,也可以想象成是一张图纸,一张上面描述着某种东西的属性、规格、功能等等。但着张图纸里的东西始终只是一个虚拟的,不是真正一个实体,那么当我们利用这张图纸(“类”),制造出一种实体的东西,也就是利用“类”实例化出一个具体的对象。做个比方。类实例化出对象就像现实中使用建筑图纸建造出房子。
2 、类只是一个模型一样的东西,用来对一个实体进行描述,限定了类有哪些成员.
3、类是一种自定义的类型,可以用来定义变量,但是在java中用类定义出来的变量为对象.
4、 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。
5、只要new了就会给这个对象在堆上分配一块内存。
以下面代码为例:
class Student{ public String name; public int age; public String sex; public int score; public void show(){ System.out.println("Hello!"); } } public class File { public static void main(String[] args) { //实例化对象 Student student=new Student(); student.show(); } }
三、this引用
1、💥为什么要有this引用
下面以一个代码作为例子:
class Student{ public String name; public int age; public String sex; public int score; public void setStudent(String Myname,int Myage){ Myname=name; Myage=age; } public void show(Student this){ System.out.println("学生姓名:"+name+" "+"年龄:"+age); } } public class File { public static void main(String[] args) { Student student=new Student(); student.setStudent("某某",20); student.show(); } }
该代码通过new关键字实例化一个student对象,然后对对象进行访问(赋值,打印),代码整体逻辑非常简单,没有任何问题。
以下提出一个疑问:
🤔如果我们在类中一个方法的形参跟方法内的成员变量名一样(变量名冲突),是否还能对成员变量进行正常的赋值❓
答案当然是不可以的!因为当我们这么做后,该成员方法内的局部变量名会默认为都是其形参的变量名(形参和局部变量名一致)。这种情况下,是无法访问到当前对象的成员变量,当然也无法对其赋值。
这时候通过this引用可以解决这种情况!
2、💥什么是this引用?
java编译器给每个“成员方法“增加了一个隐藏的引用类型参数(其this的类型为当前”类“的类型),该引用参数指向当前对象(成员方法运行时调用该 成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明 的,即用户不需要来传递,编译器自动完成。
回顾第二章的内容中,Java中的数据类型是基本数据类型和引用数据类型两种,而引用数据类型中包含了Stirng、接口、类、枚举、数组。
【注意】:this是当前对象的引用!
代码示例:
class Student{ public String name; public int age; public String sex; public int score; public void setStudent(String name,int age){ this.name=name; this.age=age; } public void show(){ System.out.println("学生姓名:"+this.name+" "+"年龄:"+this.age); } } public class File { public static void main(String[] args) { Student student=new Student(); student.setStudent("某某",20); student.show(); } }
this引用是编译器自动添加的,用户在实现代码时一般不需要显式给出
🤔当我们实例化多个对象,并调用对象中的成员方法, 但是这两个方法中没有任何有关对象的说明方法如何知道打印的是那个对象的数据❓
class Student{ public String name; public int age; public String sex; public int score; public void setStudent(String name,int age){ this.name=name; this.age=age; } public void show(){ System.out.println("学生姓名:"+this.name+" "+"年龄:"+this.age); } } public class File { public static void main(String[] args) { Student student1=new Student(); student1.setStudent("某某",20); Student student2=new Student(); student1.show(); student2.show(); } }
我们知道this是当前对象的引用,当我们每次想要访问一个对象的内部时,我们会通过对象名去访问其方法或属性,在方法内部每一次调用其方法,都会将当前对象的地址传给this引用,this便可通过地址去访问当前对象内的成员变量。
3、💥this引用的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型。
2. this只能在"成员方法"中使用。
3.this是当前对象的引用!
4. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性。
【什么是final属性,即这个变量被final修饰是不可以进行修改的,具有常量的属性。】
5. this本质来说是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收。(this的类型是当前的”类“类型)
6、this不能写成闭环的形式。(什么是闭环?闭环就是利用this()调用构造方法时,在一个构造方法里调用另一个构造方法,而另一个构造方法中又调用了第一个构造方法,导致两个构造方法反复横跳。)【下一章节将会提及构造方法的应用!】
我们也可以从字节码层面来观察其this的引用。
通过IDEA中的jclass插件(jclasslib Bytecode Viewer)可以进行观察.
🤔那插件要如何下载呢❓
搜索后进行安装,之后在视图栏中打开即可查看。
在main方法的字节码中,是aload_1在传递this。
以上的字节码内容只做了解,不用太过纠结。
4、💥this引用总结
【总结】:
- this是代表当前对象的引用;
- 利用this可以避免成员变量和形参名冲突;
- 我们应该习惯用this引用(即使变量名和形参名不冲突,也建议使用),防止出现不必要的错误;
- this.+成员变量(访问成员变量)-------this.+方法名()(访问成员方法)---------this()(调用构造方法)【后续将对其讲解】
🤔【思考】:
this可以为空吗?🐱🏍🐱🏍🐱🏍
不可以!我们使用this的时候是在类的方法里使用的,this是当前对调用实例方法的对象的引用,或者是对正在构造的对象的引用。你要使用this,就必须有实例化一个对象,类中的this就是指向你实例化的这个对象。如果你把this置为空(null),也就让this不指向任何一个对象了,因此this不可以为空!