>  기사  >  Java  >  Null 개체 참조에서 정적 메서드를 호출해도 NullPointerException이 발생하지 않는 이유는 무엇입니까?

Null 개체 참조에서 정적 메서드를 호출해도 NullPointerException이 발생하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-03 03:57:30736검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.