1

: 컴파일러와 런타임 시스템이 Java에서 중첩 된 유형을 처리하는 방법은 무엇입니까? 컴파일러는 같은 약 중첩 된 유형을 알고하는 방법

  • 익명 클래스
  • 중첩 된 인터페이스
    • 중첩 된 내부 클래스를 ..... 등

      clearity이 필요 ... ....

    +2

    질문이 명확하지 않습니다. 컴파일러를 작성하고 있습니까? 그렇지 않다면 왜 알고 싶습니까? 내 이해를 위해 – Azodious

    +0

    ........ – Prateek

    +0

    pls. 그들을 사용하는 방법과 같은 다른 것들에 시간을 투자하십시오. 컴파일러가 그들을 어떻게 구별하고 구별하는지에 관한 것이 아닙니다. – Azodious

    답변

    6

    컴파일러는 내부 클래스를 추출하고 creat 각 파일에 대해 *class 파일을 분리합니다. 내부 클래스 이름은 OuterClassName$InnerClassName으로 생성됩니다. 익명 내부 클래스에는 이름이 없으므로 이름은 OuterClassName$1, OuterClassName$2 등으로 생성됩니다.

    내부 클래스는 OuterClassName.this 구문을 사용하는 외부 클래스의 인스턴스에 대한 특별한 참조를 갖습니다.

    내부 클래스가 별도의 클래스 파일로 컴파일되므로 JVM은 내부 클래스를 전혀 처리하지 않습니다. 위에서 설명한 "특별"이름을 가진 일반 클래스를 처리합니다.

    +0

    +1에 대한 명확한 설명 –

    +1

    +1 Java는 동일한 외부 클래스의 private 멤버에 액세스하는 중첩 클래스를 지원하지만 JVM은 지원하지 않습니다. 컴파일러가하는 일은 'access $ 100'과 같은 이름을 가진 접근 자 메소드를 추가하여 같은 외부 클래스를 공유하는 다른 클래스의 private 필드, 메소드 및 생성자에 대한 클래스 액세스를 제공합니다. 호출 스택에 이러한 이상한 방법 중 하나가 표시되면 이것이 의미하는 바입니다. –