2013-10-22 2 views
19

을 선언하고이 질문에 Declaration of wrapper classes이 내 앞의 질문에 계속있는 기본 데이터 형

자바의 답변에 accroding 동안 자바가 null을 허용하지 않는 이유는 왜

char c = null; // invalid 
int i = null; // invalid 
다음 클래스 래퍼하는 기본 데이터 형식을 래핑

은 허용되지 않지만

Character cObj = null; // valid 
Integer iObj = null; // valid 

이 허용됩니다.

+3

원시 타입 *은 "null"일 수 없기 때문에 *. 정수 값이 비어 있기 때문에 – qqilihq

+0

은 0이되며 결코 널이 될 수 없습니다. (int의 경우) –

+1

@qqilihq :) thats 내 질문 왜? 자바가 래핑 (wrapping) 할 때 Java가 원시 데이터 유형을 감싸고 null 값을 허용하지 않는 이유 – Vishrant

답변

36

프리미티브 을 대표하고 개체 변수가 복잡한 데이터 객체에 참조 (포인터 같은)을 나타내므로. 일반적인 null 값은 없으며 "아무것도 참조하지 않는"특수 키워드 또는 빈 참조입니다. 이는 매우 전문적인 답이 아니지만 가장 적절하다고 생각합니다.

게다가, 당신의 의견으로는 무엇이있을 수 있습니까? 0? -1? 그러나 그것들은 유효한 정수 들이므로 그 밖의 무엇이 있습니까?

나는 다음을 익히기 시작할 것을 강력히 제안합니다. complex java tutorial. 당신이 묻고있는 모든면은 거기에 설명되어 있으며 예제로 뒷받침됩니다.

30

null은 "개체가 부족함"을 의미합니다. 참조는 객체가 부족할 수 있습니다. 원시 객체는 사용할 수 없습니다.

+0

'Byte b = null; 할 수 있습니까? 바이트 b1 = b; *** 바이트 MinValue ***? – Kiquenet

+0

물론 할 수는 있지만'b'가 언 박싱되면 널 포인터를 얻습니다. – Kayaman

+0

*** Byte/Integer를 byte/int로 변환하는 안전한 방법 ***? – Kiquenet

2

Java 원시 타입 변수는 store-by-reference 변수가 아닌 store-by-value입니다. 래퍼 클래스는 기본적으로 다른 Java 객체와 비슷한 객체입니다. 단, 다른 모든 Java 객체는 기본 유형을 래핑한다는 점만 다릅니다.

0

Character 및 Integer와 같은 객체는 포인터입니다. 변수의 값인 바이트에 저장된 실제 숫자는 나머지 JVM 메모리의 메모리 주소를 나타냅니다. 따라서 그 숫자를 어디에도없는 주소로 설정하는 것이 가능하고 의미가 있습니다. 이는 null 값입니다.

그러나 int 또는 char과 같은 기본 문자는 숫자 (정수 또는 ASCII 코드)로 해석되는 숫자이며 메모리가 저장할 수있는 모든 문자가 있기 때문에 숫자가 아닌 숫자로 만들 수는 없습니다. 숫자입니다.

1

참조 값 (종종 참조 용)은이 개체에 대한 포인터이며 개체가없는 특수한 null 참조입니다. jls-4.3.1으로 당

, 대상물의 존재없이 null 기준에 대해 걸릴 무의미하다.

0

unboxing/autoboxing을 참조하면, 컴파일러가 연속체를 "원시"에서 객체로 또는 그 반대로 "캐스팅"하지 않도록하는 두 가지 방법이 있다고 상상해보십시오.하지만 그들은 완벽하지 않습니다.

정수 래퍼가 null이고 부서를 수행하면 어떻게됩니까? Java가 참조되지 않은 객체를 unbox 할 수 없으므로 0으로 나눈 값이 아닌 Null 포인터 예외입니다!

그래서 프리미티브와 객체에 대해 다른 초기화 규칙을 유지하는 것이 안전하고 논리적입니다.

1

위의 대답과 함께이 지점도 추가하고 싶습니다.

기본 유형의 경우 고정 메모리 크기, 즉 int는 4 바이트이고 char는 2 바이트입니다. 그리고 메모리 크기가 고정되어 있지 않기 때문에 객체에만 null이 사용됩니다. 우리가 기본적으로 그래서

,

int a=0; 

및 다른 원시 형 때문에 널 (null)은 기본 유형 개체에 대한 사용되지와

int a=null; 

동일하지 않습니다.

+1

이게 옳은 대답이라고 생각하지 않아요. 자바 숯에서 1 위는 어떤 특정한 이유 때문에 2 바이트입니다. google을 검색해주세요. 32 비트 및 64 비트 기본 유형에 대해서는 들어 본 적이 없습니다. Java는 OS가 독립적 인 Java의 첫 조건이기 때문에. – Vishrant

+0

고마워 형제 님, 방금 문자 메모리 공간에 대한 해답을 설명해 주었고 마음 속에는 한 문자로 된 문자열이 있었기 때문에 1 바이트가되었습니다. 하지만 2 바이트 –

관련 문제