メソッド (計算機科学)
上の例では typeにクラスオブジェクトMethodSampleを代入して、#familyNameと#familyName:メッセージを送りクラスメソッドを実行している。
クラスオブジェクトのインスタンス変数 name は、インスタンスオブジェクトのインスタンス変数と異なり MethodSample に属する全てのインスタンスオブジェクトで共有される。 クラスオブジェクトのインスタンス変数が共有される例を示す:
クラスメソッドは、変数に代入せず直接クラス名を指定して呼び出すことが多い。特にクラスがオブジェクトではない言語においては、直接クラス名を指定する書き方しかできない。
直接クラス名を指定したクラスメソッドの呼び出しは次のように記述する:
なお、MethodSample のインスタンスオブジェクト生成するときに使用した new もクラスメソッドである。
一般的にインスタンスオブジェクトを生成する場合には new という特別な演算子を用いる言語が多い。しかし、Smalltalkの影響が強い言語やRuby等いくつかの言語ではクラスメソッドによりインスタンスオブジェクトを生成する。クラスメソッドによりインスタンスオブジェクトを生成する言語の場合、newを独自の実装に変更することができる。
仮想メソッド (virtual method) とは、サブクラスでオーバーライド (再定義) し、動作を変更することのできるメソッドのことである。C++では仮想関数と呼ばれる。
C++およびC#のメソッドはデフォルトで非仮想であり、メソッドにvirtual修飾子をつけることで仮想メソッドとすることができる。なお、C#のクラス(参照型)は仮想メソッドおよび非仮想メソッドの両方を定義することができるが、構造体(値型)は仮想メソッドを定義することができない。一方Javaのメソッド(インスタンスメソッド)は常に仮想であり、final修飾子をつけることでオーバーライドを禁止できるが、非仮想メソッドとなるわけではない。finalメソッドを非finalメソッドに変更しても、バイナリ互換性は維持される。