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

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

DDD
DDDオリジナル
2024-11-03 03:57:30815ブラウズ

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

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

Java では、メソッドを呼び出すと、 null オブジェクト参照では NullPointerException がトリガーされます。ただし、静的メソッドが null 参照で呼び出された場合、この例外はスローされません。その理由を調べてみましょう。

静的メソッドの定義とアクセス

静的メソッドは、特定のインスタンスではなく、クラスに関連付けられます。オブジェクト参照を必要とせず、クラス名を使用して直接呼び出すことができます。

予期しない動作

以下のコード例は、予期しない動作を示しています。

<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(); // DOES NOT Throw NullPointerException
  }

}</code>

根底にあるもの理由

このコードが機能する理由を理解する鍵は、静的メンバー アクセスの概念にあります。メソッドを含む静的メンバーはその型に属しており、オブジェクト インスタンスにアクセスする必要はありません。

静的メソッドの適切な呼び出し

静的メソッドは直接呼び出す必要があります。次のようにクラス名を使用します:

<code class="java">Why.test(); // Correct way to invoke static method</code>

による非静的アクセスオブジェクト参照

Java ではオブジェクト参照を介して静的メンバーにアクセスできますが、この方法は使用しないことを強くお勧めします。これはインスタンス メンバーへのアクセスを意味するため、混乱を招く可能性がありますが、これは誤りです。

オブジェクト参照アクセスの影響

オブジェクト参照を介して静的メンバーにアクセスする場合

  • 静的メンバーは必要ないため、null 参照チェックはバイパスされます。インスタンス。
  • オブジェクトの特定のランタイム タイプ (存在する場合) は無関係であり、インスタンス メンバーのアクセスとは異なります。

関連する質問

この概念を理解すると、Java が静的メソッドのオーバーライドを禁止する理由と、インスタンスを介した静的メソッドの呼び出しが Java にとってエラーにならない理由もわかります。コンパイラ。

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

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