Bilmek isterim:
Statik yöntemler kelimenin tam anlamıyla geçersiz kılınamaz, ancak üst statik yöntemleri gizleyebilirler
Pratikte bu, derleyicinin hangi yöntemin çalıştırılacağına çalışma zamanında değil, derleme zamanında karar vereceği anlamına gelir.
Düzgün bir örnek için buraya bir göz atın.
Ve bu overriding örnek yöntemleri ile hiding sınıf (statik) yöntemleri arasındaki farkı açıklayan java belgeleridir.
Overriding: Java'da overriding basitçe, belirli bir yöntemin nesnenin çalışma zamanı türüne göre çağrılacağı anlamına gelir ve derleme zamanı türüne göre değil (overriden ile olduğu gibi statik yöntemler)
Gizleme: Statik olan üst sınıf yöntemleri alt sınıfın bir parçası değildir (erişilebilir olmalarına rağmen), bu nedenle geçersiz kılma. Bir alt sınıfa başka bir statik yöntem ekleseniz bile, ana sınıfındakiyle aynıdır, bu alt sınıf statik yöntemi benzersizdir ve ana sınıfındaki statik yöntemden farklıdır.
Statik yöntemler geçersiz kılınamaz, çünkü geçersiz kılınacak bir şey yoktur, çünkü bunlar iki farklı yöntem olacaktır. Örneğin
static class Class1 {
public static int Method1(){
return 0;
}
}
static class Class2 extends Class1 {
public static int Method1(){
return 1;
}
}
public static class Main {
public static void main(String[] args){
//Must explicitly chose Method1 from Class1 or Class2
Class1.Method1();
Class2.Method1();
}
}
Ve evet, statik metotlar diğer metotlar gibi aşırı yüklenebilir.
Statik yöntemler çalışma zamanında nesne örneğine gönderilmedikleri için geçersiz kılınamazlar. Hangi yöntemin çağrılacağına derleyici karar verir.
Yazdığınızda derleyici uyarısı almanızın nedeni budur
MyClass myObject = new MyClass();
myObject.myStaticMethod();
// should be written as
MyClass.myStaticMethod()
// because it is not dispatched on myObject
myObject = new MySubClass();
myObject.myStaticMethod();
// still calls the static method in MyClass, NOT in MySubClass
Statik yöntemler aşırı yüklenebilir (yani, farklı parametre türlerine sahip oldukları sürece birkaç yöntem için aynı yöntem adına sahip olabilirsiniz).
Integer.parseInt("10");
Integer.parseInt("AA", 16);