0

なぜ非静的関数/メソッドがあるのか​​ 疑問に思っていましたか? メソッドはオブジェクト (属性/データ メンバーなど) のプロパティではなく、そのクラスのすべてのインスタンスが同じメソッドを使用するのに、なぜ静的メソッドと非静的メソッドに違いがあるのでしょうか? これは、オブジェクトがインスタンス化されると、そのクラスのすべてのインスタンスでまったく同じメソッドのコピーを保持することを意味しますか?

編集:すべてのマイナス点とは何ですか? 私の指摘は有効です。メソッドの動作は、オブジェクトのインスタンスごとに変化しません。メソッドはすべてのオブジェクトで同じです。異なるオブジェクトがメソッドを呼び出すだけです。では、なぜメソッドをオブジェクトの一部にする必要があるのでしょうか?? メソッドを(静的メソッドのように)一度だけ保存してから、「this」を使用するときに関連するオブジェクトで実行できないのはなぜですか?? インスタンスごとに、非静的メソッドをオブジェクトの一部として保存するのはばかげているようです。

4

8 に答える 8

5

静的メソッドは通常、オブジェクトの状態に依存したり変更したりしません。非静的メソッドは通常そうします。

オブジェクトのすべてのインスタンスにメソッド コードが含まれている場合は、そうではありません。

基本的に、すべてのメソッドは一度定義された後this、パラメータとして静かに渡されます。少し単純化しすぎていますが、うまくいけばアイデアが伝わります。

于 2012-04-14T00:24:30.363 に答える
3

thisメソッド内でキーワードを使用できるように..簡単です。その特定のインスタンスに属します

于 2012-04-14T00:24:14.160 に答える
1

非静的メソッドは、インスタンスのデータ (プロパティ/属性) にアクセスできます。静的メソッドは、クラスのインスタンスに「属していない」ため、できません。これがオブジェクト指向プログラミングのポイントです。データとそのデータで機能する機能をカプセル化しています。

于 2012-04-14T00:27:09.390 に答える
1

非静的メソッドは、フィールドのようにクラスのインスタンスに属しません。非静的メソッドは、単にインスタンス フィールドにアクセスできることを意味します。コピーに関しては、オブジェクトごとに 1 つのコピーがあるフィールドとは異なり、それらは 1 つだけです。

機能サポートを備えた OO 言語では、メソッドをオブジェクトのフィールドにすることができますが、それはまったく異なります。

于 2012-04-14T00:27:31.047 に答える
1

クラスの特定のインスタンスで非静的メソッドが呼び出されます。静的メソッドはインスタンスなしで呼び出され、クラスのインスタンスが存在しなくても実行できます。

インスタンスは実際にはメソッドのコードの個別のコピーを保持していませんが、同じものの重複コピーを保存する意味がないという理由だけです。非静的メソッドは、クラスではなくインスタンスに属していると考えることができます。

于 2012-04-14T00:27:37.527 に答える
1

静的関数は、オブジェクトのインスタンスに関連付けられていません。メンバー関数は、thisキーワードの由来です。コンパイラはそれを非表示の引数としてメンバー関数に渡しますが、静的関数には渡しません。

于 2012-04-14T00:28:25.437 に答える
1

OOP の重要なアイデアの 1 つは、データを操作するコードの近くにデータを保持することです。非静的メソッドを使用すると、まさにそれが可能になります。クラスのユーザー (属性とこれらの属性に対する機能の組み合わせ) が機能に注意を払うことができるように、一連の属性に密接に関連付けられた機能を定義できます。データ自体ではなく。

于 2012-04-14T00:29:02.227 に答える
1

わかりました、見てみましょう...

なぜ非静的関数/メソッドがあるのか​​ 疑問に思っていましたか? メソッドはオブジェクト (属性/データ メンバーなど) のプロパティではなく、そのクラスのすべてのインスタンスが同じメソッドを使用するのに、なぜ静的メソッドと非静的メソッドに違いがあるのでしょうか?

注意すべき重要な点は、それが概念上の違いであるということです。インスタンス メソッドは、呼び出されたときに特定のオブジェクトに「関連付け」られます。これには、何らかの形式の「this」コンテキストがありますが、静的メソッドはそうではありません。

これは、オブジェクトがインスタンス化されると、そのクラスのすべてのインスタンスでまったく同じメソッドのコピーを保持することを意味しますか?

言語にもよりますが、一般的にはありません。

たとえば Java では、クラスのすべてのインスタンスで共有されるメソッドのコピーは 1 つだけです。メソッドは、クラスのインスタンスのデータの「一部」ではありません。JavaScript では、[[prototype]] チェーンを使用するか、程度は低いですが、異なるインスタンスで同じメソッドに同じ関数オブジェクトを再利用することで、この共有を得ることができます。(ただし、JavaScript の新しいインスタンスごとに新しいメソッドを作成することもできますが、それはプログラマーの選択です。)

Java では、インスタンス メソッドを呼び出すために「メッセージ」が送信されます。つまり、特定のタイプを調べて、適切な「this」インスタンスとともにメッセージを送信します。(これは、仮想ディスパッチのためにこれよりも複雑ですが、注意すべき重要な点は、メモリに読み込まれる特定の型のメソッドのコピーが1 つしかないことです。)

JavaScript では、メソッドは、レシーバーに動的にバインドされる (つまり、"this呼びに基づいて内部が定められている)。Python は、メソッドがフェッチされて呼び出される第一級の関数であるという点で JavaScript と同様に機能します (ただし、JavaScript とは異なり、メソッドは依然としてクラスに「バインド」されています)。Ruby は、"メッセージが送信される" という点で Java のように動作し、それによってメソッドが呼び出されます (これは別のメソッドです) Ruby ではファーストクラスの値) を使用し、暗黙的にコンテキストをレシーバーに関連付けます。これらの言語はすべて、MRO を調整し、インスタンスに共通のメソッドを共有するために、さまざまな形式の「サブクラス化」(呼び方は自由です) をサポートしています。

メソッドはすべてのオブジェクトで同じです。異なるオブジェクトがメソッドを呼び出すだけです。では、なぜメソッドをオブジェクトの一部にする必要があるのでしょうか?? メソッドを(静的メソッドのように)一度だけ保存してから、「this」を使用するときに関連するオブジェクトで実行できないのはなぜですか?? インスタンスごとに、非静的メソッドをオブジェクトの一部として保存するのはばかげているようです。

これは、Java、C++、Python (通常)、Ruby (通常)、JavaScript (多くの場合) など、多くの言語が行うことであり、メモリとオーバーヘッドを節約するための非常に有効なポイントです。

ハッピーコーディング!

于 2012-04-14T00:40:47.053 に答える