2011-04-01 5 views
16

정확하게 파견되는 것이 무엇인지 혼란 스럽다. 특히 이중 급파에 관해서. 이 개념을 이해할 수있는 간단한 방법이 있습니까?자바로 파견되는 것

+0

haha ​​yea ... 내가 파견을 이해하면 나는 방문자 패턴을 더 잘 이해할 것이라고 생각했다. – thunderousNinja

+0

아 맞다. 죄송합니다, 태그를 제거하겠습니다. 이것은 디자인 패턴과는 아무런 관련이 없습니다. – BalusC

+1

"디스 패칭"이란 용어는 다소 과부하입니다. 또한 예약 된 작업을 프로세서에 적용하는 작업을 의미 할 수도 있습니다. 일부 실시간 스케줄러에서는 스케줄러와 디스패처 개념이 뚜렷한 아이디어와 소프트웨어 구성 요소입니다. – andersoj

답변

29

Dispatch는 언어가 함수/메소드 정의를 호출하는 방식입니다.

자바에서는 클래스가 동일한 이름이지만 매개 변수 유형이 다른 여러 메서드가있을 수 있으며 언어는 메서드 호출이 실제 매개 변수와 가장 구체적인 형식을 가진 메서드에 전달되도록 지정합니다 일치 할 수 있습니다. 그것은 정적 파견입니다. 예를 들어

,

void foo(String s) { ... } 
void foo(Object o) { ... } 
{ foo("");   } // statically dispatched to foo(String) 
{ foo(new Object()); } // statically dispatched to foo(Object) 
{ foo((Object) ""); } // statically dispatched to foo(Object) 

자바는 가상 메소드 디스패치있다. 하위 클래스는 수퍼 클래스에서 선언 된 메서드를 재정의 할 수 있습니다. 따라서 런타임에 JVM은 메소드 호출을 런타임 유형 this에 적합한 메소드 버전으로 보내야합니다. 예를 들어

,

class Base { void foo() { ... } } 
class Derived extends Base { @Override void foo() { ... } } 


{ new Derived().foo(); } // Dynamically dispatched to Derived.foo. 
{ 
    Base x = new Base(); 
    x.foo();    // Dynamically dispatched to Base.foo. 
    x = new Derived();  // x's static type is still Base. 
    x.foo();    // Dynamically dispatched to Derived.foo. 
} 

번 디스패치은 디스패치 (또한 동적 불림) 정적런타임의 조합이다.

+0

감사합니다! 그것은 많은 도움이되었습니다. – thunderousNinja

+0

이것은 정말 멋지게 레이아웃 된 답변입니다. Java가 이중 디스패치 언어는 아니지만 이중 디스패치가 현재 예제의 컨텍스트에서 어떻게 표시되는지 예제를 추가 할 수 있습니까? 나는 그것이'x.foo ("")'와 같은 것이 될 것이라고 추측하고 있지만 그것을 보는 것이 매우 도움이 될 것이라고 생각합니다. – Ogen

+0

@Ogen, 자바에 대한 이중 디스패치입니다. 자바 스크립트를 사용할 수 있었습니까? –