Aşağıdakileri göz önünde bulundurarak kendinizi statik bir yöntemi son haline getirmeyi düşünecek konumda bulabilirsiniz:
Aşağıdaki sınıflara sahip olmak:
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
Şimdi bu yöntemleri çağırmanın 'doğru' yolu,
A.ts();
B.ts();
sonuçlanır, AB
ancak yöntemleri örneklerde de çağırabilirsiniz:
A a = new A();
a.ts();
B b = new B();
b.ts();
bu da sonuçlanacaktır AB
.
Şimdi şunları düşünün:
A a = new B();
a.ts();
yazdırırdı A
. Aslında bir sınıf nesnesine sahip olduğunuz için bu sizi şaşırtabilir B
. Ama onu bir referans türünden aradığınız için A
arayacaktır A.ts()
. B
Aşağıdaki kodla yazdırabilirsiniz :
A a = new B();
((B)a).ts();
Her iki durumda da sahip olduğunuz nesne aslında sınıftan B
. Ancak nesneyi işaret eden işaretçiye bağlı olarak, yöntemi içinden A
veya içinden çağıracaksınız B
.
Şimdi, sınıfın geliştiricisi olduğunuzu A
ve alt sınıflamaya izin vermek istediğinizi varsayalım. Ama gerçekten metodu istiyorsun ts()
, ne zaman bir alt sınıftan çağrılsa bile, bu onun yapmasını istediğin şeyi yapıyor ve bir alt sınıf versiyonu tarafından gizlenmemesini istiyor. Sonra bunu yapabilir final
ve alt sınıfta gizlenmesini önleyebilirsiniz. Ve aşağıdaki kodun, sınıfınızdan yöntemi çağıracağından emin olabilirsiniz A
:
B b = new B();
b.ts();
Tamam, itiraf etmeliyim ki bu bir şekilde inşa edilmiş, ama bazı durumlarda mantıklı olabilir.
Örneklerde statik yöntemler çağırmamalısınız, ancak doğrudan sınıflarda - o zaman bu sorunu yaşamazsınız. Ayrıca örneğin IntelliJ IDEA, bir örnekte statik bir yöntem çağırırsanız ve ayrıca statik bir yöntemi sonlandırırsanız size bir uyarı gösterecektir.