매우 일반적인 코드가 있습니다: System.out.println. 이것은 매우 일반적인 출력 명령문이지만 잠시 연구한 후 갑자기 소스 코드를 살펴보았습니다.
으아악out은 System 클래스에 정의되어 있으며 인스턴스화되지 않았습니다. Out은 단순한 null 변수입니다. 정적 객체라고 할 수도 없지만 PrintStream 클래스에서 println() 메서드를 호출할 수는 있습니다. 이미? 이유를 물어봐도 될까요?
我想大声告诉你2017-05-17 10:09:52
자세한 설명: 중국어 버전 http://www.cnblogs.com/skywan...
jdk7 기반 영어 버전 https://luckytoilet.wordpress...
滿天的星座2017-05-17 10:09:52
친애하는 여러분, 먼저 테스트 클래스를 시작할 때, 즉 테스트 클래스를 인스턴스화하면 호출하는 모든 정적 클래스가 먼저 인스턴스화되므로 실제로 System.out.println 문을 실행할 때 , System 클래스의 메서드와 속성이 초기화되었습니다!
仅有的幸福2017-05-17 10:09:52
정적 {
으아악}
위 정적 메서드의 주석에는 초기화를 위해 초기화SystemClass 메서드가 호출된다는 내용이 나와 있습니다. 이 메소드는 할당을 위해 사용되어야 합니다.
private static Native void setOut0(PrintStream out)은 로컬 메소드입니다.
天蓬老师2017-05-17 10:09:52
최종 정적을 봤을 때 첫 번째 반응은 이것이 상수이고 상수를 초기화해야 한다는 것이었습니다. 그런 다음 다시 찾아보니 과연
초기화하기 위해 로컬 메서드를 호출합니다.
给我你的怀抱2017-05-17 10:09:52
글쎄요, 초기화 작업은 초기화 시스템 클래스() 함수에서 이루어집니다. 이 함수는 시스템 스레드가 초기화된 후에 호출됩니다. 즉, 모든 정적 멤버 변수(err out in)가 이 함수에서 초기화됩니다.
예를 들어 다음과 같습니다.
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")) );
setOut0() 함수는 기본 레이어에 있으며, 여기서 초기화된 객체와 이 out 사이의 연결을 설정합니다