Sınıf yapıcılarını genişletmede 'süper'in yanlış kullanımı

Süper olanın ne yaptığını anladığımı düşündüm, ancak aşağıdaki kodda neden olduğunu anlayamıyorum.

class test {
    int i;

    test(int i){
    this.i = i;
}

}    
class testSub extends test{ 

    testSub(int i) {
        super(i);
    }

    /*testSub(int i) {
        this.i = i;
    }*/
}

İkinci kurucu (görevlendirilmiş) neden işe yaramaz? aynı şeyi yapıyor ..

Her türlü açıklama için teşekkür ederiz :)

EDIT: Herkese teşekkürler - üzgünüm daha fazla cevabı işaretleyemiyorum. Ayrıca bu bir düzenleme olmamalıysa da özür dilerim.

Hızlı özet: testSub ebeveyn testinin çocuğu olduğundan, kurucu aynı şeyi yapsa bile, çocuğun ebeveyn bölümünden oluşması gerekir. Yalnızca testin varsayılan kurucusu olsaydı, bu mümkün olurdu. Doğru anlamadıysam, lütfen cevap ver.

1

7 cevap

Sınıfınızın yapıcısı, üst sınıf yapıcılardan birini her zaman arayacaktır.

çağrısını super ile (yapıcının ilk talimatı) yapılan çağrı yapabilir ve bu durumda hangi kurucuyu arayacağınızı seçebilirsiniz.

Açıkça super kullanmazsanız, varsayılan (parametresiz) yapıcıyı kullanmaya çalışır. Ama senin süper sınıfın yok, o yüzden derleme konusunda başarısız olacak.

En kolay çözüm, üst sınıfınızdaki parametresiz kurucuyu açıkça beyan etmektir. Bununla birlikte, mümkün olduğunda ana yöntemleri kullanmak her zaman daha iyidir, bu nedenle, sonuç aynıysa, super (i) kullanarak daha şık olur.

1
katma

test sınıfınızın açık bir yapıcısı var. Bu kurucuyu her alt sınıfın kurucusunda kullanmalısınız.

test açık bir yapıcıya sahip olmasaydı, hiçbir argüman içermeyen örtük bir yapıcı oluşturulur ve bunu alt sınıfta açıkça çağırmanız gerekmez. Bu durumda, ikinci kurucunuz tamamen geçerli olur.

class test {
    int i;
}

class testSub extends test{ 

    testSub(int i) {
        this.i = i;
    }
}
1
katma

test sınıfınızın açık bir yapıcısı var. Bu kurucuyu her alt sınıfın kurucusunda kullanmalısınız.

test açık bir yapıcıya sahip olmasaydı, hiçbir argüman içermeyen örtük bir yapıcı oluşturulur ve bunu alt sınıfta açıkça çağırmanız gerekmez. Bu durumda, ikinci kurucunuz tamamen geçerli olur.

class test {
    int i;
}

class testSub extends test{ 

    testSub(int i) {
        this.i = i;
    }
}
1
katma

Hatanın size açıkça belirttiği gibi, bir temel sınıf kurucusunu mecbur etmelisiniz , yoksa temel sınıf oluşturulmaz.

Temel sınıf kurucu ile aynı şeyi yapmak yeterli değildir; aslında onu aramalısın.

Temel sınıf parametresiz bir kurucuya sahipse (örneğin, herhangi bir yazı yazmazsanız sağlanan varsayılan kurucu), onu dışarıda bırakabilirsiniz ve derleyici otomatik olarak arayacaktır.

0
katma
@ Turing85: Eklendi.
katma yazar SLaks, kaynak
@ Raven221221221: Sonuncusu.
katma yazar SLaks, kaynak
Herhangi bir kurucu sağlamadığınız sürece, Java'daki her sınıfın parametresiz varsayılan bir kurucuya sahip olduğunu belirtmek isteyebilirsiniz. Gerçek nedeni bu, kodun başarısız olması: test parametresiz bir kurucu sağlamıyor.
katma yazar Turing85, kaynak
Üst sınıf için yapıcıyı çağırmam gerektiğini söylediğinizde, Java'nın tasarlanma şekli bu mu, yoksa işlevsellik açısından bir şey mi eksik? Çünkü süper (i) dedikten sonra, örnek değişkenleri yine de değiştirebilirim. Veya bir çocuk sınıfı sadece ebeveyn + eklemeler - bu yüzden süper kurucu gerekli midir? Bu anlaşılabilir değilse üzgünüm ..
katma yazar Raven221221221, kaynak
Harika - teşekkürler :)
katma yazar Raven221221221, kaynak

Aynı şeyi yapmak aynı şey olmakla aynı şey değildir. Derleyici, süper olanın ne yapması gerektiğine dikkat ettiğinizi kontrol etmeyecek. Sadece gerektiğinde aradığın konusunda ısrar edecek.

0
katma

Aynı şeyi yapmak aynı şey olmakla aynı şey değildir. Derleyici, süper olanın ne yapması gerektiğine dikkat ettiğinizi kontrol etmeyecek. Sadece gerektiğinde aradığın konusunda ısrar edecek.

0
katma

Aynı şeyi yapmak aynı şey olmakla aynı şey değildir. Derleyici, süper olanın ne yapması gerektiğine dikkat ettiğinizi kontrol etmeyecek. Sadece gerektiğinde aradığın konusunda ısrar edecek.

0
katma