2016-12-27 1 views
-3

변수는 객체 생성 중 메모리 할당 만 수행하므로 생성자 외부의 변수에 값을 할당해도 오류가 발생하지 않는 이유는 무엇입니까? 또한 특정 객체가 생성되지 않아서 할당 된 값의 위치는 무엇입니까?변수가 생성자 외부에서 어떻게 초기화 될 수 있습니까?

+0

필드 초기화 프로그램은 생성자 본문보다 먼저 실행된다. 메모리 할당 자체는 * 생성자가 실행되기 전에 한 번 발생합니다. –

+0

다음에이 언어 선택이 이루어진 이유에 대해 [James Gosling] (https://en.m.wikipedia.org/wiki/James_Gosling)에게 물어볼 것입니다. – Bohemian

+0

내 질문이 보류 상태 인 이유는 무엇입니까? @ 보헤미안. 이 규칙이 JAVA에있는 이유를 묻지 않고 초기화 된 값의 위치가 무엇인지 알고 싶습니다. Plz 내 보류하기 전에 내 질문을 이해하려고합니다. –

답변

0

인스턴스 필드 이니셜 라이저 코드 (및 인스턴스 이니셜 라이저 블록)가 모두 생성자의 일부인 것처럼 실행되기 때문에.

변수는 객체 생성시 메모리 할당을받을

다음과 같이 사실, 순서는 다음과 같습니다

  1. 는 생성자 인수 식을 평가합니다.
  2. 아직 수행되지 않은 경우 클래스 초기화를 수행하십시오. (이것은 클래스의 수명 동안 한 번 발생합니다 ...)
  3. 클래스 및 수퍼 클래스 체인의 인스턴스 필드에 대한 메모리를 포함하여 객체의 메모리를 할당합니다.
  4. 기본값 인 초기화를 수행하십시오.
  5. this(...) 또는 super(...) 호출을 수행하십시오. (이것은 필드 초기화를 수행하고 생성자를 실행하는 체인을 되풀이합니다.)
  6. 클래스 인스턴스 필드 초기화 프로그램과 정적 초기화 프로그램 블록을 소스 코드 순서로 실행합니다.
  7. 생성자의 나머지 부분을 실행합니다.
  8. 리프 생성자 인 경우 생성 된 개체를 반환하십시오. 그렇지 않으면 한 단계의 재귀를 푸십시오.

6 단계는 처리해야하는 필드 초기화 프로그램입니다. 이니셜 라이저 표현식과 블록에 대한 코드는 적절한 지점에서 생성자에 의해 호출되는 합성 메소드로 결합됩니다. 그러나 이것이 구현 세부 사항입니다.

위에서 알 수 있듯이 개체에 할당 된 메모리 양은 매우 일찍 결정되며 초기화 논리의 영향을받지 않습니다. 개체 자체에서 변수를 표현하는 데 필요한 변수와 메모리 양은 무엇이든간에 동일합니다.

특정 개체가 생성되지 않았으므로이 할당 된 값의 위치는 무엇입니까?

필드의 위치는 3 단계에서 할당 된 개체의 일부입니다. 초기화가 생성자에서 수행 된 경우와 같습니다.

는 (아마 당신은 당신이 필드 개체 ​​또는 배열을 할당 할 때 실제로 일어나는 일에 대해 혼란스러워했다? 기억 객체와 배열 유형 참조 유형라고 그. 유형이 필드 또는 변수는 참조 유형이에 해당하는 것입니다 보유 할 위치 그냥 참조 ... 참조가 참조하는 객체의 실제 상태가 아님)

(아마도 사용자가 생성자를 호출하는 것이 정상적인 메소드를 호출하는 것과 같다고 생각했을 것입니다 .그건 그렇지 않다 ... 위 참조)

관련 문제