Merhaba.Kodun sonucu 0 4.kodu inceleyin sorumu en sonra yazıyorum

public class A {

   A(){
       print();
   }

   void print(){
       System.out.println("A");
   }  
}

public class B extends A{
    int i = 4;
    public static void main(String[] args) {
        A a = new B();
        a.print();
    }
    void print(){
        System.out.println(i);
    }
}

ama bir türlü çözemedim olayı.new B() dediğimiz zaman A()-nın constructor-u çağrılıyor.tamam.sonra A classının contructor-unda A-nın printi çağrılıyor.Override olduğu için B-deki print çağrılmış oluyor.A-nın contructoru daha run olub bitmemiş.Yani B-nin objesi hakkında şu anda konuşamayız o zaman i değişkeni hakkında da konuşamayız.Peki i-yi nasıl çağırıyor?

soruldu: 13 Şub '15, 02:03

Serxan's gravatar image

Serxan
51691106107
cevap kabul oranı: 46%

değiştirildi: 13 Şub '15, 02:07


B sınıfından instance oluştuğu için Dediğinin tam aksine B sınıfından söz etmeliyiz OOP'in doğası gereği super classlar ilk çalışır. B ile instance olmuş bir sınıfta ezilecek metod varsa ezilir Yani şöyle diyeyim A'nın yapılandırıcısında print() çalışırken aslında A sınıfı B ile instance olmuştur. yani print metodu ezilmiştir. doğal olarak i de oluşmuştur . Debug ile gidersen i'nin ne zaman oluştuğunu anlarsın :) alt text

Kolay Gelsin

permanent link

cevaplandı: 13 Şub '15, 06:55

Mehmet%20KILIC's gravatar image

Mehmet KILIC
51191422
cevap kabul oranı: 20%

"A-nın contructoru daha run olub bitmemiş.Yani B-nin objesi hakkında şu anda konuşamayız o zaman i değişkeni hakkında da konuşamayız." cümlesinde aslında yanıldığını izah etmeye çalışacağım. Constructor çalışmasını bitmemiştir olmasına rağmen B yaşamaya başlamıştır. Kodları aşağıdaki gibi parçaladığımızda daha anlaşılır olacaktır.

public class A {

   A(){
        System.out.println("A Constructor Çalıştı");
       print();
   }

   void print(){
       System.out.println("A");
   }  
}

public class B extends A{

    B()
    {
        System.out.println("B Constructor Çalıştı");
    }
    int i = 4;

    void print(){
        System.out.println(i);
    }
}

public class C {
     public static void main(String[] args) {
        A a = new B(); // satıra break point koyalım ve debug edelim
        a.print();
    }
}

Main metodu içerisinden A a = new B(); kodun olduğu satıra breakpoint koyup debug ile inceleyeyim. İlk önce B class ının contructor una gidecek ve hemen peşinden A class' ın constructoru çalışacaktır. Yani Aslında B oluşmuştur ve hemen ardından A'yı oluşturmaya gitmiştir. Ekran çıktısı aşağıdaki gibi olacaktır ilk planda ekran çıktısına bakarsak yanılırız bu nedenle debug ile adım adım ilerlersek çok daha anlaşılır olacaktır.

A Constructor Çalıştı
0
B Constructor Çalıştı
4

şimdi B class ını senin için daha okunaklı hala getirelim.

public class B extends A{

    B()
    {
        super();
        System.out.println("B Constructor Çalıştı");
    }
    int i = 4;

    void print(){
        System.out.println(i);
    }
}

Yukarıdaki kod parçasına dikkat ettiyse super(); kod parçası eklendi.Yani extend olunan class'ın constructorunu çalıştırmasını istedim. Debug ile takip ettiğinde B nin constructoruna girdiğinde direk bu satıra konumlanacaktır. Yani önceki kodumuzda super(); yazmamıştık ama derleyici otomatik olarak orda super(); varmış gibi onu çağırmıştır.

Özetle: Miraslama yaparken B'yi oluşturma aşamasında ata sınıfı olan A'nın özelliklerini alır.

İyi çalışmalar.

permanent link

cevaplandı: 13 Şub '15, 07:17

M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Müslüm ÖZTÜRK
10.5k103690
cevap kabul oranı: 27%

Merhaba, int i ifadesi ile i değişkeni primitive integer olarak oluşturuluyor. Primitive integer değişkinin ilk değeri 0 olarak oluşturulur. Eğer Integer şeklinde Object olarak oluşturulsaydı sonuç "null" olurdu çünkü obje tipindeki değişkenler de "null" değeri ile oluşturulurlar.

Bu kodda A nın constructor ı çalışırken B içindeki i değişkini oluşturulmuş oluyor zaten ve değeri 0. 4 değerini A nın constructor u tamamlandıktan sonra alıyor. B sınıfına

B(){
    super();
    print();
}

şeklinde bir constructor eklerseniz farkı göreceksiniz.

permanent link

cevaplandı: 13 Şub '15, 03:38

mceliksoy's gravatar image

mceliksoy ♦
6.5k84988
cevap kabul oranı: 25%

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
×6

Soruldu: 13 Şub '15, 02:03

Görüntüleme: 499 kez

Son güncelleme: 13 Şub '15, 07:17

powered by BitNami OSQA