面向对象是一个概念。这个概念是基于某些想法。这些想法的技术名称(实际上是随着时间的推移而发展起来的原则,从一开始就没有出现)上面已经给出了,我不会重复它们。我宁愿尽可能简单和非技术性地解释这一点。
OO 编程的思想是有对象。对象是小的独立实体。这些实体可能有嵌入信息,也可能没有。如果他们拥有此类信息,则只有实体本身可以访问或更改它。实体通过在彼此之间发送消息来相互通信。将此与人类进行比较。人类是独立的实体,内部数据存储在他们的大脑中,并通过交流(例如相互交谈)相互交互。如果你需要来自别人大脑的知识,你不能直接访问它,你必须问他一个问题,他可能会回答你,告诉你你想知道什么。
基本上就是这样。这是OO编程背后的真正想法。编写这些实体,定义它们之间的通信并让它们交互在一起以形成一个应用程序。这个概念不受任何语言的约束。这只是一个概念,如果您使用 C#、Java 或 Ruby 编写代码,这并不重要。通过一些额外的工作,这个概念甚至可以在纯 C 中完成,即使它是一种函数式语言,但它提供了该概念所需的一切。
现在不同的语言都采用了这种面向对象编程的概念,当然这些概念并不总是相同的。例如,某些语言允许其他语言禁止的内容。现在涉及的概念之一是类的概念。有些语言有类,有些则没有。类是对象外观的蓝图。它定义了对象的内部数据存储,定义了对象可以理解的消息以及是否存在继承(这对于 OO 编程不是强制性的!),类还定义了来自哪个其他类(或者如果允许多重继承,则为类)此类继承(如果存在选择性继承,则继承哪些属性)。一旦您创建了这样的蓝图,您现在可以根据该蓝图生成无限数量的对象。
但是,有些面向对象语言没有类。那么对象是如何构建的呢?好吧,通常是动态的。例如,您可以创建一个新的空白对象,然后向其动态添加内部结构,如实例变量或方法(消息)。或者您可以复制已经存在的对象及其所有属性,然后对其进行修改。或者可能将两个对象合并为一个新对象。与基于类的语言不同,这些语言是非常动态的,因为您可以在运行时动态生成对象,甚至开发人员在开始编写代码时都没有想到。
通常这种动态是有代价的:语言越动态,内存(RAM)对象将浪费的越多,一切变得越慢,因为程序流程也非常动态,如果编译器没有机会,编译器就很难生成有效的代码预测代码或数据流。JIT 编译器可以在运行时优化其中的某些部分,一旦他们知道程序流程,但是由于这些语言是如此动态,程序流程可以随时更改,迫使 JIT 丢弃所有编译结果并重新编译相同的代码一遍又一遍地。
但这是一个很小的实现细节——它与基本的 OO 原则无关。没有地方说对象必须是动态的或在运行时必须是可更改的。维基百科说得很好:
编程技术可能包括信息隐藏、数据抽象、封装、模块化、多态性和继承等特性。
http://en.wikipedia.org/wiki/Object-oriented_programming
他们可能会也可能不会。这一切都不是强制性的。强制性的只是对象的存在,并且它们必须有相互交互的方式(否则如果它们不能相互交互,对象将毫无用处)。