My Blog

Java面向对象一

学习笔记,仅供参考

参考B站Mirco_Frank - java与生活

背景

假如, 某小伙在学完C语言后,想要编写一个记录狗日常活动的程序。于是,他找到王阿姨想要询问她家狗的日常,想以此为基础来开始。

经询问后,狗的名字叫 “Tom”,年龄两岁,品种为藏獒,平时的活动有吃饭、睡觉、吠叫等。于是,小伙用 C 语言编写了该程序,他用字符指针来指向字符串,用 int 型变量来存放年龄,用函数来表示狗的日常行为。伪代码如下:

#include <stdio.h>

void eat();
void sleep();
void bark();

int main()
{
    char * name = "Tom";
    int age = 2;
    char * variety = "藏獒";

    // 在 main 中调用函数
    sleep();
    eat();
}

小伙通过 C 语言的变量和数组基本实现了这个记录狗平常活动的程序。

烦恼

小区的张大爷听说小伙搞出了这个程序,于是也想体验体验。就找到小伙帮他也搞一套,小伙觉得这是个商机满口答应下来。小伙当即就开始了张大爷家狗的程序编写。小伙又照着前次的程序很快就写好了。但这时他发现有些问题,新的程序只是在原程序的基础上修改下变量名而已,这种重复无聊的操作让小伙有些许不爽,然而他却不知更大的烦恼在等着他。

更大的烦恼

张大爷再找小伙帮忙后就开始到处宣扬这个记录狗活动的程序,于是整个小区的人都想要体验下这个程序。张大爷就去通知小伙这个事,小伙听后开始有些担心了。

因为当要记录的狗变多后,每条狗都要有自己的名字、年龄、品种等属性,吃、睡、叫等行为。这就使得在变量命名上就变得繁杂,而且对于这些狗共同的属性和行为,都要重复编写相同的代码让程序更臃肿。对于一些狗可能还会有不同之处,这又要为这些狗单独编写相关的程序。而且 C 语言在处理字符串时,是通过传递指针的形式来实现的,而指针在编写和调试时又是复杂的而且牵扯到内存知识很是头疼。

基于这些原因,小伙倍感烦恼,不仅难以实现起来,而且编写修改都不方便。于是,小伙开始寻求新的解决方案。

新的方案

小伙开始在网上查找有关的解决方案,慢慢的他找到了有关面向对象与面向过程的文章,在一番阅览之后小伙开始明白了。

原来像 C 语言这种程序属于 面向过程 的语言 (Procedures Oriented), 而 C++,Java 等语言是 面向对象 的语言 (Object Oriented)。

POP 专注于过程,想到啥就干啥,目标不明确,不利于大众化
OOP 专注于目标,利于大众化,不强调过程

当用 C 来编写程序时,小伙太注重过程的编写,以至于每条狗都要过多相同的代码如狗的名字、年龄等属性,狗吃、睡等行为。而这些狗都共有的属性和行为就在 OOP 中被抽象为类,代表狗这一类事物公共的特性。这样再编写程序时,这些共性就不用重复编写了,只需考虑不同狗的个性即可。

新的程序

小伙在找到解决方案后就立即用 Java 语言重新实现了这个记录狗的日常生活的程序。

public class Dogs {
    String name;
    int age;
    String variety;

    public void eat() {
        // eat(); 方法的内容
    }

    public void sleep() {
        // sleep();  方法的内容
    }

    // other methods
}

/**********分割***********/

public class Main {
    public static void main(String[] args) {
        // 王阿姨注册狗的账户
        Dogs wangDog = new Dogs();

        // 王阿姨填写狗的信息
        wangDog.name = "Tom";
        wangDog.age = 2;
        wangDog.variety = "藏獒";

        // 记录狗的活动
        wangDog.eat();
        wangDog.sleep();
    }
}

在这段代码中,上部分就是对类的实现,其中

// 这些名词被称为:成员变量,是这个类的标签
String name;
int age;
String variety;

// 这些动作被称为:行为,代表这个类能干啥
eat();
sleep();

而下半部分就是对类的使用,Dogs wangDog = new Dogs(); 这是类的 实例化、具体化 ,即将抽象的属性和行为赋予实体,变为实实在在的东西。类似于 C 语言的 malloc(); 在底层就是开辟一块内存并且让 wangDog 指向这块空间。

实例化情形

当对变量赋值时,相应的数值就会赋值给对应对象的变量,比如 wangDog.name = "Tom"
当使用对象的方法时,就会调用相应对象的方法,比如 wangDog.eat();

要是王阿姨不想使用此程序,则只需 wangDog = null;wangDog 不再指向原来开辟的那块空间,以达到注销的目的。在注销后再使用 wangDog 想过的变量或方法则会报空指针异常 (NullPointerException) 的错误。

经过这一番折腾,小伙开始了解到面向对象编程,准备更深入的学习。