目录
小伙伴们好鸭,我又来了!这次给大家带来的是类和对象,希望对大家有所帮助。
在讲什么是类和对象之前,首先先给各位小萌新打个预防针。类和对象这部分的内容比较抽象难懂,看不懂很正常,但是不要因为看不懂这部分内容就停止继续往前学习,一直停留在这个部分。因为只有一直往前学习,才能在后面的内容中感受到真正的面向对象是什么意思。
面向对象和面向过程
在具体讲面向对象和面向过程之前,首先要知道的是面向对象和面向过程是两个不同解决问题的思想,而不是具体解决问题的方法。而我们是在这两种思想的指导下对代码进行组织。
面向过程:注重执行过程,将事件的实现分成多个步骤,一个个执行。
面向对象:隐藏事件的执行步骤,关注在这个过程中执行事件的对象。在面向对象中,我们不需要像面向过程一样关注具体细节,我们只需要关注各个对象之间的交互。
例子:洗衣服
面向过程:
- 收拾脏衣服
- 将脏衣服放到盆子里
- 放水
- 放洗衣液
- 搓衣服
- 洗去泡沫
- 换水
- 搓衣服
- 拧干
- 晾晒
面向对象:
在洗衣服事件中涉及到的对象有:
- 洗衣机
- 洗衣服的人
- 洗衣粉
- 衣服
洗衣服的人只需要把衣服和洗衣粉放到洗衣机就好,我们隐藏了执行步骤3456789,将这些步骤放在对象中,让对象去执行这些隐藏步骤就好,我们不care。
以面向对象方式来进行洗衣服,就不关注洗衣服的过程,具体洗衣机是怎么来洗衣服,如何来甩干的,洗衣服的人不用去关心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的。
注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有那个好坏之分,都有其专门的应用场景。
类
在Java中,一切皆对象,但是在有对象之前,还需要先认识什么是类?
类:类是用来描述对象的,主要描述该对象具有哪些属性(外观尺寸),哪些功能(用来干啥),描述完成后计算机就可以识别了。
类的定义:
class 类名 {
属性/成员变量;
功能/成员方法;
}
成员变量:定义在类里面,方法外面的变量,也就是类中包含的属性。成员变量也称作成员属性。用来描述这个类的属性。
成员方法:定义在类里面的方法,用来实现这个类的功能。
class WashMachine {
public String brand;//品牌
public int size;//尺寸
public String color;//颜色
//洗衣服功能
public void washing() {
System.out.println("洗衣服");
}
//甩干功能
public void spining() {
System.out.println("甩干");
}
//烘干功能
public void drying() {
System.out.println("烘干");
}
}
注意:
- 类名的定义需要采用大驼峰命名规则(即首字母大写)。
- 一般一个java文件当中只定义一个类。
- main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
- public修饰的类必须要和文件名相同,不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改。
- 在类和对象中,重要是关注谁可以成为一个类。
修改public修饰的类的名称的执行步骤:
对象
什么是对象
对象:是对类的实例化。如果将类看成一张建筑图纸,那么对象就是在这个建筑图纸的指导
下建造出来的房子。
对象的创建
实例化:用类类型创建对象的过程,称为类的实例化。实例化就是创建对象。在java中采用new关键字,配合类名来实例化对象。代码如下:
public static void main(String[] args) {
//实例化一个洗衣机对象
WashMachine washMachine = new WashMachine();
}
对象的初始化
初始化:对对象的成员变量进行初始化(赋初始值)。
对象的初始化方式有以下三种:
- 默认初始化:即用户不对成员变量初始化,由编译器自动帮成员变量初始化。
- 原地初始化:在定义成员变量的同时进行初始化。
- 构造方法初始化:由构造方法初始化。(后面细讲)
class WashMachine {
public String brand = "美的";//就地初始化
public int size;// 默认初始化
public String color;// 默认初始化
//洗衣服功能
public void washing() {
System.out.println("洗衣服");
}
}
构造方法初始化
this引用
在认识构造方法之前,各位小伙伴们还有一个知识点要先了解,那就是我们的this引用。
this:对对象的引用。在Java语法中,当我们在定义类的成员方法时,参数列表自动帮助我们隐式定义this形参,以便我们更好的访问对象的成员。
上面的两个washing()方法,按照我们之前学过的知识来说,这两个方法的参数列表不一样,满足了重载的条件,不应该报错,但是在下面的报错提示中却提示我们这两个方法已经被定义过了,那么,真相只有一个,就是这两个方法的参数列表相同,即在第一个方法当中,编译器自动帮助我们隐式定义了WashMachine这个参数。
this引用的三个用处
- this引用访问成员变量-->this.data
在类的方法中,当类的参数名和类的成员变量名相同时,编译器不能区分谁是形参,谁是成员变量。此时编译器采取局部变量优先,让局部变量自己给自己赋值,所以成员变量并没有被修改。所以此时需要this引用,this引用指向调用该方法的对象,所以可以通过this对成员变量进行赋值
//形参名和成员变量名一致
public WashMachine(String brand, int size, String color) {
brand = brand;
size = size;
color = color;
//等号前后两个变量都是形参
}
//形参名和成员变量名不一致
public WashMachine(String brand1, int size1, String color1) {
brand = brand1;
size = size1;
color = color1;
//等号前是成员变量,等号后是形参
}
//利用this引用对成员变量赋值
public WashMachine(String brand, int size, String color) {
this.brand = brand;
this.size = size;
this.color = color;
//等号前是成员变量,等号后是形参
}
- this引用访问成员方法:利用this调用类的方法,也可以直接调用。-->this.func()
- this引用访问构造方法:在构造方法内部利用this调用构造方法。-->this()(后面细讲)
构造方法:定义在类的内部,用于初始化成员变量的方法,构造方法名和类名一致。注意,如果用户没有定义构造方法,那么编译器会默认帮助我们隐式定义一个不带参数的构造方法。
构造方法调用:在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
在上面的洗衣机类中,我们并没有找到一个和类名一样的方法,此时,编译器会默认帮助我们定义以下方法:
class WashMachine {
public String brand = "美的";//就地初始化
public int size;// 默认初始化
public String color;// 默认初始化
//洗衣服功能
public void washing() {
System.out.println("洗衣服");
}
}
class WashMachine {
public String brand = "美的";//就地初始化
public int size;// 默认初始化
public String color;// 默认初始化
//洗衣服功能
public void washing() {
System.out.println("洗衣服");
}
public WashMachine() {
//该方法即使用户没定义,编译器也会帮助用户定义
//所以这个代码和上面没有构造方法的代码是一致的
}
}
public class Test {
public static void main(String[] args) {
WashMachine washMachine = new WashMachine();//创建对象的同时调用构造方法
}
}
构造方法重载:修改构造方法的参数列表。(参数的个数,顺序,类型)
public WashMachine() {
System.out.println("没有参数的构造方法");
}
public WashMachine(String brand, int size, String color) {
this.brand = brand;
this.size = size;
this.color = color;
System.out.println("三个参数的构造方法");
}
public WashMachine(String brand, int size) {
this.brand = brand;
this.size = size;
System.out.println("两个参数的构造方法");
}
public WashMachine(String brand) {
this.brand = brand;
System.out.println("一个参数的构造方法");
}
构造方法注意事项
- 方法名和类名保持一致
- 如果用户没有定义,则由编译器帮助用户隐式定义一个没有参数的构造方法
- 如果用户自己定义了,则编译器不会帮助用户定义
- 构造方法默认没有返回值,默认不加void
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
- 构造方法可以调用构造方法。只有在构造方法内部才能调用构造方法,普通方法不能调用构造方法,而且this()必须放在构造方法第一行。
今日份分享就到这里啦,如果各位小伙伴有什么疑问的话可以在评论区或者私聊提问哦❤