わかりました、見てみましょう...
なぜ非静的関数/メソッドがあるのか 疑問に思っていましたか? メソッドはオブジェクト (属性/データ メンバーなど) のプロパティではなく、そのクラスのすべてのインスタンスが同じメソッドを使用するのに、なぜ静的メソッドと非静的メソッドに違いがあるのでしょうか?
注意すべき重要な点は、それが概念上の違いであるということです。インスタンス メソッドは、呼び出されたときに特定のオブジェクトに「関連付け」られます。これには、何らかの形式の「this」コンテキストがありますが、静的メソッドはそうではありません。
これは、オブジェクトがインスタンス化されると、そのクラスのすべてのインスタンスでまったく同じメソッドのコピーを保持することを意味しますか?
言語にもよりますが、一般的にはありません。
たとえば Java では、クラスのすべてのインスタンスで共有されるメソッドのコピーは 1 つだけです。メソッドは、クラスのインスタンスのデータの「一部」ではありません。JavaScript では、[[prototype]] チェーンを使用するか、程度は低いですが、異なるインスタンスで同じメソッドに同じ関数オブジェクトを再利用することで、この共有を得ることができます。(ただし、JavaScript の新しいインスタンスごとに新しいメソッドを作成することもできますが、それはプログラマーの選択です。)
Java では、インスタンス メソッドを呼び出すために「メッセージ」が送信されます。つまり、特定のタイプを調べて、適切な「this」インスタンスとともにメッセージを送信します。(これは、仮想ディスパッチのためにこれよりも複雑ですが、注意すべき重要な点は、メモリに読み込まれる特定の型のメソッドのコピーが1 つしかないことです。)
JavaScript では、メソッドは、レシーバーに動的にバインドされる (つまり、"this呼び方に基づいて内部が定められている)。Python は、メソッドがフェッチされて呼び出される第一級の関数であるという点で JavaScript と同様に機能します (ただし、JavaScript とは異なり、メソッドは依然としてクラスに「バインド」されています)。Ruby は、"メッセージが送信される" という点で Java のように動作し、それによってメソッドが呼び出されます (これは別のメソッドです) 。Ruby ではファーストクラスの値) を使用し、暗黙的にコンテキストをレシーバーに関連付けます。これらの言語はすべて、MRO を調整し、インスタンスに共通のメソッドを共有するために、さまざまな形式の「サブクラス化」(呼び方は自由です) をサポートしています。
メソッドはすべてのオブジェクトで同じです。異なるオブジェクトがメソッドを呼び出すだけです。では、なぜメソッドをオブジェクトの一部にする必要があるのでしょうか?? メソッドを(静的メソッドのように)一度だけ保存してから、「this」を使用するときに関連するオブジェクトで実行できないのはなぜですか?? インスタンスごとに、非静的メソッドをオブジェクトの一部として保存するのはばかげているようです。
これは、Java、C++、Python (通常)、Ruby (通常)、JavaScript (多くの場合) など、多くの言語が行うことであり、メモリとオーバーヘッドを節約するための非常に有効なポイントです。
ハッピーコーディング!