静的メソッドが非静的メソッドを呼び出すことが違法である理由を誰かに説明してもらえますか?
7 に答える
非静的メソッドは、特定のインスタンス(オブジェクト) に作用するインスタンスメソッドであり、そのオブジェクトのメンバーにアクセスできます。静的メソッドは特定のインスタンスに関連付けられていません。
インスタンスを提供する場合、非静的メソッドを呼び出すことは合法です。
class Foo
{
public static void f()
{
instanceMethod(); // Not OK - no instance provided.
this.instanceMethod(); // Not OK - no "this" in static methods.
new Foo().instanceMethod(); // OK because you provide an instance
}
public void instanceMethod() {}
}
静的メソッドを呼び出すためにクラスのオブジェクトは必要ないため、必要な非静的メソッドを呼び出す場所は、
静的メソッドはクラスに関連付けられており、非静的メソッドは状態(オブジェクト)に関連付けられています
非静的メソッドは、インスタンスのコンテキストで実行されるメソッドです。インスタンスがなければ、それを呼び出す意味がないので、コンパイラはそうするのを防ぎます - つまり、それは違法です。
メソッドがインスタンス フィールド (別名インスタンス変数) にアクセスしない場合は、おそらく静的メソッドに変更する必要があります。
静的メソッドはクラスに接続されています。通常のメソッドはオブジェクトに接続されています。
静的メソッドには、非静的メソッドを実行できるオブジェクトはありません。
非静的メソッドには、静的メソッドにない暗黙のパラメーターthis
があります ( がないためthis
) 単独では、この事実のために、静的メソッドから非静的メソッドを呼び出すことはできません。
静的メソッドはクラスに属します。非静的メソッドはインスタンスに属します。
非静的メソッドでは、インスタンス ( this
) を実行する必要があります。クラス自体はそれが属するインスタンスであるため、静的メソッドにはインスタンスは必要ありません。
100 個のオブジェクト インスタンスがある場合、すべての nonStatic() メソッド呼び出しは、異なるオブジェクトの状態に影響します。したがって、すべての非静的メソッドは異なるエンティティに作用するため、「異なります」。同時に、オブジェクトのインスタンスが 100 ある場合でも、 staticMethod() を呼び出しても、クラスの静的メンバーにしか影響を与えないため、それらのインスタンスには影響しません。
すべての静的メソッドまたは静的メンバー変数には、1 つのクラスと 1 つのインスタンスがあります。
非静的メンバーの場合、クラス インスタンスに関連付けられたすべてのメソッドがあります。
では、静的メソッドから nonStatic メソッドを呼び出すことができるとしたら、100 個のインスタンスのうちどれが影響を受けるでしょうか? わかります: 意味がありません。