ホームページ >Java >&#&チュートリアル >Null 参照で静的メソッドを呼び出すと NullPointerException がスローされないのはなぜですか?

Null 参照で静的メソッドを呼び出すと NullPointerException がスローされないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 04:29:01423ブラウズ

Why Doesn't Invoking a Static Method on a Null Reference Throw a NullPointerException?

Null 参照での静的メソッド呼び出し: 驚く理由

Java を使用する場合、一般的に、Null 参照でメソッドを呼び出すというルールに遭遇します。 null 参照は NullPointerException をトリガーします。ただし、次のコード スニペットを考慮してください。

<code class="java">public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test(); // Doesn't throw NullPointerException
  }

}</code>

驚いたことに、上記のプログラムは NullPointerException をスローしません。なぜそうなるのでしょうか?

静的メソッドを理解する

この動作を理解する鍵は、静的メソッドの性質にあります。メソッドを含む静的メンバーは、特定のインスタンスではなくクラスに属します。オブジェクト参照を必要とせずに、型名を介して直接アクセスできます。

上記の例では、test() は静的メソッドです。 NULL.test() を使用して呼び出された場合、実際のオブジェクト参照は無関係であるため、Java はこれを Why.test() の呼び出しとして扱います。

オブジェクト参照による静的アクセス (避けてください!)

Java ではオブジェクト参照を介して静的メンバーにアクセスできますが、この行為は強く推奨されません。静的メンバー アクセスの実際のセマンティクスが隠蔽されるため、混乱が生じる可能性があります。

静的メンバー アクセスで重要なこと

オブジェクト参照を通じて静的メンバーにアクセスする場合式では、参照の宣言された型のみが重要です。これは次のことを意味します。

  • インスタンスが必要ないため、null の参照は例外をスローしません。
  • オブジェクトのランタイム型は呼び出しに影響しません。動的ディスパッチは発生しません。

関連する考慮事項

  • Java では静的メソッドのオーバーライドは許可されません。静的メソッドはクラスにバインドされているためです。
  • 明確にするため、また潜在的な誤解を避けるために、インスタンス参照を介して静的メンバーにアクセスすることは避けてください。

以上がNull 参照で静的メソッドを呼び出すと NullPointerException がスローされないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。