JAVA 基础学习笔记(5) 面向对象编程

在之前的JAVA语法学习中,基本上和C语言的区别不大,但从这里开始,没有面向对象编程经验的我卡了很久。

面向对象编程

    (Object-Oriented Programming,简称OOP)是一种软件开发方法论,它以对象为基础,通过封装、继承和多态等特性,实现了代码的重用性、可维护性和可扩展性。在Java编程中,面向对象编程是一种核心的编程范式,对于初学者和从其他编程语言转换过来的开发者来说,了解和掌握面向对象编程的概念非常重要。

类和对象的基本概念:

       在Java中,类是面向对象程序设计的基本构建块。类是对象的蓝图或模板,它定义了一组属性(数据成员)和方法(函数成员),用于描述具有相同特征和行为的对象。对象是类的实例,它具有类定义的属性和方法。

        这就让我很迷糊,老师说类的概念本身就是抽象的,可我连抽象的具体意思都不知道,我只理解网上评论说这个人很抽象带有一种贬义,因此我特意百度了一下抽象的意思。

JAVA 基础学习笔记(5) 面向对象编程_第1张图片

        字我都认识啊,连起来我就不认识了,我只能说抽象这个词本身就很抽象,所以我想把老师经常说的抽象成类换个方式去理解,将“抽象“”这个词替换成“分”,也就是分类。

以我们自己为例:人类就可以说是一种类,那么为什么我们被称为人类,而不是被称为狗,也不叫做猫?这问题是不是有点傻逼,因为我们就是人啊。那反过来问,为什么我们不把生活中的猫猫狗狗叫作人类呢?因为它们不符合被称为人类的标准,众所周知,分类是需要标准的,不然你分了个寂寞的,这些标准也被就可以理解为编程中的属性/数据成员。先不论人类的定义是怎么来的,先看看被判定成人类有啥标准(属性)?

JAVA 基础学习笔记(5) 面向对象编程_第2张图片

        是类人猿进化而来,有思维,能制造工具并进行劳动,能进行语言交际的高等动物,这是一些判定为人的基础标准,别跟我杠说难道哑巴不是人了,这只是一般标准,当然存在特殊情况啦。猫猫狗狗并不会使用工具进行劳动,也不是类人猿进化而来,不符合人的标准,所以才会到其他类里。

世界上几乎所有东西都能被归到一个类中,如果不能,那它会自己成为一个新类,所以编程 才会引入类的概念。

那对于对象的理解就会简单很多了,都说对象是类的实例,什么是实例

JAVA 基础学习笔记(5) 面向对象编程_第3张图片

        我们再次以自己所在的类(人类)为例 :想象一个生活场景,有个路人问你说:“你看到过那个人吗?”,你回答道:“那个啊?”,路人说:“就那个啊!”,你怎么可能知道路人说的是哪个人,但是你知道他要寻找的目标是个人。这就是没有对类进行实例化的搞笑场面,但路人要是这么问:“你看到过一个身高1米8,长得白白净净,十分帅气,穿着一袭白衣,手里还拿着一把笛子叫小白的男人吗?”,这时你只需要如实回答是或不是即可,不用再反问了。人类确实有身高、长相、行为特征等一系列属性,但你不实例化,它永远只是几个字眼而已。这里的小白便是一种人类的实例化,也就是所说的对象。

人类是一个类,但不是个体(对象)。

 封装与信息隐藏:

        封装是面向对象编程的重要原则之一。它将数据和相关的方法封装在一个类中,通过定义公共接口提供对数据的访问。封装使得代码更加模块化,提高了代码的安全性和可维护性。

说的通俗点,就是简化代码,如果一段代码经常使用,封装的话就不至于一直CV(复制粘贴)了,而且能让开发更加安全和高效。

继承的作用与实现:

        继承是面向对象编程中的另一个重要概念。它允许一个类继承另一个类的属性和方法,并且可以在此基础上进行扩展和修改。继承的主要作用是实现代码的重用性和可扩展性,通过继承可以减少代码的重复,并且在基类的基础上添加新的功能。

        再取上面的例子,人类是一个类,那么人类底下还能不能分类呢?比如以道德标准(方法/函数成员)分类,好人,坏人,以长相分类,有帅哥美女,丑八怪,上面提到小白长得白白净净,十分帅气而且是男的,可以判断他是个帅哥,也就是说他可以分到人类中的帅哥类中去,这就是继承。进行子类(也就是帅哥类)的实例化,那么代码的重用性就可以提高了,

(人类实例化)原句是:你看到过一个身高1米8,长得白白净净,十分帅气,穿着一袭白衣,手里还拿着一把笛子叫小白的男人吗?

(人类的帅哥类实例化后):你看到过一个身高1米8,穿着一袭白衣,手里还拿着一把笛子叫小白的帅哥吗?

当然现实中还是把找人的话信息还是越详细越好

多态性的实现:

        多态性是面向对象编程的核心概念之一。它使得可以使用一个基类的引用来引用不同子类的对象,从而达到统一接口调用的效果。多态性可以提高代码的灵活性和可扩展性,使得程序更易于扩展和维护。

再以人类为例,我们知道人类下面的子类还能以职业为标准来分类,职业不同,他们的工作内容也会有差异。

首先,我们可以创建一个抽象的Person类作为基类,定义了共有的属性和方法:

public abstract class Person {
    protected String name;

    public Person(String name) {
        this.name = name;
    }

    public abstract void work();
}

 这里解释一下abstract的作用:

抽象类(Abstract Class):当一个类被声明为抽象类时,它不能被实例化,也就是说不能创建该类的对象。抽象类通常用作其他类的基类,它定义了一些通用的属性和方法,但本身并不完整,需要被其子类继承和实现。抽象类可以包含抽象方法和非抽象方法。

抽象方法(Abstract Method):抽象方法是在抽象类中声明但没有提供具体实现的方法。它只有方法的声明,没有方法体。抽象方法必须被子类重写(实现)才能使用。如果一个类继承了一个抽象类,它必须实现所有的抽象方法,除非这个子类也被声明为抽象类。

这里用抽象修饰person等价于仅靠person这个基类里面的属性还无法构成一个完整的个体,或者说不允许构成一个个体,得靠它的子类实例化,如果子类也是抽象类,就要用子类的子类去实例化,以此类推。

使用抽象类和抽象方法的主要目的是为了实现一种约定,确保子类提供了必要的方法实现。它提供了一种规范和结构,使得在继承关系中的不同类能够遵循共同的接口和行为。抽象方法的具体实现取决于子类,因此可以根据具体需求实现不同的逻辑。

需要注意的是:如果一个类中有至少一个抽象方法,那么这个类必须被声明为抽象类。抽象类可以包含非抽象方法和成员变量,但是不能被实例化。

然后,我们可以创建不同职业的具体人类,它们继承自Person类并实现自己独特的work方法:

 class Teacher extends Person {
    public Teacher(String name) {
        super(name);
    }

    @Override
    public void work() {
        System.out.println(name + " 是一名老师,正在教授知识。");
    }
}

class Doctor extends Person {
    public Doctor(String name) {
        super(name);
    }

    @Override
    public void work() {
        System.out.println(name + " 是一名医生,正在为病人治疗疾病。");
    }
}

class Engineer extends Person {
    public Engineer(String name) {
        super(name);
    }

    @Override
    public void work() {
        System.out.println(name + " 是一名工程师,正在设计新的产品。");
    }
}

 现在,我们可以在主程序中使用多态来处理人类。我们可以创建一个Person类型的数组,然后向其中添加不同职业的人对象。通过Person类型的引用,我们可以调用相同的work方法,但实际上会根据对象的实际类型调用不同的重写方法:

public class Main {
    public static void main(String[] args) {
        Person[] people = new Person[3];
        people[0] = new Teacher("小明");
        people[1] = new Doctor("小红");
        people[2] = new Engineer("小刚");

        for (Person person : people) {
            person.work();
        }
    }
}

 通过使用基类的引用,我们可以统一处理不同的子类对象,实现了代码的简洁和灵活性。通过简单地改变数组中对象的类型,我们能够处理不同职业的人类,而无需修改循环部分的代码。

JAVA 基础学习笔记(5) 面向对象编程_第4张图片 

总结: 

这些东西越到以后体会越深,有时候真的会怀疑这个世界是不是有更高等的的文明写的程序而已,也许我们只是由某个随机种子生成的NPC。把自己都弄魔怔了,(#^.^#)。

你可能感兴趣的:(学习,笔记)