인스턴스화되지 않은 정적 개체가 클래스의 비정적 메서드도 호출할 수 있나요?
为情所困
为情所困 2017-05-17 10:07:52
0
5
685

매우 일반적인 코드가 있습니다: System.out.println. 이것은 매우 일반적인 출력 명령문이지만 잠시 연구한 후 갑자기 소스 코드를 살펴보았습니다.

으아악

out은 System 클래스에 정의되어 있으며 인스턴스화되지 않았습니다. Out은 단순한 null 변수입니다. 정적 객체라고 할 수도 없지만 PrintStream 클래스에서 println() 메서드를 호출할 수는 있습니다. 이미? 이유를 물어봐도 될까요?

为情所困
为情所困

모든 응답(5)
我想大声告诉你

자세한 설명: 중국어 버전 http://www.cnblogs.com/skywan...
jdk7 기반 영어 버전 https://luckytoilet.wordpress...

滿天的星座

친애하는 여러분, 먼저 테스트 클래스를 시작할 때, 즉 테스트 클래스를 인스턴스화하면 호출하는 모든 정적 클래스가 먼저 인스턴스화되므로 실제로 System.out.println 문을 실행할 때 , System 클래스의 메서드와 속성이 초기화되었습니다!

仅有的幸福

정적 {

으아악

}
위 정적 메서드의 주석에는 초기화를 위해 초기화SystemClass 메서드가 호출된다는 내용이 나와 있습니다. 이 메소드는 할당을 위해 사용되어야 합니다.
private static Native void setOut0(PrintStream out)은 로컬 메소드입니다.

Peter_Zhu

최종 정적을 봤을 때 첫 번째 반응은 이것이 상수이고 상수를 초기화해야 한다는 것이었습니다. 그런 다음 다시 찾아보니 과연

초기화하기 위해 로컬 메서드를 호출합니다.

给我你的怀抱

글쎄요, 초기화 작업은 초기화 시스템 클래스() 함수에서 이루어집니다. 이 함수는 시스템 스레드가 초기화된 후에 호출됩니다. 즉, 모든 정적 멤버 변수(err out in)가 이 함수에서 초기화됩니다.
예를 들어 다음과 같습니다.
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")) );
setOut0() 함수는 기본 레이어에 있으며, 여기서 초기화된 객체와 이 out 사이의 연결을 설정합니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿