12
public class CallingStaticMethod {
public static void method() {
    System.out.println("I am in method");
}
public static void main(String[] args) {
    CallingStaticMethod csm = null;
    csm.method();
   }
}

上記のコードで静的メソッドがどのように呼び出されるかを誰かが説明できますか?

4

5 に答える 5

22

クラスのインスタンスを持つ必要がないという理由だけで、コンパイラによって最適化されています。コンパイラは基本的に置き換えます

csm.method();

CallingStaticMethod.method();

一般に、自分で行うことも良い習慣です。平均的な IDE でさえ、インスタンスを介した静的メソッドへのアクセスについて警告しますが、少なくとも Eclipse はここで警告します。

于 2010-02-08T17:53:37.860 に答える
3

Java では、Class インスタンスを使用して静的メソッドを呼び出すことができますが、メソッドを呼び出すために使用されたインスタンスでメソッドが呼び出されるかのように、この許可を混同しないでください。

インスタンス.メソッド();

と同じです

Class.method();

于 2010-02-08T17:54:11.563 に答える
1

Java 言語仕様では、参照が評価されてから破棄され、静的メソッドが呼び出されると書かれています。
15.12.4.1. ターゲット参照の計算 (必要な場合)

thisこれは、参照を使用して静的メソッドを呼び出す場合と同じ動作です。this評価されてから破棄され、メソッドが呼び出されます。

あなたの例に似た仕様の例さえあります。

ターゲット参照が計算され、呼び出しモードが静的であるために破棄される場合、参照は null かどうかを確認するために検査されません。

class Test1 {
    static void mountain() {
        System.out.println("Monadnock");
    }
    static Test1 favorite(){
        System.out.print("Mount ");
        return null;
    }
    public static void main(String[] args) {
        favorite().mountain();
    }
}
于 2017-10-23T20:24:22.157 に答える
0

まぁこれで全然OK。静的メソッドは、クラス A のオブジェクト インスタンスによってアクセスされていません。クラス名または参照によって呼び出した場合、コンパイラはクラス java.lang.Class のインスタンスを介して呼び出します。

参考までに、java の各クラス (上の図の CallingStaticMethod) は、クラス「java.lang.Class」のインスタンスです。また、クラスを定義するたびに、インスタンスが java.lang.Class CallingStaticMethod = new java.lang.Class(); として作成されます。

したがって、メソッドは「CallingStaticMethod」で呼び出されるため、null ポインター例外は発生しません。

お役に立てれば。

于 2012-11-08T08:48:04.493 に答える
0

はい、できます。nullオブジェクトで非静的メソッドを呼び出している場合にのみ、NullPointerExceptionがスローされます。メソッドが静的な場合は実行され、メソッドが静的でない場合はNPEを介して実行されます ...

詳細については、ここをクリックしてください...

于 2014-07-09T04:54:29.900 に答える