在面向对象编程语言中,类是一个对象吗?

11

在面向对象语言中,类是一个对象吗?通过class.method name的方式访问类方法是如何实现的(内部工作原理)?这与object.method相同吗?

如果类和对象相同(属于面向对象中每个东西的超类),并且我们实例化它(将其制作为对象),我们能否创建除了Object类之外其他类的实例的实例。

(主要关注理论角度,即使从实际角度来说不需要)

4个回答

7

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

如何通过类名.方法名访问类方法?(内部工作原理)这与object.method相同吗?

由于类本身也是对象,因此它们反过来又是一个类的实例(即元类)。因此,向类发送消息就像向代表类行为的对象发送消息一样。有很多相关文献,您可以查看这里这里进行一些介绍。

如果一个类与对象相同(属于面向对象中的超类),我们实例化它(创建它的对象),能否创建除Object类以外的其他类的实例的实例?
我不确定我理解你的意思,但是为了澄清一下,不总是情况下Object是所有类的超类。事实上,如果你开始跟踪类和元类之间的关系,你可能会陷入一种无限循环。不同的编程语言用不同的方式解决这个问题。例如,在VisualWorks Smalltalk中,Object是nil的子类。事实上,nil也是一个对象(记住,所有东西都是对象),它代表“nothing”。正如你所期望的那样,nil是一个类的实例(UndefinedObject),并且它还实现了一些类协议。因此,它可以用来表示从哪里没有继承任何东西的类:)

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


2

类不是一个对象,你可以把它看作是一个对象的“蓝图”。它描述了该对象的形状和行为。对象是类的实例。

更多信息请参见这里


1
正如你所说,类是对象的蓝图,那么对象本身是否可以作为其他对象的蓝图呢?我的意思是,我们是否可以拥有动态类,其实现可以在对象实例中定义。 - Dinkar Thakur
1
@DinkarThakur,是的,这正是Smalltalk中发生的事情。类只是一种特殊类型的对象,用于模拟实例的行为方式。 - Andrés Fortier

1

面向对象语言中,类是一个对象吗?

类的概念首先是理论上的。即使你的语言不支持“类”的正式概念(例如JavaScript),你也可以使用“类”语义定义一个东西。类是对象的模板,从中创建实例。

如何通过类名.方法名访问类方法?

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

Java(来自评论)

对于Java,有一个称为Object的类和一个称为Class的类。请参见这里。这些Java构造与Class和Object的概念分开。前者是实现细节——它们是设计师构建语言的方式,而后者是一般概念。因此,在Java中,您可以拥有 Object的实例,其中该实例是类型为Object(Java构造)的对象(概念)。

这意味着类不是对象或对象类的实例吗? - Dinkar Thakur
取决于编程语言;它不必是。 - hvgotcodes
Java中的行为是什么,我猜对象是每件事的超类 :( - Dinkar Thakur

1
一个对象的基本概念是已经分配了一些内存。正如devdigital所说,类只是一个对象的蓝图,它持有最基本的结构,并确定对象在实例化时的行为。
类只是没有灵魂的主体,而对象是有灵魂的生命体,与环境互动或在生物学术语中响应外部刺激(公共方法和属性),类比于生命的哲学 :)
从技术上讲,类只是驻留在内存中的可机器解释代码(不一定是主存或寄存器)。对象是加载到可执行内存(寄存器/主存)中的代码。

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