一、面向对象
在了解类与对象前,我们需要先知道"面向对象"这个词的概念:
在Java语言中,我们的主要思想就是"面向对象",而在之前我们所学习的C语言中大部分时候的思想是"面向过程"。
那么什么是"面向对象",什么是"面向过程"呢?
在之前我们学习C语言,想要实现一个操作时,里面可能会有很多比较复杂,难以实现的步骤,这就是因为C语言是一门"面向过程"的语言。指如果想要达到一个目标,必须一步一步的运作其中步骤,然后将其实现,最终达成目的。
而现在我们学习的Java语言就有所不同,Java语言是一门"面向对象"的语言,Java里面有很多的API(预先定义的函数),就比如学习C语言时所学习的:数组排序,二分查找,将数组变成字符串等需要我们实现的功能,到了Java中就变成了现成的方法:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] arr = {1,8,4,5,9,2,3,6,7};
//排序(不是冒泡,效率优于冒泡)
Arrays.sort(arr);
//数组->字符串
System.out.println(Arrays.toString(arr));
while(in.hasNext()) {
System.out.println("请输入你要查找的数字:");
int a = in.nextInt();
//查找该数字下标
System.out.println(a + "的下标为:" + Arrays.binarySearch(arr, a));
}
}
}
效果:
而Java会拥有这么多方便的方法,就是因为其是一种"面向对象"的语言:
📌 我们可以打个比方:
假设有一个制作汽车的任务。在面向过程的编程中,我们会将制作汽车的过程分解成一系列的步骤,比如设计外观、制造发动机、安装零件等,然后按照顺序逐步执行这些步骤来完成制作。而在面向对象的编程中,我们会定义一个汽车类,它有属性如轮胎、油箱、发动机、等,还有方法如启动、加速等,然后创建汽车对象,通过调用对象的方法来完成制作汽车的任务。
总结而言,面向过程更强调解决问题的过程和步骤,而面向对象更强调对象之间的交互和协作。
二、类的定义
类是面向对象编程的基本概念,类定义了对象的属性和方法,以及对象可以执行的操作。
通过类的定义,我们可以创建多个对象来使用该类,每个对象都拥有自己的属性和方法,但是都是基于同一个类创建的,所以它们共享相同的结构和行为。这种方式可以提高代码的重用性和可维护性。
面向对象注重的就是"对象",而生活中的繁多事物都可以被称作"对象",就比如上面我们提到的:汽车。它就可以是一个对象,并且也能被创建出一个"汽车类"。
① 类的定义格式
public class ClassName {
// 类的成员变量
// 类的构造方法
// 类的成员方法
}
public 是一个访问修饰符,表示该类是公共的,可以被其他类访问。ClassName是类的名称,根据命名规范应该使用首字母大写的驼峰命名法。
📌 而接下来我们就试着定义一个"汽车类":
首先我们先创建出一个.java文件,将"Car"类存放到这个文件中。
② 类的使用
接下来我们创建出Car类,为其创建"名字","品牌","轮胎","油箱","发动机"等属性。
并为其创建出三个基本的方法"启动","加速","停车"。
然后我们回到Main.java中,去尝试使用这个"Car":
并且我们也可以创建多个对象:
那么如果不给成员变量的属性赋值,会发生什么呢?让我们尝试一下:
我们可以看到,这样的话输出的都是"null",而此时我们使用的变量类型都是"String",其他的类型也会是"null"嘛?让我们再试一次:
我们创建一个拥有很多类型变量的类:
再次回到Main中测试一下:
我们会看到这些类型的默认值,需要注意的是String 默认值为null,boolean的默认值为false。
而我们注意到:char的默认值...这是个啥?
让我们再仔细地探讨一下:
我们使用char的默认值 与 '\u0000' 和 0 进行对比:
我们能发现,都是相等的,所以我认为char默认值为 '\u0000' 是个空格,转化为整数是0
注意事项:
📕 new 关键字用于创建一个对象的实例
📕 使用 " . " 来访问对象中的属性和方法
📕 用同一个类可以创建多个实例
三、this引用
如上面我们所写的代码为例子,其实在使用" . "为对象属性赋值时,大概可以用这个图来概括:
而当我们定义两个类,并使用同一个方法时:
这是如何判断,我们的值到底传给了谁呢?这就是因为" this "。
在Java中,关键字" this "用于引用当前对象的实例。它可以在类的内部使用,用于区分实例变量和局部变量,以及在方法中调用当前对象的其他方法。
this其实可以理解为对象的一个属性(成员变量),但是这个属性是隐藏的.即this相当于对象的一个隐藏属性。
和对象的其他属性一样,在 new 一个新对象的时候,会在堆内存为对象分配空间,属性就储存在这份空间中。且该this属性的值就是对象在堆内存中地址,即this指向该对象(this代表该对象)
所以调用"show"方法时,就能够通过隐藏的"this"来辨别出使用的是哪个值啦~
而虽然this是隐藏的,但我们还是要养成编写代码时带上this的好习惯,毕竟有些时候,编译器也弄不明白到底哪个是哪个...比如:
欸?此时我们会发现,这次使用getCar,赋值却失败了,这是因为我们的参数名与类数据名重复了,此时编译器也不知道到底哪个加this,哪个不加this,最后就导致了name和age自己给自己赋值,从而赋值失败,变成了null 和 0~
想要进行修改,我们只需要在name和age前加上" this. "就好啦:
this 的三种用法:
① 通过 this. 访问当前对象的成员变量
② 通过 this. 访问当前对象的成员方法
③ 通过 this() 访问当前对象的构造方法——(马上就讲到)
四、构造方法
在我们刚刚编写的代码中,都是先 new 一个对象,然后对其属性一个一个的进行赋值,有没有觉得,这样太麻烦了些?是的,所以在Java创建时也被想到了这个问题,所以就有了更方便的赋值方法:构造方法
📌 构造方法的格式:
public class ClassName {
// 成员变量
// 构造方法
public ClassName() {
// 构造方法的初始化代码
}
// 成员方法
}
让我们使用构造方法为Car类的使用简化一些:
那么又有问题出现了:
为什么之前我们使用Car()进行无参构造时,明明没有编写Car()方法,却能够正常的使用呢?
这是因为在我们定义了一个类时,编译器在没有定义任何构造方法时,Java会自动为该类生成一个默认的无参构造方法。
那我们现在再试用一下无参构造方法:
我们会发现:此时编译器报错了。
这又是怎么回事,难道编译器坏了吗?不,请注意上面我们所说的:"编译器在没有定义任何构造方法时",这是编译器生成一个默认的无参构造方法的前提条件。
所以当我们想自己定义构造方法时,我们还需要再补充一个无参构造方法:
这也就证明了,构造方法也是可以被重载的~
并且,还有一点就是,在一个构造方法中,是可以再调用另一个构造方法的:
这也就讲清了,刚刚在讲this关键词时,最后提到的this()调用构造方法的作用。
📌 使用这种方法时,需要注意的是:
📕 this()必须是构造方法中第一条语句:
📕 不能形成闭环:
📚 注意事项:
📕 Java构造方法是一种特殊的方法,用于创建对象时初始化对象的成员变量。
📕 构造方法的名称必须与类名相同,没有返回类型,并且在类实例化时自动调用。
📕 构造方法可以有参数,也可以没有参数。
📕 构造方法可以被重载,即同一个类中可以定义多个构造方法,只要它们的参数列表不同即可。
📕 如果一个类没有定义任何构造方法,Java会自动为该类生成一个默认的无参构造方法。
📕 如果一个类定义了一个或多个构造方法,Java不会再生成默认的构造方法。
那么这篇关于(类与对象)的知识,就暂时为大家分享到这里啦,作者能力有限,如果有哪里说的不够清楚或者不够简洁,还请大家在评论区多多指出,那么我们下期再见啦~