10

类是面向对象语言中的对象吗?Class 方法如何仅通过名称访问class.method name?(内部工作)。这和 a 一样object.method吗?

如果 Class 与 object 相同(属于 object 类,它是 OO 中所有事物的超类)并且我们实例化它(使其成为对象),我们可以创建 Object 类以外的类的实例的实例。

(主要对理论观点感兴趣,即使实际上不需要)

4

4 回答 4

7

好吧,这取决于您使用的语言;在一切都是对象(例如Smalltalk)的纯 OO 语言中,类也不例外,也是对象。在其他不将类视为一等公民的语言中,它们只是特殊的语言结构或原始类型。从现在开始,我将使用 Smalltalk 作为目标语言,因为它支持反射和同质的风格。

如何仅通过 class.method 名称访问 Class 方法?(内部工作)。这和object.method一样吗?

由于类是对象,因此它们又是类(元类)的实例。因此,向类发送消息只是向一个对象发送消息,该对象的作用是表示类的行为方式。那里有很多文献,您可以在此处此处查看示例以进行一些介绍。

如果 Class 与 object 相同(属于 object 类,它是 OO 中所有事物的超类)并且我们实例化它(使其成为对象),我们可以创建 Object 类以外的类的实例的实例。

我不确定我是否在这里跟随你,但为了澄清起见,并非总是Object所有类的超类。问题是,如果你开始关注类和元类之间的关系,你可能会遇到一种无限循环。不同的语言以不同的方式解决这个问题,例如,在 VisualWorks Smalltalk 中,Object它是nil. 事情是它nil也是一个对象(记住,一切都是对象),它实际上代表“无”。如您所料,nil它是一个类 ( UndefinedObject) 的实例,它还实现了一些类协议。因此,它可以用来表示没有任何继承的类形式:)。

最后,我不知道这是否回答了您的问题,但是是的,您可以使用完整的反射功能做很多很酷的事情,例如动态创建新类或重塑现有类。我将在此处留下一些您可能会对此主题感兴趣的文档:

于 2013-02-07T14:29:13.247 回答
2

类不是对象,您可以将其视为对象的“蓝图”。它描述了该对象的形状和行为。对象是类的实例。

请参阅此处了解更多信息。

于 2013-02-07T14:06:26.920 回答
1

类是面向对象语言中的对象吗?

阶级的概念首先是理论上的。即使您的语言不支持“类”的正式概念(例如 Javascript),您也可以使用“类”语义定义事物。类是对象的模板,您可以从中创建实例

如何仅通过 class.method 名称访问 Class 方法?

我不太清楚你的意思。一些语言支持“静态”或“类”方法,它们是不在类实例的上下文中调用的方法。因此,它与“object.method”不同,后者是类上的普通方法,其中“this”(或等效项)将是调用该方法的实例。

Java(来自评论)

对于 Java,有一个名为 的类Object和一个名为 的类Class看到这个。这些 Java 构造与 Class 和 Object的概念是分开的。前者是实现细节——它们是设计者如何构建语言,后者是一般概念。因此,在 Java 中,您可以拥有Object的实例,其中该实例是类型Object(Java 构造)的对象(概念)。

于 2013-02-07T14:06:52.267 回答
0

对象的基本概念意味着已分配了一些内存。正如devdigital所说,类只是一个对象的蓝图,它拥有基本结构并确定对象在实例化时的行为方式。

类只是身体(没有灵魂),对象是与环境相互作用的活体(有灵魂),或者在生物学方面对外部刺激(公共方法和属性)做出反应,类似于生活哲学:)

从技术上讲,类只是驻留在内存中的机器可解释代码(不需要主内存或寄存器)。对象是加载到可执行内存(寄存器/主内存)中的代码

于 2013-02-07T14:39:12.267 回答