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) 的错误。
经过这一番折腾,小伙开始了解到面向对象编程,准备更深入的学习。