변수는 객체 생성 중 메모리 할당 만 수행하므로 생성자 외부의 변수에 값을 할당해도 오류가 발생하지 않는 이유는 무엇입니까? 또한 특정 객체가 생성되지 않아서 할당 된 값의 위치는 무엇입니까?변수가 생성자 외부에서 어떻게 초기화 될 수 있습니까?
-3
A
답변
0
인스턴스 필드 이니셜 라이저 코드 (및 인스턴스 이니셜 라이저 블록)가 모두 생성자의 일부인 것처럼 실행되기 때문에.
변수는 객체 생성시 메모리 할당을받을
다음과 같이 사실, 순서는 다음과 같습니다
- 는 생성자 인수 식을 평가합니다.
- 아직 수행되지 않은 경우 클래스 초기화를 수행하십시오. (이것은 클래스의 수명 동안 한 번 발생합니다 ...)
- 클래스 및 수퍼 클래스 체인의 인스턴스 필드에 대한 메모리를 포함하여 객체의 메모리를 할당합니다.
- 기본값 인 초기화를 수행하십시오.
this(...)
또는super(...)
호출을 수행하십시오. (이것은 필드 초기화를 수행하고 생성자를 실행하는 체인을 되풀이합니다.)- 클래스 인스턴스 필드 초기화 프로그램과 정적 초기화 프로그램 블록을 소스 코드 순서로 실행합니다.
- 생성자의 나머지 부분을 실행합니다.
- 리프 생성자 인 경우 생성 된 개체를 반환하십시오. 그렇지 않으면 한 단계의 재귀를 푸십시오.
6 단계는 처리해야하는 필드 초기화 프로그램입니다. 이니셜 라이저 표현식과 블록에 대한 코드는 적절한 지점에서 생성자에 의해 호출되는 합성 메소드로 결합됩니다. 그러나 이것이 구현 세부 사항입니다.
위에서 알 수 있듯이 개체에 할당 된 메모리 양은 매우 일찍 결정되며 초기화 논리의 영향을받지 않습니다. 개체 자체에서 변수를 표현하는 데 필요한 변수와 메모리 양은 무엇이든간에 동일합니다.
특정 개체가 생성되지 않았으므로이 할당 된 값의 위치는 무엇입니까?
필드의 위치는 3 단계에서 할당 된 개체의 일부입니다. 초기화가 생성자에서 수행 된 경우와 같습니다.
는 (아마 당신은 당신이 필드 개체 또는 배열을 할당 할 때 실제로 일어나는 일에 대해 혼란스러워했다? 기억 객체와 배열 유형 참조 유형라고 그. 유형이 필드 또는 변수는 참조 유형이에 해당하는 것입니다 보유 할 위치 그냥 참조 ... 참조가 참조하는 객체의 실제 상태가 아님)
(아마도 사용자가 생성자를 호출하는 것이 정상적인 메소드를 호출하는 것과 같다고 생각했을 것입니다 .그건 그렇지 않다 ... 위 참조)
관련 문제
- 1. 위젯 생성자 외부에서 windowFlags를 변경할 수 있습니까?
- 2. Prestashop 외부에서 AdminController를 초기화 할 수 있습니까?
- 3. 생성자 외부에서 인스턴스화간에 차이가 있습니까?
- 4. OCaml 값은 어떻게 최상위 외부에서 인쇄 될 수 있습니까?
- 5. JAAS - Subject는 LoginModule 외부에서 어떻게 검색 될 수 있습니까?
- 6. member struct가 memset을 호출하지 않고 생성자 초기화 목록에서 0 초기화 될 수 있습니까?
- 7. 부두가 초기화 될 때 PORT를 어떻게 알 수 있습니까?
- 8. 왜 우리는 생성자 초기화 목록에서 정적 변수를 초기화 할 수 없지만 생성자 본문에서 할 수 있습니다.
- 9. 변수가 런타임에 정의 될 것이라고 pylint에 어떻게 알릴 수 있습니까?
- 10. 인터페이스는 클래스 내에서 어떻게 변수가 될 수 있습니까?
- 11. 인스턴스 변수가 UITableViewController에서 어떻게 할당 해제 될 수 있습니까?
- 12. malloc으로 인해 메모리가 초기화 될 수 있습니까?
- 13. Java : 생성자 내부 또는 외부에서 개체를 초기화 중입니까?
- 14. 클래스 생성자 외부에서 정적 멤버가 아닌 멤버를 초기화 할 수 있습니까?
- 15. 클래스 변수가 클래스의 인스턴스가 될 수 있습니까?
- 16. 개체가 함수에서 매개 변수가 될 수 있습니까?
- 17. 파이썬에서 얼마나 큰 변수가 될 수 있습니까?
- 18. 초기화 초기화 목록이 아닌 생성자 범위에서 초기화
- 19. 어떻게 C++의 생성자 초기화 목록을 통해 클래스의 private struct 멤버를 초기화 할 수 있습니까?
- 20. 생성자 초기화 후
- 21. dll 파일을 초기화 할 수 있습니까? Dll 생성자
- 22. 생성자 외부에서 JavaScript의 생성자 메서드를 변경합니까?
- 23. 생성자 - Java로 초기화 배열
- 24. 클래스 생성자 초기화?
- 25. using 문을 생성자 초기화 목록에 표시 할 수 있습니까?
- 26. 어떻게 숫자가 될 수 있습니까?
- 27. 왜 값 유형 필드가 초기화되는 대신 초기화 될 수 있습니까?
- 28. 어떻게 적절하게 UITableViewCell을 초기화 할 수 있습니까?
- 29. SystemC에서 소멸자를 어떻게 선언 할 수 있습니까?
- 30. 이벤트가 발생하면 함수가 어떻게 트리거 될 수 있습니까?
필드 초기화 프로그램은 생성자 본문보다 먼저 실행된다. 메모리 할당 자체는 * 생성자가 실행되기 전에 한 번 발생합니다. –
다음에이 언어 선택이 이루어진 이유에 대해 [James Gosling] (https://en.m.wikipedia.org/wiki/James_Gosling)에게 물어볼 것입니다. – Bohemian
내 질문이 보류 상태 인 이유는 무엇입니까? @ 보헤미안. 이 규칙이 JAVA에있는 이유를 묻지 않고 초기화 된 값의 위치가 무엇인지 알고 싶습니다. Plz 내 보류하기 전에 내 질문을 이해하려고합니다. –