Method override ile hiding arasındakı fark nedir bunu tam anlayamıyorum?
comments
1 references
// Comments are closed.
Method override ile hiding arasındakı fark nedir bunu tam anlayamıyorum?
// Comments are closed.
Zamanında okumuş olabilirim, ama pratikte sanıyorum hiç kullanmadım.
Soruyu okuyunca birkaç döküman okudum.
Method overriding ne demek zaten biliyoruz, açıklama
Method hiding diye okuyunca ilk aklıma gelen herhalde overridding yaparak methoda ait erişim belirleyiciyi değiştiriyoruz (public -> private) bu şekilde saklıyoruz olarak düşündüm. Ama kaynaklarda bu şekilde olmadığını gördüm.
Şu linkte güzel bir açıklama var.
https://stackoverflow.com/a/16313742
Kendi anladığım şekilde açıklayayım
Bu sınıfların içinde tanımlı static metodlar var ve aşağıdaki kod parçasında bu static metodları olması gerektiği gibi Sınıf.Method değil de Instance.Method çağırırsak olaylar biraz değişmeye başlıyor. Tercih/tavsiye edilen Sınıf.method şeklinde çağırmak olduğunu unutmayalım.
Çalıştırdığımız zaman çıktı.
Normalde metodlarımız static değil de normal metod olsaydı Animal a = Cat diye tanım yaptıktan sonra a.foo() çağırdığmızda ekrana Cat yazmalıydı. Neden çünkü instance üzerinden çağrılacaktı ve alt sınıfta (Cat) override edilecekti. O yüzden davranışı değişecekti.
Peki burada ne olmuş. Animal a = Cat satırdaki eşitliğin sol tarafı Animal olduğu için ve çağrılan metod static olduğu için sol tarafta tanımlı olan Animal sınıfının static metodunu çağırıyor. Benim beklentim aslında override olduğu için yine Cat sınıfındakini çağırması yönündeydi. Ama anlaşılabilir bir yaklaşım.
Asıl beni şaşırtan d.foo çağırdığın zaman normalde d = null olduğu için null pointer exception alması gerekiyor. Ama direk Animal.foo metodunu çağırıyor.
Bunun nedenini anlamak için kodu derledikten sonra class dosyasından decompile ettim. Sonuç aşağıdaki gibi.
Biraz dallandı 🙂
Sonuç static metodların davranışlarını override etme işlemine hiding deniyor gibi düşünüyorum. Aklıma başka birşey gelirse yazarım.
İyi çalışmalar,
https://www.baeldung.com/java-variable-method-hiding
http://java-decompiler.github.io/