> Java > Java시작하기 > 본문

null은 Java의 객체입니까?

王林
풀어 주다: 2019-12-06 14:34:27
원래의
2829명이 탐색했습니다.

null은 Java의 객체입니까?

java의 null은 객체도 유형도 아니며 단지 특별한 값일 뿐이므로 모든 참조 유형에 할당할 수 있으며 null을 모든 유형으로 변환할 수도 있습니다.

null 키워드에 대한 자세한 설명

1. 우선 null은 public, static, final과 같은 키워드입니다. 대소문자를 구분하며 null을 Null 또는 NULL로 쓸 수 없으며 컴파일러는 이를 인식하지 못하고 오류를 보고합니다.

2. 모든 기본 유형에 기본값이 있는 것처럼, 예를 들어 int의 기본값은 0이고 boolean의 기본값은 false이며 null은 모든 참조 유형의 기본값입니다. 기본값이 false인 부울 변수를 생성하는 것과 마찬가지로 Java의 모든 참조 변수는 기본값으로 null을 갖습니다. 이는 모든 변수에 해당됩니다.

멤버 변수, 지역 변수, 인스턴스 변수, 정적 변수 등(그러나 초기화되지 않은 지역 변수를 사용하면 컴파일러에서 경고합니다). 이 사실을 입증하기 위해 변수를 생성한 다음 해당 값을 인쇄하여 이 참조 변수를 관찰할 수 있습니다.

무료 동영상 튜토리얼 추천: java video

3. null은 객체도 아니고 유형도 아닌 특별한 값일 뿐입니다. 또한 null을 모든 유형으로 변환합니다. 다음 코드를 살펴보세요.

String str = null;
Integer i = null;
Double d = null; 

String myStr = (String) null;
Integer myI = (Integer) null;
Double myD = (Double) null;
로그인 후 복사

컴파일 및 런타임 중에 모든 참조 유형에 null을 캐스팅할 수 있으며 런타임 시 null이 발생하지 않는다는 것을 알 수 있습니다.

4. 참조 변수에는 Null을 할당할 수 있지만 int, double, float, boolean과 같은 기본 유형 변수에는 null을 할당할 수 없습니다. 컴파일러는 오류를 보고합니다.

보시다시피 기본형에 null을 직접 대입하면 컴파일 오류가 발생합니다. 그러나 래퍼 클래스 객체에 null을 할당한 다음 해당 기본 유형에 객체를 할당하면 컴파일러는 이를 보고하지 않지만 런타임 시 null 포인터 예외가 발생합니다. 이는 Java의 자동 언박싱으로 인해 발생합니다.

5. null 값을 포함하는 래퍼 클래스는 Java가 기본 데이터 유형을 unboxing하고 생성할 때 null 포인터 예외를 발생시킵니다. 일부 프로그래머는 오토박싱이 null을 해당 기본 유형의 기본값(예: int의 경우 0, 부울 유형의 경우 false)으로 변환한다고 생각하는 실수를 범하지만, 아래와 같이 이는 올바르지 않습니다.

Integer iAmNull = null;
int i = iAmNull; // Remember - No Compilation Error
로그인 후 복사

하지만 실행하면 위의 코드 조각을 보면 메인 스레드가 널 포인터 예외를 발생시키는 것을 콘솔에서 볼 수 있습니다. HashMap 및 Integer 키 값을 사용할 때 이러한 오류가 많이 발생합니다. 다음 코드를 실행하면 오류가 나타납니다.

public class Test3 {
  public static void main(String args[]) throws InterruptedException {
    Map numberAndCount = new HashMap<>();
    int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
    for(int i : numbers){      
  int count = (int) numberAndCount.get(i);//NullPointerException
      numberAndCount.put(i, count++); 
    } 
  }
}
package test;import java.util.HashMap;
import java.util.Map;
public class Test3 {
  public static void main(String args[]) throws InterruptedException {    
      Map numberAndCount = new HashMap<>();    
      Integer[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};    
      for(Integer i : numbers){      
          Integer count = (Integer) numberAndCount.get(i);      
          numberAndCount.put(i, count++); // NullPointerException    
      }    
  }
}
로그인 후 복사

이 코드는 매우 간단하고 오류가 없어 보입니다. 당신이 해야 할 일은 배열에 숫자가 몇 번 나타나는지 알아내는 것뿐입니다. 이는 Java 배열에서 중복 항목을 찾는 일반적인 기술입니다. 개발자는 먼저 이전 값을 가져온 다음 값을 추가하고 마지막으로 값을 다시 맵에 넣습니다.

프로그래머는 put 메소드를 호출할 때 첫 번째 방법은 int를 변환하여 null 포인터를 보고하고 이전에 말한 내용을 확인하는 것이라고 생각할 수 있습니다. 두 번째 방법으로, 자동 박싱은 언박싱 문제를 자체적으로 처리하지만 숫자에 카운트 값이 없으면 get 메소드가 0 대신 널을 반환한다는 사실을 잊어버립니다. 왜냐하면 Integer의 기본값은 0 대신 널이기 때문입니다. Autoboxing은 null 값을 int 변수에 전달할 때 NullPointerException을 반환합니다.

6. Null 값이 있는 참조 유형 변수를 사용하면 인스턴스 오브 연산은 false를 반환합니다.

Integer iAmNull = null;
if(iAmNull instanceof Integer){
   System.out.println("iAmNull is instance of Integer");                            
 }else{
   System.out.println("iAmNull is NOT an instance of Integer");
}
로그인 후 복사

이것은 인스턴스 오브 연산의 매우 중요한 기능으로, 유형 캐스트를 확인하는 데 유용합니다.

7. null 값이 있는 참조 유형 변수를 사용하기 위해 비정적 메서드를 호출할 수 없다는 것을 알고 계실 것입니다. null 포인터 예외가 발생하지만 정적 메서드를 사용하여 null 값이 있는 참조 유형 변수를 사용할 수 있다는 사실을 모를 수도 있습니다. 정적 메서드는 정적 바인딩을 사용하므로 null 포인터 예외가 발생하지 않습니다. 예를 들면 다음과 같습니다.

public class Testing {            
   public static void main(String args[]){
      Testing myObject = null;
      myObject.iAmStaticMethod();
      myObject.iAmNonStaticMethod();                            
   }
  
   private static void iAmStaticMethod(){
        System.out.println("I am static method, can be called by null reference");
   }
  
   private void iAmNonStaticMethod(){
       System.out.println("I am NON static method, don&#39;t date to call me by null");
   }
로그인 후 복사

8. 이 때 메서드는 모든 참조 유형을 받을 수 있습니다. 예를 들어 public void print(Object obj)는 이와 같이 print(null)을 호출할 수 있습니다. 컴파일 관점에서는 괜찮지만 결과는 전적으로 메서드에 따라 달라집니다. 이 예제의 print 메소드와 같은 Null 안전 메소드는 NullPointerException을 발생시키지 않고 정상적으로 종료됩니다.

비즈니스 로직이 허용한다면 null-safe 방식을 사용하는 것이 좋습니다.

9 == 또는 != 연산을 사용하여 null 값을 비교할 수 있지만 보다 작거나 큼과 같은 다른 알고리즘이나 논리 연산은 사용할 수 없습니다. Java에서는 null==null이 true를 반환합니다.

추천 관련 기사 및 튜토리얼: Java 시작하기

위 내용은 null은 Java의 객체입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!