> Java > java지도 시간 > 본문

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

Mary-Kate Olsen
풀어 주다: 2024-11-04 04:29:01
원래의
353명이 탐색했습니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿