1.类的由来
1.1 C语言中的结构体
这部分属于历史问题,与技术无关,了解历史可以让我们更好地把握现在和将 来。C语言中的结构体struct 可以说是类的最原始的雏形。只有int,float,char 这些基本数据类型是不够的,有时需要用不同的数据类型组合成一个有机的整体 来使用。例如一个学生有学号和姓名就可以定义一个Student的结构体:
struct Student {
int id;
char[20] name;
} student;
main() {
// 可以使用“对象名.属性”的方式来操作数据
student.id = 5;
student.name = “ZhangSan”;
}
1.2 从结构体到类的演化(C —— C++)
C中的结构体 | C++中的结构体 |
struct 结构名 { |
struct 结构名 { |
C++ 首次允许在结构体中定义成员函数!那么再将struct关键字换成class 不 就是我们现在所看到的类的形态了吗?
class Student {
private:
int id;
char[20] name;
public:
void gotoSchool() {}
}
C++ 最初的名字叫做“C with class”(带类的C),经过长时间 的发展,最终敲定将其命名为 C++,“++”表示加一操作,代表它比 C语言更进步,更高级。
面向过程的编程就是在处理一个个函数,而现在的面向对象编程处理是函数加 数据,形式上就这么点儿差别。也许刚刚接触时它时会感到有些困难,这很正常 。一旦你真正了解它,那你一定会爱上它。所以,请大家不要畏惧,技术永远向 着更方便,更简单,更高效的方向发展,而不会向越来越难,越来越复杂发展。 对于面向对象程序设计(OOP)而言,代表着越来越接近人类的自然语言,越来越 接近人类的思维,因此一切都会变得越来越简单。
从结构体到类的演变过程中我们看到,类中是可以定义函数的。因此,引出了 面向对象三大特性之一,封装。
2.封装(Encapsulation)
2.1 封装的概念
封装的定义:把过程和数据包围起来,对数据的访问只能通过已定义的界面。 在程序设计中,封装是指将数据及对于这些数据有关的操作放在一起。
知道这些定义,并不能代表技术水平有多高。但是如果去参加面试也许会用得 着。简单解释一下,它的意思是指把成员变量和成员函数放在一个类里面,外面 要想访问该类的成员变量只能通过对外公开的成员函数来访问。用户不需要知道 对象行为的实现细节,只需根据对象提供的外部接口访问对象即可。
这里有一个原则叫做“信息隐藏”—— 通常应禁止直 接访问成员变量,而应该通过对外公开的接口来访问。下面,看一个小例子:
class Father {
private var money:int = 10000000;
public takeMoney():int {
money -= 100;
return 100;
}
}
定义名为 Father的类(一个有钱的父亲),类中有一个成员变量 money 它的 访问权限为 private 意思是说 money 是Father 私有的,private 是指只有在这 个类里面才能访问,出了这个类就无法访问该成员了,稍后会有关于访问权限更 多的解释。
类中还定义了 takeMoney()这个方法,它是public的,可以说是对外公开的一 个接口。
从这个例子中可以看出,任何人要想从 Father类取一些 money的话,都只能 通过 takeMoney()这个方法去拿,而不能直接访问 money这个属性,因为它是私 有的。只有通过 takeMoney()这个公开的方法从能修改 Father类的成员变量让 money -= 100 —— 每次只能给你 100 元。对外只能看到 takeMoney()这个方法,该方法如何实现的别人不知道,反正你每次只能得到 100 块。