Arkadaslar selam.Benim 1 sorum var size.bu kodu derledigimde b 13 cikiyor.ancak cevabi b3 gibi gosteriyor.neden?

31. class Foo {

32. public int a = 3;

33. public void addFive() { a += 5; System.out.print(“f “); }

34. }

35. class Bar extends Foo {

36. public int a = 8;

37. public void addFive() { this.a += 5; System.out.print(“b ” ); }

38. }

Invoked with:

Foo f = new Bar();

f.addFive();

System.out.println(f.a);

What is the result?

soruldu: 01 Haz '12, 02:33

hale's gravatar image

hale
127343642
cevap kabul oranı: 0%

değiştirildi: 01 Haz '12, 13:10

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183

2

Lütfen sorunuza uygun baslik seciniz! Boylece herkes icin anlasilir olur sorulariniz.

(01 Haz '12, 04:48) CemIkta ♦ CemIkta's gravatar image
(01 Haz '12, 11:41) CemIkta ♦ CemIkta's gravatar image

Bu soruda java'da inheritance ve polymorphism kavramları ele alınmış, java'da instance variable'lar yani bu örnekte "a" polymorphic değildir, sadece metodlar (static olmayan) polymorphic olabilir. Şöyle açıklamaya çalışayım Foo class'ı Bar class'ının super class'ıdır. İkisinde de public a değişkenleri tanımlanmıştır. Foo f = new Bar() kod satırı ile de polymorphism gerçekleştirilmiştir. Yani Bar() nesnesi oluşturulmuştur ancak bu nesneye Foo ile erişilmektedir, yani Foo hangi metodlara sahipse o metodlar çalıştırılabilir, buraya kadar sanırım herşey tamam. Kodda Bar sınıfı oluşturulduğunda Bar sınıfının a değişkenine 8 yazılır, ancak aynı zamanda inheritance gereği Bar'ın türemiş olduğu Foo sınıfına da Bar sınıfının constructor'ından bir implicit call yapılır, şöyle diyelim önce Foo sınıfının constructor'ı çalıştırılır ardından Bar sınıfının constructor'ı çalıştırılır, şimdi buradaki örnekte constructor'lar özel bir şekilde tanımlanmamış, burada default constructor'lar yine de çağrılır, bu sadece konuyu biraz daha açmak için verdiğim bir bilgiydi. Söylemeye çalıştığım Bar sınıfı oluşturulduğunda tam anlamıyla olmasa da bir Bar sınıfının bir parçası olarak Foo da oluşur, şimdi bunu Bar çağırınca bir tane de Foo instance oluşturulur şeklinde düşünmemek gerek, bunlar birlikte ve bütün olarak düşünülmeli. Siz bu oluşan instance'a Foo olarak davranmak istediğinizi zaten Foo f diyerek belirtmiştiniz. Gelelim addFive() metodu çağrılınca ne olmakta, addFive() metodu Bar sınıfının public olan instance variable'ına 5 eklemektedir, Bar sııfının instance'ının a değişkeni başta 8 almaktadır, dolayısıyla buna 5 eklerseniz 8+5=13 olur. Peki burada da sıkıntı yok, o halde f.a'yı print ettiğimde neden 13 değil de 3 görüyorum, çünkü biz nesnemize Foo olarak erişmek istedik, Foo sınıfının a public değişkeninin değeri 3 tür, f.a dediğimizde ise Foo'nun public instance variable'ına erişmiş olduk, eğer 13 ü görmek istiyorsak System.out.println( ((Bar)f).a+""); şeklinde kullanmamız gerekirdi, o zaman Bar olan instance'ın a public değişkenine erişmiş olurduk. Aslında burada instance variable shadow denen olay gerçekleşmiş oldu, bizim asıl erişmek istediğimiz gölgelenmiş olduğu için onu göremedik, onu görmek için yukarıdaki gibi bir kod gerekir. Olayın biraz karmaşık olduğunun farkındayım biraz daha netleştirebilmek açısından ufak bir çizim ile göstermeye çalışayım

|--------------------------------------------|
|          Bar                               |
|          a                                 |
|    |---------------------------------|     |
|    |   Foo                           |     |
|    |   a                             |     |
|    |   addFive()                     |     |
|    |---------------------------------|     |
|                                            |
|      addFive()                             |
|--------------------------------------------|

Yani türemiş olan nesne oluşturulunca bu nesne türediği sınıfın da bir örneğini içinde barındırır. Buradaki gösterim memory'de tamamen böyle değildir, temel sınıf türemiş sınıfın içinde değildir. Ne demiştik metodlar polimorphic 'tir, o nedenle bu nesnede bir tane addFive() vardır, sadece bir tane addFive() çalışır ama iki tane public instance variable olan "a" vardır, çünkü instance variable'lar polymorphic değildir. Yani gidip Foo'nun addFive() metodunu ((Foo)f).addFive() olarak çağıramazsınız o metod zaten override edildiğinden yine Bar sınıfındaki implementasyon ne ise o çalışır, hata vermez.

System.out.println( ((Bar)f).a+"") dersek 13 görürüz, inheritance'da bu örnekte bir instance variable shadow durumu ortaya çıkmıştır. Çıktı "b 3" olacaktır.

permanent link

cevaplandı: 01 Haz '12, 04:32

nht's gravatar image

nht
95651720
cevap kabul oranı: 33%

Cok sagolun.Cok guzel anlatmissiniz.Tesekkurler.

(01 Haz '12, 10:04) hale hale's gravatar image
1

Cevap olarak kabul ederseniz cevaplanmamış sorular arasından çıkmış olur.

(01 Haz '12, 10:41) Tunahan Pehlivan Tunahan%20Pehlivan's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,076

Soruldu: 01 Haz '12, 02:33

Görüntüleme: 680 kez

Son güncelleme: 01 Haz '12, 15:44

powered by BitNami OSQA