SORU
26 Kasım 2008, ÇARŞAMBA


Java dinamik bağlama ve yöntem geçersiz kılma

İki saatlik teknik bir telefon görüşmem vardı dün, woohoo! geçtim) ama ben tamamen şu soruyu Java dinamik bağlama konusunda ciddi. Ve bir TA birkaç yıl önce ziyaret ettiğim lisans öğrencileri için bu kavramı öğretmek için kullanıyorum çünkü iki kat şaşırtıcı değil, onlara yanlış bilgi verdiğim umudu biraz rahatsız edici yani...

Burada bana verilen sorun:

/* What is the output of the following program? */

public class Test {

  public boolean equals( Test other ) {
    System.out.println( "Inside of Test.equals" );
    return false;
  }

  public static void main( String [] args ) {
    Object t1 = new Test();
    Object t2 = new Test();
    Test t3 = new Test();
    Object o1 = new Object();

    int count = 0;
    System.out.println( count   );// prints 0
    t1.equals( t2 ) ;
    System.out.println( count   );// prints 1
    t1.equals( t3 );
    System.out.println( count   );// prints 2
    t3.equals( o1 );
    System.out.println( count   );// prints 3
    t3.equals(t3);
    System.out.println( count   );// prints 4
    t3.equals(t2);
  }
}

Çıkışı equals() geçersiz kılınmış yöntemi içinde iki ayrı baskı tablolar gerektiğini savundum: t1.equals(t3) t3.equals(t3). İkinci durumda olduğu apaçık ortada, ve eski durumunda olsa bile t1 başvuru tipi Nesne, bu tür Test örneği olarak, çok dinamik bağlama çağırması gerekir geçersiz form yöntemi.

Görünüşe göre değil. Benim spiker programı bana kendimi, ve bak şu işe teşvik, geçersiz kılınmış yöntemi sadece tek bir çıkış vardı: satırında t3.equals(t3).

Benim sorum o zaman, neden? t1 Nesne türü (statik bağlama equals() yöntem Nesne çağırmanız), dinamik bağlayıcı bir referans olsa da zaten belirttiğim gibigerekirbaşvuru örneği Türüne göre yöntemin en özel sürüm yürütmesini iyi bak. Neyi kaçırıyorum?

CEVAP
26 Kasım 2008, ÇARŞAMBA


Java geçersiz olanlar için aşırı yöntemleri için bağlama, statik ve dinamik bağlama kullanır. Yöntemi aşırı eşittir örnek, (farklı parametre bir Nesne türü daha vardır.bu yöntem bağlı olarak tanımlanır. () eşittir), ^strong>başvurutür derleme.

Bazı tartışma here

Aslında bu eşittir yöntem değil gerçekten ilgili, diğer daha yaygın bir hata tekrar yerine geçersiz, zaten farkında dayanarak cevap sorunun içinde röportaj.

Edit: İyi bir açıklama 10* *de. Bu örnek, benzer bir sorun parametre türü yerine, ilgili, ama aynı sorundan kaynaklanıyor gösteriyor.

Eğer bağlama aslında dinamik olsaydı inanıyorum, o zaman arayan ve parametre Test örneği olduğu herhangi bir durumda geçersiz kılınmış yöntemi çağrıldığını neden olacaktır. Yani t3.eşittir(o1) baskı değil, sadece iyi olurdu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AceHoodVEVO

    AceHoodVEVO

    12 Mayıs 2009
  • GoogleTechTalks

    GoogleTechTa

    15 AĞUSTOS 2007
  • RyanXLT

    RyanXLT

    22 Ocak 2011