【发布时间】:2013-02-07 14:01:34
【问题描述】:
类是面向对象语言中的对象吗? 类方法如何仅通过 class.method name 的名称访问? (内部工作)。这和object.method一样吗?
如果类与对象相同(属于对象类,它是OO中所有事物的超类)并且我们实例化它(使其成为对象),我们可以创建类的实例的实例除了 Object 类。
(主要对理论观点感兴趣,即使实际上从来不需要)
【问题讨论】:
类是面向对象语言中的对象吗? 类方法如何仅通过 class.method name 的名称访问? (内部工作)。这和object.method一样吗?
如果类与对象相同(属于对象类,它是OO中所有事物的超类)并且我们实例化它(使其成为对象),我们可以创建类的实例的实例除了 Object 类。
(主要对理论观点感兴趣,即使实际上从来不需要)
【问题讨论】:
嗯,这取决于您使用的语言;在一切都是对象的纯 OO 语言中(例如Smalltalk),类也不例外,也是对象。在其他不将类视为一等公民的语言中,它们只是特殊的语言结构或原始类型。从现在开始,我将使用 Smalltalk 作为目标语言,因为它支持反射和同质风格。
如何仅通过 class.method 名称访问 Class 方法? (内部工作)。和object.method一样吗?
由于类是对象,因此它们又是类的实例(metaclass)。因此,向类发送消息只是向一个对象发送消息,该对象的作用是表示类的行为方式。那里有很多文献,你可以看看here和here的一些介绍。
如果类与对象相同(属于对象类,即 OO 中所有事物的超类)并且我们实例化它(创建对象 它),我们可以创建一个类的实例的实例,而不是 对象类。
我不确定我是否在这里关注你,但为了澄清,Object 并不总是所有类的超类。问题是,如果你开始关注类和元类之间的关系,你可能会遇到一种无限循环。不同的语言以不同的方式解决这个问题,例如,在 VisualWorks Smalltalk 中,Object 是nil 的子类。问题是nil 也是一个对象(记住,一切都是对象),它实际上代表“无”。如您所料,nil 是类 (UndefinedObject) 的一个实例,它还实现了一些类协议。因此,它可以用来表示没有任何继承的类形式:)。
最后,我不知道这是否能回答您的问题,但可以,您可以使用完整的反射功能做很多很酷的事情,例如动态创建新类或重塑现有类。我将在此处留下一些您可能会对此主题感兴趣的文档:
【讨论】:
类不是对象,您可以将其视为对象的“蓝图”。它描述了该对象的形状和行为。对象是类的实例。
更多信息请参见here。
【讨论】:
类是面向对象语言中的对象吗?
阶级的概念首先是理论上的。即使您的语言不支持“类”的正式概念(例如 Javascript),您也可以使用“类”语义定义事物。类是对象的模板,您可以从中创建实例。
类方法如何仅通过类名来访问。方法名?
我不太清楚你的意思。一些语言支持“静态”或“类”方法,它们是不在类实例的上下文中调用的方法。所以它与“object.method”不同,后者是类上的普通方法,其中“this”(或等效)将是调用该方法的实例。
Java(来自 cmets)
对于 Java,有一个名为 Object 的类和一个名为 Class 的类。 See this。这些 Java 构造与类和对象的概念分开。前者是实现细节——它们是设计者如何构建语言,后者是一般概念。因此,在 Java 中,您可以拥有一个 Object 的实例,其中该实例是 Object(Java 构造)类型的对象(概念)。
【讨论】:
对象的基本概念意味着已经分配了一些内存。正如devdigital 所说的那样,类只是一个对象的蓝图,它包含基本结构并确定对象在实例化时的行为方式。
类只是身体(没有灵魂),对象是活体(有灵魂),它们与环境相互作用或在生物学术语中对外部刺激(公共方法和属性)做出反应,类似于生命哲学:)
从技术上讲,类只是驻留在内存中的机器可解释代码(不需要主内存或寄存器)。对象是加载到可执行内存(寄存器/主内存)中的代码
【讨论】: