2011-09-23 4 views
6

Olası Çoğalt:
Why doesn't Java allow overriding of static methods?Statik yöntemleri gizlemek için herhangi bir meşru neden var mı?

biri taban sınıfın bir static yöntemi gizlemek geçersiz kılma için türetilmiş bir sınıf neden isteyeyim meşru bir nedeni var mı?

+5

Geçersiz kılınmışlar. Gizli olabilirler. – BalusC

+0

Bu konuya bir göz atın - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost

+0

@BalusC Semantik ... Ne olursa olsun, hiç kimseyi düşünmüyorum soruyu cevapladı. – NullUserException

cevap

6

Terminolojide, Java'daki statik yöntemlerin, ikili uyumluluk bölümü 13.4.12 tarafından ima edilen bir tür geçersiz kılma ilişkisi vardır. Eğer T uzandığı S, S m() olarak bildirilirse, T.m(), T (S) 'nin T olarak bildirilmiş olmasına bağlı olarak, T veya S'deki bir yönteme başvurabilir; ve T.m() 'yi çağıran herhangi bir kodu kırmadan m()' den T'yi eklemek ya da kaldırmak tamam. (Bu, JVM invokestatic komutunun, süper sınıf zincirinde bir çeşit dinamik yöntem araması yapması anlamına gelir)

Bununla birlikte, bu bir sorun olmaktan başka bir şey değildir. Eğer T.m() 'in anlamı sessizce değişirse, bu gerçekten farklı bir yönteme işaret ediyorsa, gerçekten tehlikelidir. (Örnek yöntemler, sözleşme gerektirmez, bu yüzden sorun değil; statik yöntemlerde böyle bir anlayış yoktur.)

Bu "özellik" asla kullanılmamalıdır; dilin başlaması için etkinleştirmemeliydi.

İyi uygulama: Eğer T.m() olarak adlandırılırsak, m() T olarak bildirilmelidir; ve ilk önce tüm T.m() 'yi çıkarmadan T'den asla çıkarılmamalıdır.

+0

Hiçbir zaman kullanılmaması gerektiğine tamamen katılıyorum. Ancak, bu mümkün *. Herhangi bir meşru gerçek dünya örneğini düşünebilir misin? Java kariyerimde hiç karşılaşmadım. – BalusC

+0

Onlarla hiç karşılaşmadım, bu yüzden nadir insanlar statik yöntemleri "geçersiz kılmak" olmalıdır. Sanırım ilk defa http://stackoverflow.com/questions/6643648 – irreputable

+0

+1 ile ilgili başka bir zor soruyu araştırırken öğrendim. Ama bu tam olarak neyi bilmek istediğime göre, eğer bu mantıklı görünmüyorsa (en azından çoğumuz için). – Saket

4

Statik yöntemler bir yöntem iptal etmek için telefon

overriden olamaz, bir yöntem, ilk tarafından erişilebilir olmalıdır. Yöntem devralınmazsa, geçersiz kılma şansı yoktur. Bu nedenle, özel bir yöntemi devralındığı için geçersiz kılmaz.