web-dev-qa-db-ja.com

静的メソッドがメソッドと見なされるのはなぜですか?

コースのコードの説明を書いていますが、誤ってmethodfunctionを同じ意味で使用しています。私は戻って文言を修正することを決めたが、私の理解に穴が開いた。

私が理解したことから、サブルーチンはクラスのインスタンスに作用しない場合はfunctionであり(その効果は明示的な入出力に制限されます)、methodであればクラスのインスタンスで動作します(不純にするインスタンスに副作用を実行する場合があります)。

トピックには 良い議論 があります。受け入れられた回答の定義により、インスタンスが暗黙的に渡されることはなく、インスタンスのメンバーにアクセスできないため、静的なmethodは実際には関数でなければなりません。

ただし、これを念頭に置いて、静的methodsは実際には関数であってはなりませんか

定義上、クラスの特定のインスタンスには作用しません。それらは関係のためにクラスに「結び付けられている」だけです。 ( OracleFredosaurusProgrammingSimplified )のように、静的サブルーチンを「メソッド」と呼ぶいくつかの見栄えの良いサイトを見ました。彼らはすべて用語を見落としている、または私は何かが欠けている(私の推測は後者だ)。

正しい表現を使用していることを確認したいと思います。
これをクリアできる人はいますか?

133
Carcigenicate

8.4.3.2 からのこの引用は役に立つかもしれません:

staticと宣言されたメソッドは、class methodと呼ばれます。

staticと宣言されていないメソッドは、instance method[...]と呼ばれます。

  • クラスメソッド:クラスに関連付けられています。
  • インスタンスメソッド:インスタンスに関連付けられています。

Javaは単に「オブジェクト指向を考えてほしい」だけです。また、静的メソッドは、状態を含む可能性のある周囲のスコープにアクセスできます。ある意味では、クラスはオブジェクトそのもののようなものです。

120
Radiodef

簡単な答えは、Javaがすべてを「メソッド」と呼ぶことにしたとき、理論的なコンピューターサイエンスの関数とメソッドの区別を気にしなかったということです。

79
Bitcoin M

静的メソッドは厳密には関数ではありません。違いはわずかですが、重要です。

与えられた入力パラメーターのみを使用する静的メソッドは、本質的に関数です

ただし、静的メソッドは静的変数およびその他の静的関数にアクセスすることがあり(静的変数も使用)、静的メソッドはstateを持つことがあります。定義によるstateless。 (補遺:プログラマーは定義として「関数」を使用することにそれほど厳密ではありませんが、コンピューターサイエンスの厳密な関数は入力パラメーターのみにアクセスできます)。したがって、静的フィールドにアクセスするこのケースを定義することは、静的メソッドが常に関数であると言うことは無効です。

「静的メソッド」の使用を正当化する別の違いは、どこでもアクセスできるグローバル関数とグローバル変数をCで定義できることです。静的メソッドを含むクラスにアクセスできない場合、メソッドにもアクセスできません。そのため、「静的メソッド」は、グローバル関数とは対照的に、設計によってその範囲が制限されます。

26
Thorsten S.

Javaでは、ユーザー定義クラスは実際にはJava.lang.Classのサブクラスのインスタンスです。

この意味で、静的メソッドareは概念クラスのインスタンスにアタッチされています。これらはJava.lang.Classのサブクラスのインスタンスにアタッチされています。

これを念頭に置いて、「クラスメソッド」(Javaの静的メソッドの別名)という用語が意味を持ち始めています。また、「クラスメソッド」という用語は、Objective C、Smalltalk、JLSなど、多くの場所で見つけることができます。

17
Mike Clark

コンピューターサイエンスでは関数は静的メソッドに明確にマッピングされます。しかし、クラスの「メソッド」は、「メンバー」(フィールドメンバー、メソッドメンバー)のように少し汎用的です。のような文言があります

データメンバーとメソッドメンバーには、2つの名前空間があります。xと.x()は共存できます。

その理由は、哲学者のルートヴィヒ・ヴィトゲンシュタインが言ったように、言語は異なる文脈を持つツールだからです。 「方法」は、上記の引用で「メンバー」を分類するニースの呼び名です。

11
Joop Eggen

あなたの考えは正しく、それは理にかなっています。 Javaコミュニティでは用語が確立されていません。用語が存在する理由を理解するのに役立ついくつかの内部を説明しましょう。

Javaは、クラスベースのオブジェクト指向言語です。メソッドは常にクラスまたはインスタンスのメンバーです(これは他のプログラミング言語でも有効な一般的なステートメントです)。クラスとインスタンスは両方のオブジェクトであると考えています。

インスタンスメソッド(動的)

このメソッドをクラスから直接呼び出すことはできません。インスタンスを作成する必要があります。各インスタンスはそのメソッドを参照します。メソッド定義をまったく同じメソッドシグネチャ(サブクラス化する場合)で上書きできます。つまり、参照は別のメソッド(同じシグネチャを持ちますが、異なるメソッドボディを持つことができます)を指します。メソッドは動的です。

クラスメソッド(静的)

このメソッドはクラスから直接呼び出すことができるだけです。つまり、そのクラスのインスタンスを作成する必要はありません。プログラム全体でそのメソッドのグローバル定義は1つだけです。メソッドが静的に宣言されている場合、プログラム全体に有効な定義は1つしかないため、まったく同じメソッドシグネチャを上書きすることはできません。メソッドはクラスオブジェクト自体のメンバーであり、インスタンスにはそのメソッドへの同じ一意の(および修正された)参照がすべてあることに注意してください。

9
Ely

Scala をニーモニックとして使用して、用語の別の例を示します。
Scalaには、暗黙的に定義されたクラスのシングルトンインスタンスであるobjectsがあります 1

定義により、クラスの単一インスタンスで動作するため、objectmethodsに属するこれらのサブルーチンを呼び出すことができます。
さらに、オブジェクトもクラスAを定義し、オブジェクトAのすべてのメソッドをクラスAの静的メソッドとして作成します(Javaとのインターフェース用)[2]

したがって、JavaクラスAの静的メソッドは、Scala singletonインスタンスと同じメンバーにアクセスし、定義に従って呼び出す必要があります( static)クラスAのメソッド.

7
mucaho

もちろん、主な違いは-メソッドはメソッドパラメータだけでなく、静的フィールドを使用できることです。しかし、もう1つ-ポリモーフィズムがあります!評価の結果クラスA.doTheSameStaticMethod()およびClassB.doTheSameStaticMehod()はクラスに依存します。この場合、関数は無力です。

各クラスには、Classクラスのサブクラスのインスタンスであるオブジェクトを表すオブジェクトがあります。静的メソッドは、実際には、クラスのサブクラスのインスタンスであるこれらのオブジェクトのインスタンスメソッドです。静的フィールドの形式で状態にアクセスできるため、単なる(ステートレス)関数に制限されません。それらはメソッドです。

1
Bohemian