2012-04-19 2 views
4

C++이 상속 (다중, 가상 등)이있는 상태에서 가상 테이블을 관리하는 방법과 객체를 메모리에 배치하는 방법에 대해 많이 배웠습니다.Java 메소드 테이블

이제 Java는 상속의 단 한 줄, 인스턴스 메소드 숨기기 등을 걱정할 필요가 있습니다. 따라서 가상 테이블은이 경우 좀 더 간단해야합니다. 나는 Class 파일이 메소드 영역의 "게이트웨이"역할을한다는 것을 알고 있습니다. 여기서 유형 정의는 메소드 바이트 코드를 포함하여 저장됩니다. 다음 두 가지 질문은 내 마음에 온다 :

  1. Java에서 vtable/method 테이블 구조가 일반적으로 있습니까? 개체가 저장되고 연결된 개체는 Class입니까?
  2. 상속/동적 메서드 호출이 어떻게 해결 되었습니까? 내 말은있다 :라고

    class A{ int f(){...} } 
    class B extends A{ int f(){...} } 
    
    A a = new B(); 
    a.f(); 
    

    F() B에서 : 다음 클래스와 인스턴스 생성을 갖는

. Class B의 파일을 통해 올바른 메소드 포인터를 해석하고 있습니까?

미리 의견을 보내 주셔서 감사합니다.

답변

3

a.f()에 대한 호출로 자바 바이트 코드의 어셈블리 언어로 구현된다. 그러나 보시다시피, 클래스 형식은 매우 추상적이며 JVM은 "효율적인"구현을 위해 클래스를로드하는 모든 자유를가집니다.

+0

예. 나는 런타임에 해상도가 B의'Class' 파일을 사용하고 거기에서 메소드를로드 할 것이라고 생각한다. 그래서 B.f()가 호출되는 것이다. – Bober02

3

Here은 적절한 링크가 포함 된 답변과 관련된 질문입니다. 내가 언급 한 SO 질문에서 명확히 밝혀지지 않은 한 가지 사실은 Java의 모든 메소드가 암시 적으로 가상이라는 것입니다. 기술 세부 사항에 대해 궁금하다면 jvm.h ("vtable"문자열 검색)을보십시오.

3

Java에서 수행해야하는 작업 만 지정됩니다. 어떻게 수행합니까? C++에서 허용하지 않는 방식으로 코드를 최적화 할 수 있다는 점에서 이점이 있습니다. 예를 들어, "가상"메소드는 다른 라이브러리/jar에서 가져온 것이라도 JVM에 의해 인라인 될 수 있습니다. 런타임에서

aload_1 // load the local variable a, here from local address 1 
invokevirtual with index into the constant pool for 
    method ref: 
     class "A" 
     nameAndType "f", "()I" 

이 가능하게 VTABLE 다음() B.f에 대한 호출을 해결 :

+0

OK, 가능한 해결책은 모두 성공적 이었습니까? 어떻게 일을합니까? – Bober02

+1

나는 a) 당신이 알 필요가 없다는 것을 말하고 싶다. b) 언제든지 바뀔 수 있으므로 특정 구현에 대한 해결책을 원할 수 없다. C++에서는 일단 변경되지 않는다고 판단한 코드를 컴파일하고, 그렇지 않은 Java에서는 프로그램이 실행되는 동안 변경됩니다. –