클래스 변수(정적 변수)>정적 블록>구성 방법>일반 멤버 변수>하위 클래스의 경우 정적을 제외합니다. JAVA의 모든 정적 수정은 컴파일 타임에 공간을 할당하며 객체는 사용될 때만 할당됩니다. 즉, new가 사용될 때 하위 클래스가 상위 클래스를 상속할 때 먼저 상위 클래스에 할당되어야 합니다. 아버지 없이도 아들이 나올 수 있잖아요
명령줄의 javap -l -c -p -v App 명령어는 실행 후 디컴파일된 내용을 가져옵니다. 질문자가 제공한 소스 코드를 바탕으로 간단히 분석해 보겠습니다. 다음은 초기화 관련 디컴파일된 내용의 일부입니다 App의 클래스 파일
으아아아
SubClass의 클래스 파일
으아아아
SuperClass의 클래스 파일
으아아아
내용을 대략적으로 설명해주세요. (주제가 JVM指令集에 관심이 있다면 JVM 사양을 읽어보시면 아주 자세하게 설명되어 있습니다.) 위 디컴파일 내용 중 별표 표시된 부분이 제가 추가한 주석입니다. 코드 실행 순서에 따라: 1. JVM은 App 클래스를 로드하고, 이때 App의 정적 변수는 앱 调用App的构造函数 바이트코드에 따라 초기화됩니다. > 2. 의 생성자로 이동하여 먼저 App의 AppObject에 해당하는 상위 클래스 调用Object的构造函数를 초기화합니다. 3. App의 SubClass에 해당하는 인스턴스 변수 调用SubClass的构造函数를 초기화합니다. 4. 이때 는 첫 번째 클래스로 로드되어야 하며, SubClass의 SubClass静态块5에 해당하는 정적 변수를 초기화하고 정적 블록을 실행해야 합니다. 이때 의 코드를 실행하면 " 1" SubClass6. SubClass의 SubClass7에 해당하는 构造函数이 로드된 후 생성자를 실행합니다. 생성자는 처음에 SubClassSuperClass의 생성자를 실행합니다. 🎜>8 in SubClass. 调用SuperClass的构造函数의 생성자에서 코드 인쇄를 실행합니다. "Get string construction SuperClass"를 종료합니다. 9. SuperClass 생성 완료 7의 코드 위치로 이동하여 계속 실행합니다. SuperClass 나머지 코드 return 10. SubClass의 생성자 코드를 실행하여 출력 "2"를 인쇄합니다. 11. 3의 코드 위치에 SubClass 생성자 를 실행한 후 의 나머지 코드를 계속 실행합니다. SubClassreturn 12. App의 생성자 코드를 실행하고 " 4"를 출력합니다 13. App의 생성자 을 실행한 후 1의 코드 위치로 이동하여 초기화를 진행합니다. 정적 변수 App14. 정적 블록에서 메소드를 실행하고 "3"을 허용합니다 return15. 입력 메소드를 입력하고 “Hello”를 인쇄합니다 main위 과정은 대략적인 실행 순서입니다.
클래스 변수(정적 변수)>정적 블록>구성 방법>일반 멤버 변수>하위 클래스의 경우 정적을 제외합니다. JAVA의 모든 정적 수정은 컴파일 타임에 공간을 할당하며 객체는 사용될 때만 할당됩니다. 즉, new가 사용될 때 하위 클래스가 상위 클래스를 상속할 때 먼저 상위 클래스에 할당되어야 합니다. 아버지 없이도 아들이 나올 수 있잖아요
컴파일된
class
파일을 디컴파일하여 초기화 과정의 이해를 도울 수 있습니다.명령줄의
으아아아javap -l -c -p -v App
명령어는 실행 후 디컴파일된 내용을 가져옵니다. 질문자가 제공한 소스 코드를 바탕으로 간단히 분석해 보겠습니다.다음은 초기화 관련 디컴파일된 내용의 일부입니다
App
의 클래스 파일
으아아아SubClass
의 클래스 파일
으아아아SuperClass
의 클래스 파일내용을 대략적으로 설명해주세요. (주제가
JVM指令集
에 관심이 있다면JVM
사양을 읽어보시면 아주 자세하게 설명되어 있습니다.)위 디컴파일 내용 중 별표 표시된 부분이 제가 추가한 주석입니다. 코드 실행 순서에 따라:
1. JVM은
App
클래스를 로드하고, 이때App
의 정적 변수는 앱 调用App的构造函数 바이트코드에 따라 초기화됩니다. > 2.의 생성자로 이동하여 먼저 App의
App
Object
에 해당하는 상위 클래스调用Object的构造函数
를 초기화합니다. 3. App의SubClass
에 해당하는 인스턴스 변수调用SubClass的构造函数
를 초기화합니다. 4. 이때는 첫 번째 클래스로 로드되어야 하며, SubClass의
SubClass
静态块
5에 해당하는 정적 변수를 초기화하고 정적 블록을 실행해야 합니다. 이때의 코드를 실행하면 " 1"
SubClass
6. SubClass의SubClass
7에 해당하는构造函数
이 로드된 후 생성자를 실행합니다.생성자는 처음에
SubClass
SuperClass의 생성자를 실행합니다. 🎜>8 in SubClass.调用SuperClass的构造函数
의 생성자에서 코드 인쇄를 실행합니다. "Get string construction SuperClass"를 종료합니다.9.
SuperClass
생성 완료7의 코드 위치로 이동하여 계속 실행합니다.
SuperClass
나머지 코드return
10.SubClass
의 생성자 코드를 실행하여 출력 "2"를 인쇄합니다.11. 3의 코드 위치에
SubClass
생성자를 실행한 후 의 나머지 코드를 계속 실행합니다.
SubClass
return
12.App
의 생성자 코드를 실행하고 " 4"를 출력합니다13.
App
의 생성자을 실행한 후 1의 코드 위치로 이동하여 초기화를 진행합니다. 정적 변수
App
14. 정적 블록에서 메소드를 실행하고 "3"을 허용합니다return
15.입력 메소드를 입력하고 “Hello”를 인쇄합니다
main
위 과정은 대략적인 실행 순서입니다.답변 내용이 다소 헷갈릴 수 있으니 이해가 안 되는 부분이 있으면 저에게 물어보세요.