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 번 호출해야합니까?개체 배열을 통해 생성자를 호출합니다.
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 번 호출해야합니까?개체 배열을 통해 생성자를 호출합니다.
라인
A obj[30] = new A[30];
는 A
의 생성자를 호출하지 않습니다. A
에 대한 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];
^
아니요,이 행은 생성자를 전혀 호출하지 않습니다. 그냥 A
유형의 30 요소 길이 배열을 만듭니다. 배열의 각 요소는 null
입니다.
이 정확하게 당신이 원하는 일을 할 수있는 방법은 없지만, 여기 모두 기본 생성자에게 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")으로 만들어지면 객체는 사용자가 만든 모든 객체에 대한 기본 생성자를 호출하고 액세스 할 수 있습니다. (기본 생성자가 없으면 아무 응답도 컴파일되지 않습니다.)
ifeteter (정적이 아닌)를 취하면 if int b를 말할 수 있습니다. then obj [0] .b = 1; 널 포인터 예외를 말합니다, 알겠습니다. 그러나 howcome obj [0] .i = 3; 작동합니까? – Nil
'i'는 정적이고 값을 보유하기 위해'A'의 인스턴스가 필요 없기 때문에 작동합니다. – Reimeus