Java-类与对象

发布于:2024-10-17 ⋅ 阅读:(7) ⋅ 点赞:(0)

一、面向对象

在了解类与对象前,我们需要先知道"面向对象"这个词的概念:

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不会再生成默认的构造方法。

那么这篇关于(类与对象)的知识,就暂时为大家分享到这里啦,作者能力有限,如果有哪里说的不够清楚或者不够简洁,还请大家在评论区多多指出,那么我们下期再见啦~