オブジェクト指向プログラミングは、オブジェクトの概念に基づいたプログラミングパラダイムであり、オブジェクトはデータを格納し、そのデータに作用するための関連メソッドを持つ。

オブジェクトはクラスのインスタンスであり、オブジェクトのプロパティとメソッドを定義する。

オブジェクト指向プログラミング言語では通常、継承を使用して、子クラスが親クラスのプロパティとメソッドを継承できるようにします。子クラスはその後、新しいプロパティやメソッドを追加して親クラスを拡張することができます。

継承はコードの再利用を可能にし、クラスの階層構造を作り出します。猫クラスと犬クラスは両方とも哺乳類クラスの子になるかもしれない。ボタン・クラスはウィジェット・クラスの子かもしれない。

言語によっては、クラスが複数の親クラスを継承する多重継承をサポートする場合もあるが、両方の親クラスが共通の名前のプロパティやメソッドを共有する場合に曖昧さが生じる可能性があるため、あまり一般的ではない。

ポリモーフィズムもオブジェクト指向言語の一般的な機能で、親クラスのメソッドを子クラス固有の新しい実装に置き換えたり再定義したりすることができる。

オブジェクトを使用するコードでは、ベース・クラスや必要なメソッドを定義したインターフェースを指定することがあります。例えば、ストリームに書き込む関数は、出力ストリーム・クラスを継承したオブジェクトを使用したり、書き込みメソッドのインターフェイスを満たすことができます。この関数は、ファイルへの書き込みなのか、ネットワーク・ソケット経由での書き込みなのか、それともまったく別のものなのか、まったく問わない。

オブジェクト指向プログラミングが関数型プログラミングと大きく異なるのは、データに関連するメソッドを持たない点である。

関数型プログラミング言語では、クラスの代わりに構造体を使う。構造体は似ているが、関連するメソッドを持たない。

メソッドの代わりに、関数型プログラミング言語では、構造体をパラメーターの1つとして受け取る関数を使う。

関数型プログラミング言語では、継承を合成に置き換えるかもしれない。

関数型プログラミング言語は通常、関数を変数に格納したり、他の関数に渡したりできる値として扱い、目的の動作を実装した関数値を構造体に格納したり、そのような関数を別の関数に追加パラメータとして渡したりすることで、多相性を実装するかもしれない。

プログラミング言語が純粋な関数型や純粋なオブジェクト指向であることは稀であり、しばしば両方のパラダイムの特徴を含んでいることに注意すべきである。
Object-oriented programming is a programming paradigm based on the concept of objects, which store data and have associated methods for acting upon that data.

Objects are specific instances of a class, which define an object's properties and methods.

Object-oriented programming languages typically use inheritance to allow a child class to inherit properties and methods from a parent class. The child class can then add new properties and methods to extend the parent class.

Inheritance allows for code reuse, and produces a hierarchy of classes. A cat and dog class might both be children of a mammal class. A button class might be the child of a widget class.

A language might also support multiple inheritance, where a class inherits from multiple parents, but this is less common as it can lead to ambiguity when both parents share commonly named properties or methods.

Polymorphism is also a common feature of object-oriented languages, where you can replace or redefine methods of a parent class with a new implementation specific to the child class.

Code using an object might specify a base class or an interface defining the methods it requires. For example, a function that writes to a stream could use any object inheriting from an output stream class, or satisfying an interface for a write method. The function would be completely agnostic as to whether was was writing to a file, over a network socket, or something else entirely.

Object-oriented programming differs from functional programming largely in that data does not have associated methods.

A functional programming language use structures instead of classes, which are similar but do not have associated methods.

Instead of methods, a functional programming language would use functions that take a structure as one of its parameters.

A functional programming language might replace inheritance with composition, where a structure contains another structure.

Functional programming languages typically treat functions as values that can be stored in variables or passed to other functions, and might implement polymorphism by storing a function value implementing the desired behavior in a structure, or by passing such a function as an additional parameter to another function.

It should be noted that programming languages are rarely purely functional or purely object oriented, and will often contain features from both paradigms.