【问题标题】:Is class an object in object oriented language类是面向对象语言中的对象吗
【发布时间】:2013-02-07 14:01:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: oop class object instance


    【解决方案1】:

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

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

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

    如果类与对象相同(属于对象类,即 OO 中所有事物的超类)并且我们实例化它(创建对象 它),我们可以创建一个类的实例的实例,而不是 对象类。

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

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

    【讨论】:

      【解决方案2】:

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

      更多信息请参见here

      【讨论】:

      • 正如你所说的类是对象的蓝图,那么对象本身可以作为其他对象的蓝图。我的意思是我们可以拥有可以在对象实例中定义实现的动态类
      • @DinkarThakur,是的,这正是 Smalltalk 中发生的事情。类只是模拟实例行为方式的一种特殊类型的对象。
      【解决方案3】:

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

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

      类方法如何仅通过类名来访问。方法名?

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

      Java(来自 cmets)

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

      【讨论】:

      • 所以这意味着类不是对象或对象类的实例?
      • 取决于语言;它不一定是
      • Java 中的行为是什么,其中 object 是我猜想的所有事物的超类 :(
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 2011-08-01
        • 2010-09-06
        • 2011-06-09
        • 1970-01-01
        相关资源
        最近更新 更多