一、场景再现
有一个重要的概念你需要弄明白,那就是“类(class)”和“对象(object)”的区别。我用禅语来解释一下吧:
鱼和三文鱼有什么区别?
这个问题有没有让你有点晕呢?说真的,坐下来想一分钟。我的意思是说,鱼和三文鱼是不一样,不过它们其实也是一样的是不是?三文鱼是鱼的一种,所以说没什么不同,不过三文鱼又有些特别,它和别的种类的鱼的确不一样,比如三文鱼和大比目鱼就不一样。所以三文鱼和鱼既相同又不同。怪了。
这个问题让人晕的原因是大部分人不会这样去思考问题,其实每个人都懂这一点,你无须去思考鱼和三文鱼的区别,因为你知道它们之间的关系。你知道三文鱼是鱼的一种,而且鱼还有别的种类,根本就没必要去思考这类问题。
让我们更进一步,假设你有一只水桶,里边有三条三文鱼。假设你的好人卡多到没地方用,于是你给它们分别取名叫Frank, Joe,和Mary。现在想想这个问题:
Mary和三文鱼有什么区别?
这个问题一样的奇怪,但比起鱼和三文鱼的问题来还好点。你知道Mary是一条三文鱼,所以他并没什么不同,他只是三文鱼的一个“实例(instance)”。Frank和Joe一样也是三文鱼的实例。我的意思是说,它们是由三文鱼创建出来的,而且代表着和三文鱼一样的属性。
所以我们的思维方式是(你可能会有点不习惯):鱼是一个“类(class)”,三文鱼是一个“类(class)”,而Mary是一个“对象(object)”。仔细想想,然后我再一点一点慢慢解释给你。
鱼是一个“类”,表示它不是一个真正的东西,而是一个用来描述具有同类属性的实例的概括性词汇。 你有鳍?你有鳔?你住在水里?好吧那你就是一条鱼。
后来河蟹养殖专家路过,看到你的水桶,于是告诉你:“小伙子,你这些鱼是三文鱼。” 并且专家还定义了一个新的叫做“三文鱼”的“类”,而这个“类”又有它特定的属性。长鼻子?浅红色的肉?生活在海洋里?吃起来味道还可以?那你就是一条三文鱼。
最后一个厨师过来了,他跟专家说:“非也非也,你看到的是三文鱼,我看到的是Mary,而且我要把Mary和剁椒配一起做一道小菜。”于是你就有了一只叫做Mary的三文鱼的“实例(instance)”(三文鱼也是鱼的一个“实例”),并且你使用了它,这样它就是一个“对象(object)”。
这会你应该了解了:Mary是三文鱼的成员,而三文鱼又是鱼的成员。这里的关系式:对象属于某个类,而某个类又属于另一个类。
----<上述文本摘抄于:https://flyouting.gitbooks.io/learn-python-the-hard-way-cn/content/learn-python-the-hard-way-exercise42.html>
二、回归概念
类:
①对具有相同数据和相同操作的一组相似对象。
②对具有相同属性和行为的一组相似的对象的抽象,类不存在在于真实世界。
----《软件工程概论》
实例:由某个特定的类所描述的一个具体的对象。
----《软件工程概论》
辨析1【类与实例,类与对象】:类与实例可以看做型值对关系,类与对象也可以看做型值对的关系,实例与对象可以认为等价。
对象:
①在应用领域中有意义的,与所要解决的问题有关系的任何事物,可以是物理实体、人为概念或者是有明确边界和意义的东西。
②对象是对问题领域中某个实体的抽象。
----《软件工程概论》
实例化:用类创建对象的过程叫做实例化。实例化过程的结果是形成一个新的类的实例,一个新的类的具体对象。
----《软件工程概论》
辨析2:当使用“对象”这个术语时,既可以指一个具体的对象【实例】,也可以泛指一般的对象【类】。但是,当使用“实例” 这个术语时,必然是指一个具体的对象。
----《软件工程概论》
这也就是为什么说,Mary是三文鱼的一个实例(化)对象,而三文鱼是鱼类的一个子类的原因。
辨析3【类,对象,实例】:类>=对象>=实例
案例1:Person类是类;
Chinese类是Person类的子类;
Johnny是Person类的一个实例;
Johnny也是Person类的一个对象;
案例2:
String 类
String str str是对象(对字符串特征的抽象)
String str = "abc"; "abc"是实例,也是对象.
实体:
①客观存在并可相互区别的事物,可以是具体的人、事、物,也可以是抽象的概念、联系。比如:学生,一个学生,一门课,学生的一次选课,教师与院系的工作关系等。
----《数据库概论》(实体具有属性,实体之间具有实体关系,在结构化程序设计方法中,常用E-R图处理实体及其相关关系)
②实体作为一种数据性对象,与数据库表与之对应。实体类,反之,对应的类有:业务类,数据处理类等。
实体类:面向对象程序设计方法中的,实体类是所有类的一种类。
OOM之类、对象、实例、实体之辨析