2009-11-11 4 views
0

이 코드를 실행 :VTBL은 Java에서 어떻게 구현됩니까?

class A {                  
    public int x;                 
    public A() {                 
    function();                 
    }                    
    public void function() {              
    this.x = 20;                 
    }       
    public void printhey() { System.out.println("Hey"); }            
}                    

class B extends A { 
    public B() { 
    super(); 
    printhey(); 
    }               
    public void function() {              
    this.x = 50;                 
    }                    
}                    

public class tmp {                
    public static void main(String[] args) {          
    System.out.println((new B()).x);            
    }                    
}  

인쇄 아웃 :

Hey 
50 

는 누가 VTBL을 설정? A의 생성자에서 function은 이미 B로 설정되어 있습니다. 그러나 B의 생성자에서 printhey은 A로 설정됩니다.

답변

6

"VTBL은 저장소 구조를 처리하는 언어의 아티팩트입니다. 즉, C++에서는 클래스가 RAM에 매핑되는 방식을 정확하게 정확하게 추론 할 수 있습니다.

자바는 저장소 구조를 다루지 않으며 데이터 구조를 다룹니다. 저장소 구조를 데이터 구조로 쉽게 사용할 수 있지만 그 반대는 그리 간단하지 않습니다. 1991 년 초 BYTE 매거진의 사본을 가지고 있다면 Commodore Amiga OS ROM 커널 (Exec)에서 사용하는 저장 구조에 C++ 데이터 구조를 매핑하는 장점을 칭찬 한 기사를 찾을 수도 있습니다. 그 당시 사실상, "데이터 구조"라는 용어는 일종의 포괄적 인 것으로 사용되었는데, 우리가 물건이 어떻게 정확하게 메모리에 들어 맞을지 걱정했기 때문입니다.

데이터 구조는 일반적으로 알고리즘에 의해 사용됩니다. 저장소 구조는 내부 구현 및 직렬화 된 형식과 더 밀접하게 관련됩니다. 실제 프로그램 실행에는 두 가지가 모두 필요하지만 Java 데이터 구조의 기본 저장소 구조는 불투명합니다. Java를 "Write Once, Run Anywhere"로 만드는 이유 중 상당 부분입니다. 사물의 크기와 바이트 방향에 대해 걱정할 필요가 없다면 "swabbers"및 메모리 오프셋 계산기로 앱을로드 할 필요가 없습니다.

일부 프로그래밍 언어는 순방향 참조와 순환 참조를 좋아하지 않습니다. 자바는 그들 없이는 열심히 할 것입니다. 그러나 코드에 대한 하드 레퍼런스와 바이트 코드에 바인딩 된 메소드 서명에 대한 참조는 결국 JIT로 컴파일되어 머신 코드로 변환됩니다. 또는 일부 고급 JVMS에서 재 최적화 및 재 컴파일을 수행 할 수도 있습니다. 다 끝내주는 것은 사실상 수업을 여러 번 통과하는 것입니다. 하나는 사전을 만들고 다른 하나는 연결을 연결하는 것입니다. 적절한 경우 자동 인라인을 포함합니다.

+0

아주 좋은 대답, 타이.나는 다른 대답들에서 아이디어를 얻었지만 이것은 훨씬 더 설명 적이다. – Claudiu

0

간단한 대답은 '물론 JVM'입니다. B가로드 될 때까지 JVM은 클래스 계층 구조에 대한 완전한 지식을 갖고 있으며 모든 참조를 해결했습니다. C++과는 다릅니다. 물론 저는 VTBL을 은유 적으로 사용하는 것으로 해석합니다. 심각한 JRE에는 VTBL과 같은 실제 데이터 구조가 없습니다.

+0

"생성자가 최종 사용자가 아닌 사람에게 전화를 걸 수 없음"은 무엇을 의미합니까? 방금 A의 생성자에서 printhey()를 호출했습니다. – Claudiu

+0

아, 내가 이것을 막아서 실수로 그것을 자바 요구 사항이라고 부르는 PMD 플래그를 기억하고 있었다. 편집이 시작됩니다. – bmargulies

2

Java에서 VTBL 개념이 없습니다. 에고, VTBL이 없습니다.

생성 된 객체는 새로운 B()이며 B는 (A에서 상 속됨에 따라 B에서 정의 된) 함수와 (A에서 상속 된) printhey를가집니다. 그래서 X는 B의 생성자를 통해 호출 된 50-A의 생성자에 할당되고 'function'(B에서)을 호출하여 집합 연산을 수행합니다. 상속 된 fn을 호출하는 'printhey'(B에서 super() 뒤의 행)를 호출합니다. 그런 다음 X를 얻은 인스턴스를 반환하므로 50을 참조하십시오.

+0

그래서 함수가 VTBL을 사용하여 구현되지 않았습니까? – Claudiu

+0

아니요, VTBL은 C++ 개념입니다. – AlBlue

+0

VTBL은 가상 디스패치를 ​​구현하는 가장 간단한 방법이지만 다른 방법이 있습니다. 그러나, 그저 구현 세부 – erikkallen

관련 문제