Java'da statik yöntemler her zaman derleme zamanında çözülüyor mu?Java'da statik yöntemler her zaman derleme zamanında çözülüyor mu?
cevap
Kısa cevap: evet
Ben Java Language Specification kesin bölümünü bulmak mümkün değildi. Lütfen yardım et. :)
Evet, ancak statik yöntem çalışma zamanı tarafından kaldırılmışsa, temel sınıftaki eşleşen yöntem çağrılır (ad ve imza, derleme süresinden itibaren orijinal yöntemle tam olarak eşleşmelidir ve yönteme JVM tarafından erişilebilir olmalıdır) spec kuralları).
Derived.fn();
Ve aşağıdaki denilen kod:
class Base {
public static void fn() {
System.err.println("Base");
}
}
class Derived extends Base {
public static void fn() {
System.err.println("Derived");
}
}
Baskı Derived
Şimdi her şeyi derledim.
class Derived extends Base {
}
Baskı Base
: Sonra sadece Türetilmiş yeniden derlemek için değiştirildi.
class Derived {
}
bir hata Atar: Belki o zaman sadece Türetilmiş yeniden derlemek
olarak değiştirildi.
"Çalışma zamanı tarafından kaldırıldı"? Bu ne anlama geliyor? –
Bunun anlamı: eğer bir sınıf Sub.x() çağırmak için derlenmişse, o zaman x() yöntemi Sub'dan silinir fakat arayan sınıfı tekrar derlenmez, çalışma zamanında Base.x() eğer çağrılırsa var. – erickson
+1 muhtemelen bu soruya doğru bir yaklaşım – dfa
Çeşitli tırnak: derleyici o kesin yöntem her statik yöntem çağrısı (yani statik olmayan yönteme büyük bir fark var çağrıları için çağrılır derleme zamanında karar o sınıfı derlediğinde
": Kesin bir yöntem olduğu çağrılan sadece bu durumlarda çalışma zamanında karar verilir. "
"Statik yöntemlerin çağrılması, yalnızca çağrıldığı derleme zamanı türüne bağlıdır."
Soru için doğru yanıt, ancak yalnızca çalışma zamanında karar verilen statik olmayan yöntemlerle ilgili alıntı yanlıştır. Çalışma zamanında yalnızca geçersiz kılınan yöntemlere karar verilir, diğerleri de dahil olmak üzere derleme zamanında belirlenir. – Robin
@Robin: alıntı benim değil, iyi bir nokta olsa :) –
Bağlantı ölü gibi görünüyor –
kuralı uygulandığında, herhangi bir tehlikeli durum var mı? –
Başka bir kısa cevap: Hayır. –
@Joao: Java statik değiştiricisi tam olarak "derleme zamanında" anlamına gelir. Yöntem/değişken, sınıf adına statik olarak bağlanır. İstisna yok. – dfa