类和对象有什么区别?

3

我正在学习UML,需要了解一些关于类图的内容。

例如,我有一个名为person的类,其属性为firstname,surname和date of birth。

那么对象是什么呢?我理解类(包括person和其属性)和属性,但书中也提到了对象,那么对象指的是什么呢?

预先感谢您的帮助。


这回答了你的问题吗?类和对象实例之间有什么区别? - Eureka
2个回答

2
从哪里开始?并不容易。在UML 2.5 PDF中寻找Class的定义就像在9/11之后的双子塔废墟中寻找某物一样 :-( 所以我将OMG发布的UML元模型作为XMI导入EA。然后我们发现:

您可以按照以下方式找到该元素:

enter image description here

它的注释如下:

类分类一组对象,并指定表征这些对象的结构和行为的特征。类可能具有内部结构和端口。

因此,看起来一个Class是从对象派生出来的。这与18世纪的卡尔·林奈所做的事情非常相似。我们暂时可以把这个放在一边,开始寻找那些对象

对象

试图在元模型中查找Object元素结果什么也没有。也许这是有充分理由的,因为这涉及到形而上学。卡尔·林奈并不是唯一一个在思考世界分类的人。

顺便说一下:我在EA中创建了一个Class实例,并最终得到了一个元类型为Object的元素。这是UML 2.0之前的遗物。我查看了UML 1.5并在第3-64页找到了object的定义:

3.39 对象

3.39.1 语义

对象表示类的特定实例。它具有标识和属性值。类似的符号也表示协作中的角色,因为角色具有类似实例的特征。

这已经被解决很长时间了,并且仍然是大多数人心中的想法。IT人员从头开始定义了几个类(考虑到某些要求),当您使用它们时就会有这些对象。这与我们的卡尔处理事情的方式完全相反。现在,在经过12年的UML 1.5之后,我们拥有了UML 2.5,但没有Object的痕迹!

因此,根据UML 2.5,Object不存在。但是我们有ObjectFlowObjectNodes。所以一定有什么东西。在UML 2.5的第12页上,您会发现:

6.3 UML的语义

6.3.1 模型及其所描述的内容

分类器。分类器描述了一组对象。对象是具有状态和与其他对象关系的个体。对象的状态标识了该对象的分类器属性值。 (在某些情况下,分类器本身也可以被视为个体;例如,请参见子条款9.4.3中关于静态结构特征的讨论。)

稍微往下一点:

UML模型不包含对象、实例或执行,因为这些个体属于被建模的领域,而不是模型本身的内容。UML确实具有直接建模个体的建模构造:实例规范、发生规范和执行规范,分别用于建模对象、实例和执行,以便在特定环境中进行建模。

说实话,我读到这个还挺惊讶的,因为我仍然停留在过去,我们有对象图(像EA这样的UML工具仍允许创建它们)。这可能是混淆的原因。对象太过复杂(自哲学诞生以来就一直在讨论),不能成为UML元素。相反,UML允许使用SD(序列图)等方式来突出对象的某些方面。

总结

这有点像先有鸡还是先有蛋的问题。将现实世界(“对象”)与所建模型(“类”)之间的映射很困难。这取决于您的目标。您是想了解已经存在的东西并勾画出它的行为,还是您发明了一些新的东西,想看看它如何交互?

无论如何,你的问题虽然简单,但却是一个非常好的问题!


1

我喜欢qwerty_so详细全面的回答。我可以提供一种直观的替代方案吗?

  • 一个类描述属于该类的对象的特征。例如,类PersonfirstnamesurnamedateOfBirth定义为属性。它还定义了这些属性的类型。
  • Person类的对象,比如说John:PersonJane:Person,对于每个属性都有特定的值。对象John将具有firstname="John",lastname="Doe",dateOfBirth=1961-10-01,而对象Jane将具有firstname="Jane",lastname="Smith",dateOfBirth=1965-02-20

在流行的编程语言中也可以尝试相同的差异。例如:

// definition of a class, i.e. the general rules
class Person {
  private String firstname; 
  private String lastname; 
  ...
  public Person (String first, String last, ...) { ... } 
  public void doSomething() { ... } 
}

// definition of objects, that abide by the classe's rules: 
Person Jane = new Person("Jane", "Smith", ...); 
Person P2 = new Person("John", "Doe", ...); 
// the objects need to have their properties set.  But the behaviors of the class can be used without redefining them
Jane.doSomething(); 

这只是真相中的IT部分。你有分类(作为蓝图)并创建实例(分配内存)。这使得对象只是计算机内存中的那个小部分。但这不是真的。Jane:Person 不是人 _Jane_,而是她非常抽象的一部分(告诉她的年龄、性别、喜好等等)。这很困难。或者像爱因斯坦所说的那样:让事情尽可能简单,但不要过于简单。这可能是放弃UML 2.5中的对象的原因。 - qwerty_so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接