search
Giriş
Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın Türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi
0 oy
672 gösterim
Method override ile hiding arasındakı fark nedir bunu tam anlayamıyorum?
Java kategorisinde 102 puan

1 cevap

0 oy

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

public class Animal {
    public static void foo() {
        System.out.println("Animal");
    }
}

public class Cat extends Animal {
    public static void foo() {  // hides Animal.foo()
        System.out.println("Cat");
    }
}

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.


public class Main {
	public static void main(String[] args) {
		System.out.print("Animal ->"); 
		Animal.foo(); // prints Animal
		System.out.print("Cat ->");
		Cat.foo(); // prints Cat
		Animal a = new Animal();
		Animal b = new Cat();
		Cat c = new Cat();
		Animal d = null;

		System.out.print("Animal a = Animal ->");
		a.foo(); // Yapmayın
		System.out.print("Animal b = Cat ->");
		b.foo(); // Yapmayın
		System.out.print("Cat c = Cat ->");
		c.foo(); // Yapmayın
		System.out.print("Null d ->");
		d.foo(); // Yapmayın
	}
}

Çalıştırdığımız zaman çıktı.

Animal ->Animal
Cat ->Cat
Animal a = Animal ->Animal
Animal b = Cat ->Animal
Cat c = Cat ->Cat
Null d ->Animal

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.

public class Main {
  public static void main(String[] args) {
    System.out.print("Animal ->");
    Animal.foo();
    System.out.print("Cat ->");
    Cat.foo();
    Animal a = new Animal();
    Animal b = new Cat();
    Cat c = new Cat();
    Animal d = null;
    System.out.print("Animal a = Animal ->");
    Animal.foo();
    System.out.print("Animal b = Cat ->");
    Animal.foo();
    System.out.print("Cat c = Cat ->");
    Cat.foo();
    System.out.print("Null d ->");
    Animal.foo();
  }
}

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/

6.2k puan
düzenledi

İlgili sorular

0 oy
1 cevap 7.2K gösterim
7.2K gösterim
Overload eden metodlar ile override eden metodlar arasındaki fark nedir? Polimorfizmayla alakaları nedir?
6 Kasım 2017 Genel Kavramlar kategorisinde yildiz 193 puan sordu
0 oy
1 cevap 600 gösterim
600 gösterim
Sürekli java ve javascript programlama dillerinden bahsediliyor. Bu iki dil aynı mıdır? Arasında fark var mıdır? Neden java? Neden javascript?
24 Ocak 2022 Java kategorisinde kenan 6.2k puan sordu
0 oy
1 cevap 374 gösterim
374 gösterim
Maven ile çalışırken genellikle insanlar "mvn clean install" diyor. Bazı arkadaşlar da "mvn clean compile" daha iyi olduğunu söylüyor. Arasındaki fark nedir?
31 Ağustos 2021 Java kategorisinde kenan 6.2k puan sordu
0 oy
1 cevap 464 gösterim
464 gösterim
Bugün öğrenmem lazım bu ikisi arasındaki fark nedir. Dinamik programlama da fibonaci örneğini çözmem gerekiyor yardımcı olabilecek varmı
17 Ağustos 2018 Java kategorisinde JavaBey 102 puan sordu
1 oy
1 cevap 648 gösterim
648 gösterim
Java da Double.parseDouble ile Double.valueOf arasındaki fark nedir?
16 Ağustos 2018 Java kategorisinde asefat 141 puan sordu