2012-09-23 5 views
1
class A 
{ 
    static int i; 
    A() 
    { 
    System.out.println(++i); 
    } 
    public static void main(String h[]) 
    { 
    A obj[] = new A[30]; 
    } 
} 

obj [30] = new A [30]; : -이 행은 기본 생성자를 30 번 호출해야합니까?개체 배열을 통해 생성자를 호출합니다.

+0

ifeteter (정적이 아닌)를 취하면 if int b를 말할 수 있습니다. then obj [0] .b = 1; 널 포인터 예외를 말합니다, 알겠습니다. 그러나 howcome obj [0] .i = 3; 작동합니까? – Nil

+0

'i'는 정적이고 값을 보유하기 위해'A'의 인스턴스가 필요 없기 때문에 작동합니다. – Reimeus

답변

11

라인

A obj[30] = new A[30]; 

A의 생성자를 호출하지 않습니다. A에 대한 30 개의 인스턴스화되지 않은 참조를 만듭니다.

는 30 개체 참조를 인스턴스화하려면 사용할 수 있습니다

for (int i=0; i < obj.length; i++) { 
    obj[i] = new A(); 
} 

주, 배열의 30의 첫 번째 사용 : 요소의 수를 주어진이 경우

A obj[] = { new A(), new A(), ..28 more -> 
}; 

이상 크기 선언은 불법입니다.

A obj[30] = new A[30]; 
    ^
+0

in C++ A obj [30]; 그랬 겠지? – Nil

+0

C++을 사용한 이후로 꽤 오랜 시간이 걸렸지 만 A 인스턴스가 30 인스턴스를 만들지는 않았을까 ...? –

+0

obj [30] = 새 A [30]; ... 오타를 유감스럽게 생각합니다. 그리고 나는 루프 또는 재귀를 사용하지 않는 구현을 원했기 때문에 첫 번째 메소드 덕분에 – Nil

2

아니요,이 행은 생성자를 전혀 호출하지 않습니다. 그냥 A 유형의 30 요소 길이 배열을 만듭니다. 배열의 각 요소는 null입니다.

0

이 정확하게 당신이 원하는 일을 할 수있는 방법은 없지만, 여기 모두 기본 생성자에게 30 시간 전화, 가까이 와서 두 가지이다 :

A *obj = new A[30]; 

또는

A obj[30]; 

을 첫 번째 대답은 힙에 각각 30 개의 A 개체 배열을 만들고 각 개체에 대한 기본 생성자를 호출합니다. obj는 스택에 없으므로이 함수의 호출자에게 되돌려 보낼 수 있습니다. 문제는 obj가 더 이상 A [30] 유형이 아니므로 sizeof (obj)가 원래 질문의 코드와 다를 것입니다. (참고로 "delete []"는 "delete"뿐만 아니라 obj에도 사용해야합니다.)

두 번째 대답은 스택에 30 개의 A 개체 배열을 생성합니다. 이제 컴파일러는 obj가 30 개 요소를 가지고 있으며 sizeof (obj)가 질문과 같을 것임을 이해합니다. 그러나 obj는 함수가 반환되면 프로세스에서 30 개의 소멸자를 호출하여 스택에서 제거되므로이 함수 (또는 호출하는 함수) 내에서만 사용할 수 있습니다.

C++ (또는 다른 좋은 객체 지향 언어)를 사용하면 객체를 만드는 것은 항상 공간을 할당하고 생성자를 호출하는 것을 의미합니다. 그렇지 않으면, 당신은 정말로 유용한 객체를 가지고 있지 않습니다. 따라서 객체가 지원되는 방식 (로컬 변수 또는 C++의 경우 "new")으로 만들어지면 객체는 사용자가 만든 모든 객체에 대한 기본 생성자를 호출하고 액세스 할 수 있습니다. (기본 생성자가 없으면 아무 응답도 컴파일되지 않습니다.)

관련 문제