Javaでは、「クラス名で静的メソッドを呼び出す」ことも「オブジェクトで静的メソッドを呼び出す」こともできます「クラス名で静的メソッドを呼び出す」と「オブジェクトで静的メソッドを呼び出す」の違いは何ですかジャワで?
6 に答える
違いはありませんがstatic
、静的な方法、つまり ClassName を使用してメソッドを呼び出すことをお勧めします。通常、静的アナライザーは、そうしないとエラーを報告します。
ここで理解しておくべき重要なことは、static
メソッドはステートレスであるため、インスタンスでメソッドを呼び出すことは、コードを読む人にとって混乱を招くということです。メソッドの呼び出しに使用するインスタンスに関係なくstatic
、結果は同じままになるためです。これは、static
メソッドがオブジェクトではなくクラスに属しているためです。
内部的にnew ClassName().staticMethod();
は、 と見なされClassName.staticMethod()
ます。だから違いはありません。混乱を招くだけです。例を考えてみましょう
public class StaticDemo {
static int staticVar = 10;
public static void main(String [] args){
System.out.println(new StaticDemo().staticVar);
System.out.println(StaticDemo.staticVar);
}
}
これは出力します
10
10
`
と書いてもnew StaticDemo().staticVar
、 とみなされStaticDemo.staticVar
ます。したがって、違いはまったくなく、混乱を避けるために常にクラス表記を使用してください。
いいえ、ありません。混乱の可能性は別として...そのようなコードのリーダーは、インスタンスを使用してアクセスする場合、静的メンバー/メソッドと非静的メンバー/メソッドを確実に区別できません。
public class X
{
public static final String foo = "foo";
public static String bar() { return "bar"; }
public static void main(final String... args)
{
final X x = new X();
System.out.println(X.foo); // "foo"
System.out.println(x.foo); // "foo" too -- same reference
System.out.println(X.bar()); // "bar"
System.out.println(x.bar()); // "bar" too -- same reference
}
}
これは紛らわしいので、通常はクラスを使用してそのようなメンバー/メソッドを参照することをお勧めします。
まったく違いはありません。ただし、静的メソッドはクラス レベルであるため、クラス名を使用してアクセスできます。クラスオブジェクトを使用してそれらを呼び出すことは可能ですが、混乱を招きます。値が同じになる場合、すべてのオブジェクトに対してそれらを呼び出す必要があるのはなぜですか?
静的メソッドは で動作しませんclass
。それらは、そのクラスのメンバーではなく、クラスにバインドされているだけです。non static
これは、 のどのメンバーにもアクセスできないことを意味しますclass
。それ以外は、non-static
方法と大差ありません。
SCJPガイドブックにて。次のような例があります。
class Frog {
static int frogCount = 0; // Declare and initialize
// static variable
public Frog() {
frogCount += 1; // Modify the value in the constructor
}
}
class TestFrog {
public static void main (String [] args) {
new Frog();
new Frog();
new Frog();
System.out.print("frogCount:"+Frog.frogCount); //Access
// static variable
}
}
しかし、非常に紛らわしいことに、Java 言語では、オブジェクト参照変数を使用して静的メンバーにアクセスすることもできます。
Frog f = new Frog();
int frogs = f.frogCount; // Access static variable
// FrogCount using f
上記のコードでは、Frog をインスタンス化し、新しい Frog オブジェクトを参照変数 f に割り当ててから、f 参照を使用して staticmethod を呼び出しています。ただし、特定の Frog インスタンスを使用して staticmethod にアクセスしていますが、ルールは変更されていません。これは、オブジェクト参照変数 (参照先のオブジェクトではない) を使用して静的メソッドまたは変数を取得できるようにするための単なる構文トリックですが、静的メンバーは、静的メンバーの呼び出しに使用された特定のインスタンスをまだ認識していません。Frog の例では、コンパイラは参照変数 f が Frog 型であることを認識しているため、Frog クラスの staticmethod は、f 参照の反対側にある Frog インスタンスを意識せずに実行されます。つまり、コンパイラは、参照変数 f が Frog 型として宣言されていることだけを考慮します。
これがお役に立てば幸いです