찾다

 >  Q&A  >  본문

인스턴스화되지 않은 정적 개체가 클래스의 비정적 메서드도 호출할 수 있나요?

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

으아악

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

为情所困为情所困2784일 전693

모든 응답(5)나는 대답할 것이다

  • 我想大声告诉你

    我想大声告诉你2017-05-17 10:09:52

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

    회신하다
    0
  • 滿天的星座

    滿天的星座2017-05-17 10:09:52

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

    회신하다
    0
  • 仅有的幸福

    仅有的幸福2017-05-17 10:09:52

    정적 {

    으아악

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

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-05-17 10:09:52

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

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

    회신하다
    0
  • 给我你的怀抱

    给我你的怀抱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 사이의 연결을 설정합니다

    회신하다
    0
  • 취소회신하다