1. 前言
本篇文章主要讲解了下面三个问题
类的定义和实例化
构造方法
this关键字
2. 什么是面向对象
众所周知面向过程和面向对象是两种重要的编程思想,而Java是属于面向对象一类的语言.面向对象(Object Oriented Programming,简称 “oop”).
面向对象有三大特性:封装 继承和多态.这些内容后面会详细介绍.
在面向对象的世界里,一切皆为对象。对象就是问题中面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情.,因此在Java中,我们是对一个一个的对象进行的操作.通过实例化对象,调用对象的方法实现相应的功能.面向对象中,我们不必关注对象是如何实现相应的功能的.
例如有一个空调,空调可以进行室内温度的调节(制热或制冷),除湿等功能.这里空调就是一个对象,我们只需要调用空调的制热制冷等功能,就可以实现我们想要的结果.
3. 类的定义
类是用来对一个实体(对象)来进行描述的.类的定义要使用class关键字
// 语法格式为:
class 类名{
// 成员变量
// 成员方法
}
与上述的空调为例,我们要通过定义空调类来描述空调这个对象.空调有颜色,尺寸和型号等信息,空调有制冷制热等功能.
定义空调这个类:
class AirConditioner{ // 成员变量 String colour; // 颜色 double size; // 尺寸 String model; // 型号 // 成员方法 void heating(){ System.out.println("开启制热功能"); } void refrigeration(){ System.out.println("开启制冷功能"); } }
定义类时,类的成员变量和成员方法可以根据需求进行定义. 下面讲解中的类皆是上述的这个空调类
4. 类的实例化
定义类对象之后,我们要如何使用类呢? 这就需要去进行类的实例化.定义类就相当于在计算机中定义了一种新的类型.用类类型创建对象的过程,称为类的实例化.使用new关键字进行类的实例化
// 语法 类名 对象名 = new 类名();
例如
public static void main(String[] args) { // 类名 对象名 = new 类名(); AirConditioner airConditioner = new AirConditioner(); }
实例化好类对象之后,我们可以通过 实例化对象的对象名加.的方式进行类的成员变量和成员方法的访问.
public static void main(String[] args) { AirConditioner airConditioner = new AirConditioner(); System.out.println("颜色: "+ airConditioner.colour); System.out.println("尺寸: "+ airConditioner.size); System.out.println("型号: "+ airConditioner.model); airConditioner.heating(); airConditioner.refrigeration(); } // 输出结果: // 颜色: null // 尺寸: 0.0 // 型号: null // 开启制热功能 // 开启制冷功能
这里需要注意在main方法中,如果定义了变量,而不进行初始化,就使用时是会报错的.
例如:
但是类中的成员变量则不会出现这个问题,类中的成员变量是有默认值的.
基本数据类型:
数据类型 默认值
int 0
short 0
long 0
byte 0
float 0.0f
double 0.0
char /u0000
boolean false
注:引用数据类型的默认值为null.
既然可以通过实例对象的对象名+.的方式访问对象的成员变量,就可以通过这种方式来初始化对象的成员变量.
例如:
public static void main(String[] args) { AirConditioner airConditioner = new AirConditioner(); airConditioner.colour = "白色"; System.out.println("颜色: "+ airConditioner.colour); } // 输出结果: // 颜色: 白色
类可以理解为是一个"模型". 同一个类可以创建多个实例对象
例如:
public static void main(String[] args) { AirConditioner airConditioner1 = new AirConditioner(); AirConditioner airConditioner2 = new AirConditioner(); AirConditioner airConditioner3 = new AirConditioner(); }
5. 对象的构造及初始化
上面谈到我们可以通过实例对象的对象名+.的方式进行成员变量的初始化,但是如果类很多,实例的对象也很多,那么这个时候使用这种方式进行成员变量的初始化就会很麻烦. 因此Java给我们提供了一个叫做 "构造方法" 这样的方法帮我们对成员变量进行的初始化
构造方法: 也称为构造器,是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且
在整个对象的生命周期内只调用一次。
构造方法:
名字与类名相同,没有返回值类型,设置为void也不行
一般情况下使用public修饰
在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
上述就是默认的,无参的构造方法. 也是在没有构造方法时,编译器自动调用的构造方法
当我在构造方法中添加一个输出语句时:
可以看到,我并没有去调用构造方法,却还是输出了构造方法中的语句. 这也验证了构造方法会在实例化对象时自动调用. 因此我们可以传入参数让构造方法帮我们进行成员变量的初始化.
public AirConditioner() { System.out.println("执行了 无参 的构造方法"); } public AirConditioner(String a) { colour = a; System.out.println("执行了 一个参数 的构造方法"); } public AirConditioner(String a, double b, String c) { colour = a; size = b; model = c; System.out.println("执行了 三个参数 的构造方法"); }
在讲方法时,说到过"重载"这个概念.
方法的重载有三个注意的地方: 1. 方法的重载与返回值无关 2. 参数列表不能相同(形参的个数 顺序 类型等) 3.方法名必须相同
构造方法也是可以重载的.上述三个构造方法就构成了方法的重载.
使用构造方法,我们就可以对成员变量进行初始化了. 根据我们传入实参的数量,会自动调用对应参数的构造方法.
我们来打印一下这些类中的成员变量的内容.在IDEA中可以右键 选择Generate
选择这里的toString()
IDEA就会给我们生成好一个这样的方法.
接下来我们来打印实例好的实例对象
6. this引用
上述代码中,其实有一个问题,就是构造方法中的形参变量名是随便写的. 如果要初始化的成员变量非常多,且又不是按照顺序写的(doge) 是不是看着就很头疼.
这个时候可能有些聪明的同学就会说,把形参的名字设置成与成员变量相同不就可以了. 接下来我们来试试
public AirConditioner(String colour, double size, String model) { colour = colour; size = size; model = model; System.out.println("执行了 三个参数 的构造方法"); }
可以看到虽然是调用了构造方法,但是并没有进行初始化.
这个主要的原因就是在构造方法中,编译器并不知道谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?
为了解决这个问题,Java可以给我们提供了一个"this"这样的关键字
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该
引用去访问
对上述代码进行修改
此时就可以正确进行初始化完成了.
使用this之后就是告诉了编译器前面的是当前类的成员变量,而后面的是形参.
关于构造方法,也可以使用IDEA帮助我们自动生成. 与toString相同
可以选择想要初始化的成员变量进行对应构造方法的生成. 选择多个成员变量可以按住CTRL 进行选择.
this的特性
this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
this只能在"成员方法"中使用
在"成员方法"中,this只能引用当前对象,不能再引用其他对象
补充: 在类中也可以进行初始化
class AirConditioner{ String colour = "白色"; // 颜色 double size; // 尺寸 String model; // 型号 public AirConditioner() { System.out.println("执行了 无参 的构造方法"); } }
这种初始化的方法通常会搭配 "final"关键字进行使用,后面会详细的介绍
7. 总结
文章到这里就结束了.文章的内容虽然不难,但是需要注意的地方还是特别多的.类和对象是学习Java中最基础的,务必要掌握