私は友人とクラス名を使用して静的メソッドを呼び出すことについて話し合っており、このコードを試してみたところ、実行時に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がスローされますが、そうではありません。このコードで実行順序がどのようになっているのかについて少し教えてください。
重要なのはフィールドのコンパイル時のタイプだからo
です。コンパイラはとo.method()
同じバイトコードにコンパイルされOne.method()
ます。
特に、Two
を拡張するクラスがOne
あり、両方がを宣言しているstatic void method()
場合、
One x = new Two();
x.method(); // calls One.method(), not Two.method()
難読化の目的には適していますが、保守性にはあまり適していません...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加