2011-06-06 5 views
11

Finallerim için çalışırken, şu an okuduğum kitapta şu ifadeye rastladım. Aşağıdaki kodu düşünüldüğünde:Java devralma - yapıcılar

class A { 
    public A(int x) { } 
} 

class B extends A { 
    public B(int x) { } 
} 

zorunlu sınıf B (süper (x)) arasında yapıcı sınıf A yapıcısı aramak. Kitap zorunlu olmadığını, çünkü bunların tam sayı ve tip parametrelerine sahip olduklarını belirtiyor. Bir java derleyici bu deneyin zaman, aşağıdaki hata atılan: Sınıf A

yapıcı bir olamaz verilen tiplerine uygulanan olmak; Gerekli: int bulundu: hayır argümanlar nedeni: fiili ve resmi argüman listeleri uzunluğu

+2

Kitap yanlış. – Bohemian

cevap

17

derleyici otomatik olarak başlangıçta super() ekler farklıdır.

Ancak, daha kurucular argümanlar, (bağımsız değişkenler olmadan) super() üst sınıf varsayılan kurucu çağırır olan ilave edilir. Ve bir tane yok, dolayısıyla hata.

super(x) (A(x) numaralı telefonu çağırmak için) ya da argüman olmayan bir kurucu tanımlamanız gerekir.

Örtülü süper kurucu A() tanımsız: Bu arada

Eclipse derleyici bir şekilde daha iyi hata mesajı verir. Başka bir yapıcıyı açıkça çağırması gerekir

+0

Bu satırda hata atıldı: "public B (int x) {}". Sorguda yayınladığım kod, derlemeye çalıştığım tüm koddur (yalnızca sınıf tanımı, hiçbir örnekleme yok). –

+0

Sadece 'super() 'yazacaktır. Süper (int) 'yi eklemez. İşte buradaki hata. Bu durumda, süper (x) 'yi çağırması gerek. Bkz. Http://download.oracle.com/javase/tutorial/java/IandI/super.html. – MGwynne

+0

@MGwynne evet, güncellendi – Bozho

1

Bu, varsayılan bir kurucunuz olmadığında ve varsayılan bir örnek oluşturuyorsanız gerçekleşir. Çünkü herhangi bir Parameterized kurucunuz varsa, derleyici sizin için varsayılan olanı koymaz, bunun yerine tanımlamanız gerekir.

4

derleyici kullanılabilir olmadığını hangi super() ile süper sınıf varsayılan yapıcı bir çağrı oluşturmaya çalışır gibi görünüyor: Kitabınızın geri

required: int 
found: no arguments 

Ama: Ben bir kural duymadım o Gerçek yapıcı, doğrudan üst sınıfta bir yapıcı olarak tam olarak aynı parametre listesine sahipse, super ifadesini bir kurucuda atlayabilirsiniz. Yalnızca üst sınıfın varsayılan yapıcısına yapılan bir çağrı örtülü olarak eklenir (super()) ancak bu, numaralı sınıfın varsayılan bir kurucuya sahip olmasını gerektirir. Bir yapıcı vücut açık bir kurucu ile başlamıyorsa

: Kitabınızda yazanlara aksine

(veya yazılı metnin anlayışınız aksine), burada dil spec bir cümle var çağırma ve ilan edilen yapıcı ilkel sınıf Nesne parçası değil, daha sonra yapıcı vücut örtülü bir süper sınıf yapıcı başlatılmasıyla “super();” başlamak için derleyici tarafından kabul edilir, yapıcı bir çağırmayı hiçbir argüman almayan doğrudan süper sınıfı nts.

4

Bir temel sınıf Eğer B uzatmak zaman, varsayılan bir kurucu (-arg yapıcı) sahip varsa, herhangi bir şekilde denir çünkü açıkça super() aramaya gerek yoktur. Eğer bağımsız değişken içeren bir kurucuya sahip olduğunda B yılında parametrelerle contructor yaparken

Ama, A

örneğin super() bir parametre geçmek gerekir: Bu gerekli olan

class A { 
    public A(int x) { } 
    } 

    class B extends A { 
    public B(int x) 
    { 
     super(x); // need to specify the parameter for class A 
     //... 
    } 
    } 
0

Java durumunda süper sınıf yapıcı aramak için. Bu nedenle, alt sınıfın oluşturucusunu oluşturduğunuzda, süper sınıf 'kurucusu IDE tarafından yaratılır.

Çünkü temel sınıf yapıcısı argüman isterse, derleyici temel sınıf kurucusu tarafından doldurulacağını düşünür. Varsayılan kurucu durumunda, sorun yok. Alt sınıfta super() aramaya gerek yoktur.