2011-03-27 3 views
2

안녕하세요, 저는 개체와 참조를 분석 할 때 기본적인 의심을 가지고 있습니다.개체 및 참조가있는 Java 배열

int a; //here we are creating an object a of type integer 

Integer b=new Integer(); // here we are creating a reference variable b points to an object of type Integer in heap. 

각각의 장점은 무엇입니까? 어디에서 "int a"와 다른 하나를 사용할 수 있을까요 ?? 어레이의 경우

,

int[] a=new int a[5]; 

경우 이유있다 "는 값 int" "int로 A [5]"아래의 코드가 널 포인터 예외가 발생하기 때문에, 불가능

int a[5]; 
a[0]=10;  
System.out.println(a[0]); //gives null pointer exception 

int[] a=new int[5]; 
a[0]=5; 
System.out.println(a[0]); 

왜 경우 전자의 경우는 참조를 제외하면 생성 될 필요가있을 때 코드는 잘 작동 "int a"가 작동하면?

답변

1

int aint 유형의 기본 변수 인 a을 선언하고 있습니다. 프리미티브는 객체가 아니지만 프리미티브의 배열은 객체입니다.

배열은 객체이지만, 자바가 사용하기위한 특별한 구문을 가진 특별한 유형의 객체입니다. int[] a을 사용할 때 형식이 int 배열 인 a이라는 개체를 선언하고 있습니다. a = new int[5]으로 지정하면, 마치 특별한 방법으로 생성자를 호출하는 것처럼 보입니다. 마치 실제로 생성자를 호출하고 크기를 매개 변수로 전달하는 것처럼 보입니다 : a = new IntArray(5) 또는 뭔가. Java는 특별한 구문을 제공하므로 이러한 유형의 구조는 필요하지 않습니다.

마찬가지로 a[0] = 5을 말하면 오브젝트 a에 대한 메소드를 호출하는 것처럼 보이지만 Java에서는 이에 대한 특수 구문을 제공합니다. 마치 a.setValue(0, 5)이라고 부르는 것 같지만 자바는 멋진 문법을 제공하므로 이런 유형의 것이 필요하지 않습니다.

그래서 int a[5]을 선언하려고하면 변수 선언으로 이해가되지 않는 new IntArray(5) ...을 사용하여 변수를 선언하는 것과 같을 것입니다. 기본적으로 생성자에 대한 호출을 사용하여 변수를 선언하는 것이 좋을 것입니다.

1

이것은 int가 Object가 아니기 때문에 발생합니다. 원시 유형이며 null 일 수 없기 때문입니다. 정수는 객체이며 참조는 null 일 수 있습니다. 정수를 사용

int a[] = new int[5]; //is legal and all elements has 0 
Integer a[] = new Integer[5]; //is legal too but in this case you have null 

일반적인 경우는 개체로 갖고,이 경우, 예컨대에 모음이다

List<int> list = new ArrayList<int>   // Illegal 
List<Integer> list = new ArrayList<Integer> // OK 
0

int 프리미티브 타입이 Integer 사용한다. int은 메소드가있는 클래스 인 Integer이 더 효율적이므로 더 많은 메모리를 사용합니다.

int a[5];과 함께 실제 값이 아닌 참조를 만들기 때문에 첫 번째 배열 예제가 작동하지 않습니다 (따라서 사용하려고하면 NullPointerException가 표시됨). int[] a=new int[5];을 사용하면 사용할 실제 배열을 만들 수 있으므로 값을 사용할 수 있습니다.

0

a) 먼저 int a;은 개체를 선언하지 않습니다. 정수를 유지하는 것은 단지 var 일뿐입니다.

b) 프리미티브를 나타 내기 위해 객체를 만드는 오버 헤드를 피하려면 항상 래퍼 클래스보다 원시 데이터 유형을 사용하십시오. 당신이 5 개 정수 배열에 a를 초기화했기 때문에

C) int a[5]null를 가리키는 5 개 정수 배열에 대한 참조입니다, 따라서 a[0]는 각각 어떤 의미

D) int[] a = new int[5]; 작품 적절하게 코드를하지 않습니다 그 중 디폴트 값은 0입니다.

e) int a은 원시 데이터 형식 선언이므로 로컬 변수가 아니면 초기화 할 필요가 없습니다. 그러나 int[] a은 int 배열 참조이며 배열은 Java의 객체이므로 배열을 사용하기 전에 초기화해야합니다.

0

int a[5];은 암시 적으로 int a[5] = null; (java에서는 선언이 유효하지 않음)으로 이해됩니다. int[] a=new int[5];0 인 배열의 각 요소에 길이 5의 배열을 만듭니다.Integer[] a = new Integer[5]은 길이가 5 인 Integer의 배열을 만들고, 모든 요소의 기본값은 null입니다.

배열을 초기화하는 방법이 있습니다 (추가 메모 만 있음). 예 :이 길이 5 int의 배열과 (0부터 카운트)의 각 요소를 생성

int a[] = {1, 2, 3, 4, 5}; 

는 왼쪽에서 오른쪽으로 시작 괄호 {}의 값이 할당된다. JVM은 Integer 너무 JVM이 Integer의 전체 객체를 저장하기위한 메모리 공간을 만드는 Object 동안 int (예를 들어 4 바이트 INT)의 크기에 대한 메모리 공간을 생성하므로

또한 int는 원시 타입 인 (인 int의 메모리 공간보다 큽니다).

어디에 사용하는 "int로는"다른 하나

사용 Integer 당신이 (당신은 제네릭의 기본 형식을 사용할 수 있지만 int[] 또는 원시적 배열이 허용되기 때문에) 제네릭을 사용해야하는 경우 또는 Integer 클래스의 함수가 필요합니다. 그렇지 않으면 영구 저장 장치에 값을 저장하려면 int을 사용하십시오.

+0

'int a [5];는 Java에서 구문 오류이며'int a [5] = null; '이 될 것이라고 생각합니다. [JLS §8.3] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#40898)을 참조하십시오. 대괄호 안에는 아무것도 들어 있지 않습니다. –

+0

@ Paŭlo Ebermann, 좋은 관찰. 감사 –