java

2011-04-01 11 views
16

'da ne gönderiyor ne tam olarak ne gönderdiği konusunda kafam karıştı. Özellikle çift gönderim söz konusu olduğunda. Bu konsepti kavramanın basit bir yolu var mı?java

+0

haha ​​yea ... ben anladım eğer anladım, ben ziyaretçi desen daha iyi bir anlayış alacağını düşündüm – thunderousNinja

+0

Ah evet. Üzgünüz, etiketi kaldıracağım. Bu tasarım desenleri ile ilgisi yok :) – BalusC

+1

Sadece "gönderme" terimi biraz aşırı yüklü olduğunu not etmek için. Ayrıca zamanlanmış görevlerin bir işlemci üzerine işlenmesi anlamına da gelebilir. Bazı gerçek zamanlı zamanlayıcılarda, bir zamanlayıcı ve bir dağıtıcı kavramı, farklı fikirler ve yazılım bileşenleridir. – andersoj

cevap

29

Bir dil, işlev/yöntem tanımlarına yapılan çağrıları gönderme biçimidir.

Java'da, bir sınıf aynı ada sahip ancak farklı parametre türlerine sahip birden çok yönteme sahip olabilir ve dil, yöntem çağrılarının, gerçek parametrelerin en spesifik türlerine sahip doğru parametrelerle yönteme gönderildiğini belirtir. eşleşebilir. Bu statik sevk. Örneğin

,

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) 

Java da sanal yöntem sevkini sahiptir. Bir alt sınıf, bir üst sınıfta bildirilen bir yöntemi geçersiz kılabilir. Bu nedenle, çalışma zamanında JVM, yöntem çağrısını, this çalışma zamanı türüne uygun yöntemin sürümüne göndermelidir. Örneğin

,

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. 
} 

çift gönderme neşriyatına (aynı zamanda dinamik adlandırılır) statik ve çalışma zamanı birleşimidir.

+0

Teşekkürler! Bu çok yardımcı oldu. – thunderousNinja

+0

Bu gerçekten güzel bir yanıttır. Java'nın çift gönderim dili olmadığını biliyorum, ancak şu anki örnekleriniz bağlamında nasıl çift sevginin WULD gibi göründüğüne dair bir örnek ekleyebilecek misiniz? Sanırım x.foo ("") 'gibi bir şey olurdu ama bunu görmenin çok faydalı olacağını düşünüyorum. – Ogen

+0

@Ogen, bu Java'daki çift gönderim hakkında. JavaScript'i kastedebilir misiniz? –