12

クラス名を使用して静的メソッドを呼び出すことについて友人と話し合っていたところ、このコードを試してみて、実行時に NPE がスローされることを期待していましたが、実際にはそうではありませんでした。実行順序を理解したいだけです。

public class One {

    public static void method() {
        System.out.println("in static one");
    }
}

public class Two {

    static One o;

    public static void main(String[] args) {
        o.method(); // expected NPE here, as o is null
    }
}

静的メソッドはクラス名で呼び出す必要があることを知っています。インスタンスで静的メソッドを呼び出すと、IDE がコンパイラの警告を出すことさえ知っています。ただし、インスタンスを作成してそれらを呼び出すこともできますが、ここでインスタンスを作成したことはなくo、デフォルト値を null にするo.method()必要があるため、実行時に NPE をスローする必要がありますが、そうではありません。このコードで実行順序がどのようになっているのかを教えてください。

4

5 に答える 5

7

重要なのはコンパイル時のフィールドの型であるため、機能しoます。コンパイラは とo.method()同じバイト コードにコンパイルしますOne.method()

Two特に、を拡張するクラスがOneあり、両方が を宣言しているstatic void method()場合、

One x = new Two();
x.method(); // calls One.method(), not Two.method()

難読化の目的には適していますが、保守性にはあまり適していません...

于 2012-12-06T21:13:13.713 に答える
6

methodOne静的であるため、インスタンスを気にしません。

One o = null;
o.method();

以下と同じです:

One.method();
于 2012-12-06T21:04:03.603 に答える
0

staticメソッドまたは変数は、クラス インスタンスではなく、クラス定義自体に関連付けられます。したがって、あなたmethod()はで利用できますoが、理想的には、クラス名自体を次のように使用して呼び出す必要があります。

     One.method();//static way of calling static methods
于 2012-12-06T21:05:34.490 に答える
0

static One o;関数の外で宣言するからですmain。関数内で宣言しようとすることmainもできますが、コンパイルすることさえできません...

One o = nullまたは、のように宣言することもできますmain。その後、コンパイルされますが、同じですOne.method()

于 2012-12-06T21:07:08.963 に答える
0

イタリック スタイルで静的メソッドのコード フォーマットを提供するコードをここに表示して人々をだますのではなく、(Eclipse) などの開発環境でコードを開いた場合、checkstyle に関する「Do notインスタンスで静的メソッドを呼び出します。」

だからそうあるべきだ

One.method()

それ以外の

o.method()

ではなぜクラッシュしないのかは明らかです!

于 2012-12-06T21:10:34.073 に答える